Web制作に役立つスキルを学ぶ

WordPressの日本語スラッグを記事IDに自動変換する方法

WordPressの日本語スラッグを記事IDに自動変換

ブログやコーポレートサイトを運営する上で記事を投稿するほとんどの場合、日本語タイトルを設定するかと思います。しかし、WordPressのパーマリンク設定が初期設定のままであったり、投稿名に設定していると記事タイトルがそのままスラッグに設定されてしまいます。

スラッグの設定を初めから記事IDにすれば問題ないという方法もありますが、記事によって変更したい場合には%postname%を設定している必要があるため、必ずこの問題が生じます。

なぜスラッグを記事IDに変換するのか

例えば、「パーマリンク設定」がそのまま設定された場合、実際にはエンコードされて以下のように表示されます。

%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%83%B3%E3%82%AF%E8%A8%AD%E5%AE%9A

みこと
みこと

実際にはこんなに複雑なことになっているんですね。

これではSNSでシェアしたりする時に長すぎて困ってしまいそうです…

camoさん
camoさん

URL(パーマリンク)は半角英数字で設定するのが一般的とされているのだけど、これでは長すぎて意味の分からない文字列になってしまうね。

フィルターフックによる自動変換

WordPressの機能にあるフィルターフックを使って自動変換をさせることができます。
以下のコードをfunctions.phpに追加させます。

function auto_slug_setting( $slug, $post_ID, $post_status, $post_type ) {
  if ( $post_type == 'post' ) {
    $slug = $post_ID;
  }
  return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_slug_setting', 10, 4 );

$post_type == 'post'とすることで投稿の場合のみ、スラッグを記事IDに自動変換するようにしています。固定ページについてはほとんどの場合でスラッグを変更することが多いのであえて条件分岐を使用して投稿のみに限定しています。

さらに扱いやすい応用編

先ほどのコードであれば日本語タイトル記事のスラッグは記事IDに自動変換されるので特に問題はないのですが、記事によってIDではなくユニークなものに変更したい場合は書き換えても変更することができません。

そこで、初回の保存時には記事IDに自動変換して、記事の編集・更新時には自動変換の処理をさせないという方法があります。

function auto_slug_setting( $slug, $post_ID, $post_status, $post_type ) {
  // 記事IDからを記事情報を取得
  $post = get_post($post_ID);
  
  // 初回の記事保存時にのみスラッグを記事IDに設定
  if ( $post_type == 'post' && $post->post_date_gmt == '0000-00-00 00:00:00' ) {
    $slug = $post_ID;
  }
  return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_slug_setting', 10, 4 );