WordPressで投稿スラッグ(パーマリンク)を自動的に英数字に変更する方法とコード説明

WordPressの投稿を新規作成したとき、タイトルをつけると同時に投稿スラッグには日本語が入ります。

ブラウザがchromeなどのWEBブラウザで直接サイトを見ている場合は日本語スラッグでも一見問題ないように見えますが、
SNSなどでシェアした場合、日本語のスラッグは以下のようにエンコードされて貼り付けられてしまいます。

例えば、「日本語スラッグがよくない理由」などのタイトルをつけた場合、SNSシェア画面には設定されるスラッグは次のようになります。

▽スラッグ

%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B0%E3%81%8C%E3%82%88%E3%81%8F%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1

※このスラッグの変換は下記のWEBサービスを利用して作成しました。

▽URLエンコード・デコード
https://tech-unlimited.com/urlencode.html

いまいちこの使い時がわかりませんでしたがデコードのほうが使う機会が多いかもしれません。

さて、日本語のスラッグをエンコードされた文字列リンクですがこれだと怪しいサイトに飛ばされる気がしてなかなかリンクをタップする気にはなりません。

SNSからの流入は大きな影響があるのでやはり日本語のスラッグはやめて英数字でスラッグを作成するべきです。

ただ、他の業務で忙しい片手間WEBサイト担当者がその都度スラッグを考えるのはかなり手間に感じることでしょう。

そんな場合は、投稿スラッグを勝手に英数字にかえてしまう処理を用意してあげると運用コストを減らせるのでよいと思われます。

functions.phpに以下のコードを書くと投稿スラッグが日本語になってしまいそうな場合に勝手に英数字に変更してくれます。

if ( ! function_exist( 'auto_post_slug' ) ) :
function auto_post_slug( $slug, $post_id, $post_status, $post_type ) {
    if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) {
        $slug = utf8_uri_encode( $post_type ) . '-' . $post_id;
    }
    return $slug;
}
add_filter( 'wp_unique_post_type', 'auto_post_slug', 10, 4 );
endif;

このコードの内容を説明すると

  1. 投稿スラッグが「%」から始まり次の文字が2桁の英数字に該当する文字だったら、つまりマルチバイトをエンコードした結果生成される文字だったら
  2. 投稿のpostタイプをutf8_uri_encodeという関数に適用させる
  3. それにハイフンと投稿IDをつなげる
  4. それをスラッグとして設定する

という処理になります。

これで日本語スラッグを避けて記事を投稿できるようになります。