WordPress:タクソノミー(カテゴリー・タグ)が日本語で登録された場合のスラッグを自動的に変換する方法

WordPress:タクソノミー(カテゴリー・タグ)が日本語で登録された場合のスラッグを自動的に変換する方法

備忘録。
WordPressでカテゴリーやタグといったタクソノミーで名前に日本語を使用して登録する(タクソノミー作成画面の場合はスラッグを未記入で登録する)と、スラッグにもそのまま名前で使用した日本語が適用され、さらにそれをパーマリンクなどに利用していると一部の人にとってはすごく残念な気持ちになるURLになってしまいます...。
運営する人がそうならないよう気を付けてもらえれば良い話ではありますが、確実にそれは避けたいという場合に使える、タクソノミーのスラッグにマルチバイトが適用されてしまうのを防ぐ方法です。

記事のパーマリンクで%postname%を使用していて且つパーマリンクを変更し忘れた場合も同じような現象になり、その対策として「Simple Colors」さんの「WordPress の投稿スラッグを自動的に生成する | Simple Colors」で紹介されているスニペットが非常に便利なのですが、今回はこれと同じような動きをタクソノミーでもやってみるというものになります。

実装にはfunctions.phpに下記を記述し、この場合はWordPressのデフォルトで用意されている「投稿」の「カテゴリー」が対象となります。

functions.php

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」というスラッグで登録されます。

ちなみに、上記コードの場合はタクソノミー名が付く形にしていましたが、そうではなく任意で何か文字列を指定したい場合は下記コード内のハイライト表示を変更し、この場合は「xxx1」とか「「xxx10」」といった形でスラッグが変換されるようになります。

functions.php

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」のような形でスラッグが登録されるようになります。

functions.php

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」のような形でスラッグが登録されるようになります。

functions.php

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 );
  }
}

以上、WordPressでタクソノミー登録時に日本語だった場合のスラッグを自動的に変換する方法でした。
今回紹介したサンプルは基本的にタクソノミー名をそのまま用いるようなパターンでしたが、任意で付けたい場合は途中で紹介した方法を参考にしてもらったり、あとはタクソノミーによって全く異なる形にしたければ関数を別途作成したり条件分岐を使うなどすることで対応できると思います。

今回紹介した方法ですが、Twitterでこういったことができないか呟いてみたところ @understandard さんがヒントをくれたお陰で糸口を見つけることができ、さらに普段からお世話になっているデベロッパーの方がより使いやすくなるようアドバイスをくれたことで実装することができました。

お二方とも、ありがとうございました!

Close the search window,
please press close button or esc key.