WordPressでカテゴリーやタグといったタクソノミーで名前に日本語を使用して登録する(タクソノミー作成画面の場合はスラッグを未記入で登録する)と、スラッグにもそのまま名前で使用した日本語が適用され、さらにそれをパーマリンクなどに利用していると一部の人にとってはすごく残念なURLになってしまいます...。
運営する人がそうならないよう気を付けてもらえれば良い話ではありますが、確実にそれは避けたいという場合に使える、タクソノミーのスラッグにマルチバイトが適用されてしまうのを防ぐ方法です。
記事のパーマリンクで%postname%
を使用していて且つパーマリンクを変更し忘れた場合も同じような現象になり、その対策として「WordPress の投稿スラッグを自動的に生成する | Simple Colors」で紹介されているスニペットが非常に便利なのですが、今回はこれと同じような動きをタクソノミーでもやってみるというものになります。
実装にはfunctions.php
に下記を記述し、この場合はWordPressのデフォルトで用意されている「投稿」の「カテゴリー」が対象となります。
add_action( 'create_category', 'post_taxonomy_auto_slug', 10 );
function post_taxonomy_auto_slug( $term_id ) {
$tax = str_replace( 'create_', '', current_filter() );
$term = get_term( $term_id, $tax );
if ( preg_match( '/(%[0-9a-f]{2})+/', $term->slug ) ) {
$args = array(
'slug' => $term->taxonomy . '-' . $term->term_id
);
wp_update_term( $term_id, $tax, $args );
}
}
一応デフォルトの動きを紹介すると、例えばカテゴリー名を「サンプル」としてスラッグは未指定の状態で登録すると、そのまま名前で使用した「サンプル」がスラッグにも使用され、URLなどでは%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab
のような形で表示されますが、それが上記記述後にカテゴリーを同じく日本語で登録した場合はスラッグがcategory-1
のような形に変換されて登録されるようになります。
また、カテゴリーの登録画面だけでなく、記事作成画面で「+ 新規カテゴリーを追加」からカテゴリーを日本語で新しく追加した場合も同じくスラッグが変換されます、
スラッグで使用されているcategory
の部分はタクソノミー名を使用しており、その後の数字についてはカテゴリーIDを付与しています。
自動的にスラッグを変更するかどうかはスラッグにマルチバイトが使用されているかどうかで判断しているので、上で例に出した「サンプル」というカテゴリー名にしつつスラッグをsample
と指定して場合は、勝手に変換されることはなくそのまま指定したsample
というスラッグで登録されます。
ちなみに、上記コードの場合はタクソノミー名が付く形にしていましたが、そうではなく任意で何か文字列を指定したい場合は下記コードのハイライト行内でxxx
としている部分を変更し、この場合はxxx1
とかxxx10
といった形でスラッグが変換されるようになります。
add_action( 'create_category', 'post_taxonomy_auto_slug', 10 );
function post_taxonomy_auto_slug( $term_id ) {
$tax = str_replace( 'create_', '', current_filter() );
$term = get_term( $term_id, $tax );
if ( preg_match( '/(%[0-9a-f]{2})+/', $term->slug ) ) {
$args = array(
'slug' => 'xxx' . $term->term_id );
wp_update_term( $term_id, $tax, $args );
}
}
タグ(投稿)で使用したい
これまで紹介したのは「投稿」の「カテゴリー」で使用していましたが、これを「タグ」でも使用したい場合は下記のハイライト部分のようにadd_action()
を追記してあげれば実装できます。
この場合はスラッグが未記入またはマルチバイトが指定されている際に、post_tag-1
のような形でスラッグが登録されるようになります。
add_action( 'create_category', 'post_taxonomy_auto_slug', 10 );
add_action( 'create_post_tag', 'post_taxonomy_auto_slug', 10 );function post_taxonomy_auto_slug( $term_id ) {
$tax = str_replace( 'create_', '', current_filter() );
$term = get_term( $term_id, $tax );
if ( preg_match( '/(%[0-9a-f]{2})+/', $term->slug ) ) {
$args = array(
'slug' => $term->taxonomy . '-' . $term->term_id
);
wp_update_term( $term_id, $tax, $args );
}
}
カスタムタクソノミーで使用したい
こちらはカスタムタクソノミーの場合で、同じくadd_action()
を追記してあげれば実装できます。
下記は例として「works_cat」というタクソノミーを作成している想定で、先に紹介した2つの方法を見て何となく分かる方もいると思いますが、add_action()
の$hook
で記述しているcreate_
のあとにそのタクソノミー名を指定してあげます。
この場合はスラッグが未記入またはマルチバイトが指定されている際に、works_cat-1
のような形でスラッグが登録されるようになります。
add_action( 'create_category', 'post_taxonomy_auto_slug', 10 );
add_action( 'create_post_tag', 'post_taxonomy_auto_slug', 10 );
add_action( 'create_works_cat', 'post_taxonomy_auto_slug', 10 );function post_taxonomy_auto_slug( $term_id ) {
$tax = str_replace( 'create_', '', current_filter() );
$term = get_term( $term_id, $tax );
if ( preg_match( '/(%[0-9a-f]{2})+/', $term->slug ) ) {
$args = array(
'slug' => $term->taxonomy . '-' . $term->term_id
);
wp_update_term( $term_id, $tax, $args );
}
}
今回紹介したサンプルは基本的にタクソノミー名をそのまま用いるようなパターンでしたが、任意で付けたい場合は途中で紹介した方法を参考にしてもらったり、あとはタクソノミーによって全く異なる形にしたければ関数を別途作成したり条件分岐を使うなどすることで対応できると思います。
今回紹介した方法ですが、Twitterでこういったことができないか呟いてみたところ @understandardさんがヒントをくれたお陰で糸口を見つけることができ、さらに普段からお世話になっている師匠がより使いやすくなるようアドバイスをくれたことで実装することができました。
create_category っていうアクションフックあるから、もしかしたらそこでいけるかもですね。
— Jun Sugimoto (@understandard) June 8, 2017
お二方とも、ありがとうございました!