WordPress で投稿のURLは、 /article/%postname%/ とか /blog/%post_id%/ にしたいけど、パーマリンク設定で article や blog といったディレクトリを入れてしまうと、カテゴリーやアーカイブの表示でも、このディレクトリが付いてしまってかっこ悪いですよね。
今回は、このちょっとしたモヤモヤを解消するべく、投稿の詳細表示の時のみ特定のディレクトリを追加する方法を紹介します。
WordPressを中心に、F1とか読書とか写真とか
WordPress で投稿のURLは、 /article/%postname%/ とか /blog/%post_id%/ にしたいけど、パーマリンク設定で article や blog といったディレクトリを入れてしまうと、カテゴリーやアーカイブの表示でも、このディレクトリが付いてしまってかっこ悪いですよね。
今回は、このちょっとしたモヤモヤを解消するべく、投稿の詳細表示の時のみ特定のディレクトリを追加する方法を紹介します。
リライトルールを追加して、post_status の指定をすると、メディアもアーカイブ表示ができるんですよ。奥さん。
ただし、is_home が true になるので、そのままだと home.php か、index.php での表示になってしまうのですけどね。
function add_attachiment_archive_rule() {
$add_rules = array(
'top' => array(
'attachment/page/[0-9]{1,}/?$' => 'index.php?post_type=attachment&paged=$matches[1]',
'attachment/?$' => 'index.php?post_type=attachment'
),
'bottom' => array(
)
);
foreach ( $add_rules as $position => $rules ) {
foreach ( $rules as $rewrite => $rule ) {
add_rewrite_rule( $rewrite, $rule, $position );
}
}
}
add_action( 'init', 'add_attachiment_archive_rule' );
function attachment_archve_post_status( $wp_query ) {
if ( ! is_admin() && $wp_query->is_main_query() ) {
if ( ! is_singular() && $wp_query->get( 'post_type' ) == 'attachment' ) {
$wp_query->set( 'post_status', 'inherit' );
}
}
}
add_action( 'pre_get_posts', 'attachment_archve_post_status' );
パーマリンク設定に %category% が含まれていた場合、カテゴリーのIDが若いものを元にして表示するURLが構成されるのはご存じでしょうか。
まあ、知らなかった方は、そうなっているので、「なるほどですねー。」と一言、頭に刻み込んでおいてください。
ただし、カテゴリーに 拙作 PS Taxonomy Expander や My 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;
}

WordPressの3.3もリリースされましたね。
3.3でのアップデートではメディアアップローダーの変更が一番の目玉かとは思いますが、目に見えないところでの改善も多数存在しています。今回は、その中の1つであるパーマリンクのパフォーマンス改善について、調べてみたのでまとめておきたいと思います。
ちょっと、小難しい内容も含んでいますが、概略だけでも掴んでおくことは大事なので、是非ご一読を。
3.3の新機能あれこれについては、おでさんの「WordPress 3.3 の新機能をおさらいしよう、そうしよう」にうまいことまとめられていますので、そちらを参照のほどを。
ことの是非はともかく、WordPressをindex.htmlでアクセスされた時でも表示したいというケースは多々あります。
もちろん .htaccess でリダイレクトしても良いのですが、今回はWordPress側で行える簡単な対策を紹介します。