パーマリンク設定に %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;
}