パーマリンクの %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バイト の範囲内になりますので、データ部分はファイルの最初に書いておきましょうね。

WordPress の投稿スラッグを自動的に生成する

WordPress のパーマリンク構造に %postname% が含まれていて、うっかりパーマリンクの設定をし忘れると、ブラウザのアドレス欄に日本語が表示されたり、 %e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b みたいな感じで、イミフな文字列がならんでしまったりしてあまり気持ちの良いものではありませんよね。
よく分かっているならまだしも、運営を任せていたりすると、そんなURLが大量に発生してげんなり・・・そんな状況もよくあり得ます。

先日フォーラムの 記事のスラッグ名を自動的に記事IDにしたい に回答した内容を一歩進めて、なるべく汎用的に使えるコードを書いてみました。

“WordPress の投稿スラッグを自動的に生成する” の続きを読む

WordPressでカスタムフィールドも検索対象にする

WordPressでカスタムフィールドも検索対象に含めてみました。

といっても、全てのカスタムフィールドを検索対象にするといろいろとアレなので、特定の名前を持つもののみに限定しなければなりません。
そこは、

pm.meta_key IN ( 'meta_key1', 'meta_key2', 'meta_key3' )

の meta_keyn の部分を調整してもらえれば、大丈夫だと思います。

function search_custom_field_query( $search, $wp_query ) {
	if ( $wp_query->is_main_query() && $wp_query->is_search() && ! is_admin() ) {
		$q = $wp_query->query_vars;
		$n = !empty($q['exact']) ? '' : '%';

		$add_search = '';
		foreach( (array) $q['search_terms'] as $term ) {
			$term = esc_sql( like_escape( $term ) );
			$add_search = " OR ( pm.meta_key IN ( 'meta_key1', 'meta_key2', 'meta_key3' ) AND pm.meta_value LIKE '{$n}{$term}{$n}')";
		}
		$search = str_replace( ')))', ')' . $add_search . '))', $search );
	}
	return $search;
}
add_filter( 'posts_search', 'search_custom_field_query', 10, 2 );


function search_custom_field_join( $join, $wp_query ) {
	global $wpdb;
	if ( $wp_query->is_main_query() && $wp_query->is_search() && ! is_admin() ) {
		$join .= " INNER JOIN {$wpdb->postmeta} AS pm ON pm.post_id = {$wpdb->posts}.ID";
	}
	return $join;
}
add_filter( 'posts_join', 'search_custom_field_join', 10, 2 );

/*
 * 
 */
function search_custom_field_groupby( $groupby, $wp_query ) {
	global $wpdb;
	if ( $wp_query->is_main_query() && $wp_query->is_search() && ! is_admin() ) {
		$groupby = "{$wpdb->posts}.ID";
	}
	return $groupby;
}
add_filter( 'posts_groupby', 'search_custom_field_groupby', 10, 2 );

え?Search Everything 使えって?

Meta Manager 1.0.5アップデート

Meta Manager を 1.0.5にアップデートしました。非公開のカスタム投稿タイプでもメタ情報のボックスが表示されてしまっていたため、非公開のカスタム投稿タイプの場合、表示しないように条件の変更を行いました。

併せて、メタ情報のボックスを非表示にできるようにフィルターフックを追加しています。CODE 1 では、book というカスタム投稿タイプであれば、表示しないようになります。投稿タイプ以外にも記事の情報を参照出来る $post もパラメーターとしてとれますので、記事の属性などによっての切り替えも可能です。

CODE 1

function meta_manager_meta_box_control_filter( $display, $post_type, $post ) {
	if ( $post_type == 'book' ) {
		$display = false;
	}
	return $display;
}
add_filter( 'meta_manager_meta_box_display', 'meta_manager_meta_box_control_filter', 10, 3 );