Category Archive: WordPress

[WordPress小ネタ] ソーシャルボタンのリンクURL生成でよく使うネタ

使う頻度がわりとあるのでメモとして。

global $post;
$url = get_permalink($post->ID);
$enc_url = urlencode($url);
$title = get_the_title($post->ID) . ' | (短めのサイト名)';
$enc_title = rawurlencode($title);

$link_twitter  = 'http://twitter.com/intent/tweet?text='.$enc_title.'&url='.$enc_url;
$link_facebook = 'http://www.facebook.com/sharer.php?u='.$enc_url;
$link_hatena   = 'http://b.hatena.ne.jp/entry/'.$enc_url;
$link_line     = 'http://line.me/R/msg/text/?'.$enc_title.'%20'.$enc_url;

[WordPress小ネタ]時限公開リンクのショートコード

指定期間を過ぎたらリンクタグのみ除外したい、という要望があったので作ってみた小ネタ。
キャッシュプラグインやnginxでページキャッシュを有効にしている場合は、取下げ時刻にキャッシュクリアする必要があるのでご注意ください。

■使用例

*中のテキストもまるごと取り下げたい
[limit_link href="http://www.google.com" end="2016-03-05 01:51:00"]サンプルテキスト[/limit_text]

*リンクだけ取り下げたい+別ウィンドウで開く
[limit_link href="http://www.google.com" end="2016-03-05 01:51:00" target="_blank" text="show"]サンプルテキスト[/limit_link]

function custom_shortcode_limit_link( $atts, $content = null ) {
	extract( shortcode_atts( array(
		'href'   => 'http://example.com/',
		'target' => '_self', 
		'end' => '2015-12-31 23:59:59',
		'text' => 'hide'
	), $atts ) );
	
	$now = date_i18n('U'); // 現在の時刻
	$expire_date = date('U',strtotime($end)); // 取り下げ時刻
	
	if($expire_date >= $now) {
		// リンク掲出期間中
		return '<a href="' . esc_html($href) . '" target="' . esc_html($target) . '">' . esc_html($content) . '</a>';
	} elseif ($text === 'show') {
		// 掲出終了後、テキストは表示する場合
		return esc_html($content);
	} else {
		// 掲出終了後、丸ごと消す場合
		return;
	}

}
add_shortcode('limit_link', 'custom_shortcode_limit_link');

[WordPress小ネタ] メディアファイルのアップロード時に自動付与されるタイトル・キャプションを空欄で登録する機能

function media_upload_default( $post_ID ) {
    $args = array( 
                    'ID'           => $post_ID, 
                    'post_title'   => '', 
                    'post_excerpt' => '', 
                    'post_content' => '', 
            );

    wp_update_post( $args );

}
add_action( 'add_attachment', 'media_upload_default' );

下記サイトを参考にしました。

How can I add a default description to uploaded files?
http://wordpress.stackexchange.com/questions/121709/how-can-i-add-a-default-description-to-uploaded-files

MovableType形式のエクスポートファイルをWordPressへ正常にインポートできない事象のひとつの原因、その対策

ライブドアブログからWordPressへ記事を移行するお仕事があり、MT形式のエクスポートファイルをインポートすると、管理画面上では問題なく完了したように見えて実は複数の記事が登録されていなかった事があったので、その原因と対策をメモします。

困ったこと

ライブドアブログやTypePadなど、MovableType形式のブログから書き出した記事をWordPressへインポートすると、件数が多くても少なくても、エラー表示が無いまま完了画面が表示されるものの、特定の記事の取込みが必ず失敗する。
インポートに使用するプラグインは「Movable Type and TypePad Importer

原因

プラグイン側の設定により、1行あたりの容量が8192(-1)バイトに制限されているため、記事内の長大な行を正常に処理できない

/wp-content/plugins/movabletype-importer/movabletype-importer.php
102〜106行目

function fgets($fp, $len=8192) {
	if ( $this->has_gzip() )
		return gzgets($fp, $len);
	return fgets($fp, $len);
}

対策

  • エクスポートファイルに、改行タグなどの位置で適度な改行を加える
  • $len=8192 の数値を適度に大きくするか、またはlengthを指定しない

備忘録: 日本語キーワードに基づいたリンクを本文中に自動設定するWordPressプラグインを試してみる

以下の要件で、キーワードに基づいたリンク設定を本文中で自動的に行うプラグインをあれこれ使って探してみたので、結果をメモしておきます。

  • 管理画面上でキーワード・URLの設定ができる。
  • 日本語キーワードが使える。
  • 本文中に複数存在する場合、最初だけリンク設定する。
  • いつでも使用終了できるよう、投稿内容自体の書換は行わない。

WordPress公式プラグインディレクトリにて非公開(または却下)になっているもの

  • WP Keyword Link(2015.09.21現在非表示になっている)

WordPressの仕様変更による動作不全、日本語非対応などのため使用不可

  • Affiliate Link Builder
  • Auto Affiliate Links
  • Automatic SEO Links
  • SEO Content Links
  • SEO Smart Links
  • Keyword to URL
  • WP KeyLink

投稿内容の書換が必要

日本語対応だけど最初の1つに限定できない

要件を満たすもの

編集者権限ユーザがWP-Pollsの更新を行えるようにする小ネタ

WP-Pollsは管理者のみ更新可能なので、必要に迫られて編集者でも更新できるようにした際の小ネタ。
プラグイン本体を修正するのはおっかないので、functions.php に追記する方法をとります。

参考サイト

functions.php に追記する内容

function add_wp_polls_caps(){
	$role = get_role('editor');
	if(!$role->has_cap('manage_polls')) {
		$role->add_cap('manage_polls');
	}
}
add_action('admin_init', 'add_wp_polls_caps');

livedoor blogからWordPressへ移転する際のパーマリンクに関するメモ

ライブドアブログからWordPressに記事を移転するお仕事した際、なるべくURLを変えたくないなーと思ったのでやってみた作業メモ。

  1. 下準備
  2. WordPress側の設定
    • パーマリンク設定: /archives/%postname%.html
  3. インポート
    • WordPressは、標準でMT形式のインポート機能を追加できる。[ツール > インポート]
    • 環境によっては非常に時間がかかる。
      取込み試験を行ったさくらスタンダードでは、1件につき5秒くらい。ローカル環境では、30分で300件ほど。
    • 取り込んだ後、URLが従前と同じ形式が確認してみる。
  4. ライブドアブログ側のコメントを閉じる。
  5. DNS設定を変更し、移転完了。

パーマリンクの様式をなるべく引き継いだ場合、ひとつ面倒くさくなるのがスラッグの設定。
インポート時、ライブドアブログの記事IDを post_id にできないかといろいろやってみたのですがうまくゆかず、通常通り postname に収めることになったのですが、パーマリンクを post_id ではなく postname にすると、新規投稿を登録するたびにスラッグを設定する必要が生じます。
特に何も考えないと、今まで記事IDだった短いURLが、タイトルから再構成された長ーいものになってしまいます。しかし毎回固有IDっぽいのを割り当てるのも非常にめんどい。
スラッグへIDっぽい文字列を自動で割り当てられたら便利なので、下記サイトのコードを参考にしました。

WordPress の投稿スラッグを自動的に生成する | Simple Colors
http://www.warna.info/archives/2317/

私の場合はこんな塩梅に変更して functions.php に追記しました。

function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
	if ( $post_type == 'post' && $post_ID > 0 ) {
		$slug = 60000000 + intval($post_ID);
	}
	return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4  );

$post_type == ‘post’ の部分を入れておかないと、固定ページほかあらゆる投稿タイプでスラッグが自動入力されてしまいます。
投稿タイプがpostの場合、WordPressの記事IDに60000000を足した文字列をスラッグに登録します。
60000000は適当です。今現在のライブドアブログ側記事IDが52000000あたりなので、キリの言い数字でスタートすれば分かりやすいかなというふわっとした理由によるものです。
ライブドアブログ側での最終更新の記事IDにちょっと足した数値でも良いでしょう。

記事インポート時はスルーしたいため、 $post_ID > 0 も加えました。
インポート時、wp_insert_post() が動く際には記事IDが確定していないため、$post_idは 0 のままこのフィルタに渡されます。こうしておくとインポート時にはスルーされるようになります(多分)

以上、参考になれば幸いです。

WordPress4.1.1→4.1.2以降/4.2以降にアップデートすると新規投稿できない問題と解消方法のメモ

確認した事象

  • ちょっと古くから使っているWordPressのサイトにおいて、WordPress4.1.1から4.1.2以降へアップデートすると、新規投稿できない/既存記事を更新すると文字化けする。

原因っぽいこと

  • DBがujisのまま
  • DBはutf8だが、一部テーブルのCHARSETがujisのまま(textboxはこのケース)

確認しておくこと

  • DBのダンプデータをエディタ等で開き、「CHARSET=ujis」を検索する。問題が発生している場合、たぶん見つかる。
    (textboxの場合、25テーブル中10あった)

対処方法

  • 暫定措置

    下記フォーラムを参照。
    https://ja.forums.wordpress.org/topic/150103#post-208912
    WordPress4.2.1では2593行目を修正。
    https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-includes/wp-db.php#L2593

  • ここでやってみた対処方法

    フォーラムにはCHARSETを変換するのが良さそうとあったので、この際だからきちんとやってみる。

    • 作業前提
      • DBは charset utf8 にしてあった
    • やったこと
      • mysqldumpするかphpmyadminでエクスポート
      • 書き出したデータを開いて、CHARSET=ujis を CHARSET=utf8 に置換
      • utf8なDBを新たに作ってインポート
      • wp-config.php のDB設定を変更して再ログイン
      • 新規投稿できるか確認する

うまいこと投稿できるようになりました。ありがとうございました。

QuickCacheがZenCacheになった

Image 2015-03-16 at 3.05.36 午後

WordPressのキャッシュプラグイン「QuickCache」の有料版がとても便利なので、「QuickCache Proを使うべきn個の理由」みたいな記事をいずれ書こうと思ってたら、「ZenCache」になって価格設定が変わり、有料版を少し勧めづらくなってしまいましたが、今のお仕事では欠かせないプラグインです。

キャッシュの生成条件が柔軟で、UserAgentやCookieの値によって別々のキャッシュを生成できるので、端末や任意の機能による表示切替が容易に行えて便利です。
他のキャッシュプラグインは分からないのですが、 require(‘wp-load.php’); が入っている外のページもキャッシュしてくれます。

従前のライセンスを購入してる人は、自動的に3年間のUnlimited-Site Licenseが与えられてるので、ちょっとお得。

マルチサイト運用の場合、一部の不具合が残っているので、ZenCacheに移行する際はご注意ください。

あとこれも。

[WordPress小ネタ] 特定のタグを設定した時、投稿表示の前に確認文言を表示する

制約のあるコンテンツを表示する前に、確認事項の同意をとっておきたい時などに使えるかもしません。
single.php の the_content() の部分を下記の具合に変更し、

if(has_tag("foo")) {
	if(isset($_COOKIE["hogehoge"])) {
		the_content();
	} else {
		※ 確認文言 ※
	}
}

この確認文言の中のどこかに、下記のようなcookieをセットするJavaScriptを入れ、クリックを促します。

<a href="javascript:void(0);" onclick="document.cookie='hogehoge=1';location.reload();">確認事項に同意します</a>

きちんとcookieがセットされれば、the_content() が表示されるはず。

» サンプル