WordPress を扱う上で憶えておいて欲しい3つのesc #wacja2012

わんばんこ。2012 WordPress アドベントカレンダーの3日目をむゆうさん( @anticyborg )と共に担当させていただきます。本当は、アドベントよりおべんt(以下略

WordPress で実現系のコードを紹介する記事は、よく目にしますし、セキュリティに関する関心も高いようですが、意外に基本的な所が抜け落ちているケースが多いように感じたので、テーマやプラグイン開発時に憶えておいて欲しい WordPress 関数、esc_htmlesc_attresc_url について、つらつらと書いてみたいと思います。

“WordPress を扱う上で憶えておいて欲しい3つのesc #wacja2012” の続きを読む

WordPress のメディア表示をアップロードしたユーザーのみに限定する

WordPress で、サイトによっては、自分のアップロードした画像しか利用させたくない場合などもありますよね。
そんなときでも、ちょこっとカスタマイズするだけで、メディアライブラリで表示されるものを制限できることができてしまいます。

“WordPress のメディア表示をアップロードしたユーザーのみに限定する” の続きを読む

カスタム投稿タイプのアーカイブ表示で、カスタム分類での絞り込み検索を行う

Webサイト上で絞り込み検索ができるようにしたい」というのは比較的よくある要望だと思います。そんな場合どうしてますか?カスタム投稿タイプだったら、アーカイブ表示の際に、少々工夫すれば絞り込みを行うことができてしまうのです。

WordPress では、パーマリンクの設定如何に関わらず、?cat=5 などといったパラメーターを追加すると絞り込みが可能となっています。(なので、カテゴリー内でのテキスト検索といったことも簡単に可能なんですよ?)
このため、フォームの method 属性を get にしておけば、比較的簡単に絞り込みができてしまうのですが、この場合、アドレス欄にパラメーターがずらずら並んでしまってクライアント受けが良くないのと、チェックボックスによる複数項目での検索に対応しづらいのが難点です。

これを post で投げて、アドレスはそのままで絞り込み検索、さらにはページ送りにも対応させてしまいましょう。

“カスタム投稿タイプのアーカイブ表示で、カスタム分類での絞り込み検索を行う” の続きを読む

パーマリンクの %category% の出力条件を変更してみる

パーマリンク設定に %category% が含まれていた場合、カテゴリーのIDが若いものを元にして表示するURLが構成されるのはご存じでしょうか。
まあ、知らなかった方は、そうなっているので、「なるほどですねー。」と一言、頭に刻み込んでおいてください。

ただし、カテゴリーに 拙作 PS Taxonomy ExpanderMy Category Order などを使っていたりすると、この指定した順列に従って欲しいということもあるのではないでしょうか。

そんなときは、CODE 1 で一発解消!!

といきたいところですが、大きな問題点がっ。

両プラグインとも、同一階層内での順列情報のみしか持っていないため、階層が異なったり、異なる親カテゴリーだと自由な設定ができません。
そんな場合は、_usort_terms_by_order 関数内の term_order をスラッグ(slug)や説明(description)に変更すれば、他の要素での並び替えも出来るかと思いますので、自由にカスタマイズしてみてください。

CODE 1

function category_permalink_orderby_order( $permalink, $post, $leavename ) {
	if ( strpos( $permalink, '%ordered_category%' ) !== false ) {
		$cats = get_the_category( $post->ID );
		if ( $cats ) {
			usort($cats, '_usort_terms_by_order');
			$category = $cats[0]->slug;
			if ( $parent = $cats[0]->parent )
				$category = get_category_parents($parent, false, '/', true) . $category;
		}

		if ( empty($category) ) {
			$default_category = get_category( get_option( 'default_category' ) );
			$category = is_wp_error( $default_category ) ? '' : $default_category->slug;
		}
		$permalink = str_replace( '%ordered_category%', $category, $permalink );
	}
	return $permalink;
}
add_filter( 'post_link', 'category_permalink_orderby_order', 10, 3 );


function category_order_permalink( $permalink ) {
	$permalink = str_replace( '%category%', '%ordered_category%', $permalink );
	return $permalink;
}
add_filter( 'pre_post_link', 'category_order_permalink' );


function _usort_terms_by_order( $a, $b ) {
	if ( $a->term_order > $b->term_order )
		return 1;
	elseif ( $a->term_order < $b->term_order )
		return -1;
	else
		return 0;
}

プラグインでバージョン情報を使いたいときは、get_file_data を用いるととってもエコなのよ

こんにちは、こんにちは!ぼく、はm

WordPress のプラグインでプラグイン自体のバージョン情報を利用したいときに便利な方法という、なんともニッチな技法の紹介です。

たまに、プラグイン内でプラグインのバージョンを定義していたりしますが、これだと、うっかりバージョン番号を変更し忘れることが多々発生します。(ぼけっち!)

このようなアルツh・・もとい、うっかりなすびな方は、プラグインファイルに書いているであろうコメントのバージョンを利用しちゃうと便利です。

WordPress では get_file_data という関数を使うと一発で、これらファイル内の記述から該当する記述をパースして配列で取得できる超絶便利なシロモノがあります。

get_file_data はパラメーターを2つ指定する必要があり、最初がファイルのパス、2つ目が取得したデータのキーと指定名を配列で指定します。プラグインのデータを取得する get_plugin_data では、パラメーターとして、下記の配列が使われていますので、計9パラメーターが WordPress 側で認識可能ということになります。(_sitewide は、Networkパラメーターと同義で非推奨)

$default_headers = array(
	'Name' => 'Plugin Name',
	'PluginURI' => 'Plugin URI',
	'Version' => 'Version',
	'Description' => 'Description',
	'Author' => 'Author',
	'AuthorURI' => 'Author URI',
	'TextDomain' => 'Text Domain',
	'DomainPath' => 'Domain Path',
	'Network' => 'Network',
	// Site Wide Only is deprecated in favor of Network.
	'_sitewide' => 'Site Wide Only',
);

これをちょっとひねって、プラグイン内で自プラグインのバージョンを用いる場合は、下記のように記述できるかと思います。

$data = get_file_data( __FILE__, array( 'version' => 'Version' ) );
$version = $data['version'];

なお、取得できるデータはファイルの冒頭よりファイルサイズで 8kバイト の範囲内になりますので、データ部分はファイルの最初に書いておきましょうね。