post_idが自動的にslugになる設定
投稿タイプのslugは、日本語の文字化け防止のために自動的「post_id」になるように設定している人は多いのではないでしょうか?
その場合、WordPress管理画面>設定>パーマリンク>パーマリンク構造は「/%category%/%post_id%.html/」等に設定しているはずです。
カスタム投稿では「post_id」タイプのslug設定では問題が発生する
しかし、WordPress管理画面>設定>パーマリンク>パーマリンク構造は「/%category%/%post_id%.html/」等に設定している場合に下記の問題が発生します。
- カスタム投稿タイプでは、slugが自動でpost_idにならない
- カスタム投稿タイプでは、自由に入力した文字列がslugとして採用されてしまう
- その場合、文字列の種類によってはカスタム投稿タイプの個別記事が表示されなくなる(404ページ扱い)
なお、「post_id」タイプのslug設定で、正常に機能する文字列は「英語文字列+数字」のみです。それ以外の文字列にしてしまうと404ページが表示されてしまい、カスタム投稿ページが表示されないエラーが発生します。
ちなみに上の「post_id」タイプのslug設定で、slugとして正常に使える文字列と使えない文字列の例は下のとおり。
- slugに使える文字列の例
- c001
- 001
- service01
- dental01
- slugに使えない文字列例
- dental
- general-dentisty
- general_dentisty
- service
カスタム投稿タイプのみ自由な文字列をslugに使う時のルール
上記命名ルールに従い、sv001などの「半角小文字英字文字列+半角数字」でslugを命名するようにすればエラーは発生しません。
ただし、ご自分でこれらのslugを考えるのが面倒な場合、下記のように自動的にpost_idがslugになるようなコードをfunction.phpに書く方法もあります。
カスタム投稿タイプのslugもpost_idを自動設定したい時
では、カスタム投稿タイプでも個別記事のslugを自動的にpost_idになるようにする設定方法はというと、下記のコードをfuntions.phpに記述すればOKです。
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
if ($post_type == 'post') { // 通常の投稿の場合
$slug = $post_ID; // スラッグを投稿IDに
}
elseif ($post_type == 'service') { // カスタム投稿タイプの場合
$slug = 's' . $post_ID; // 's'をプレフィックスとして付ける
}
return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4 );
上の例と同様に、5行目の$post_type == ‘service’の「service」は、私がカスタム投稿タイプに設定したslugですので、ケースバイケースで変更して下さい。