WordPressのスラッグを自分で入力しない場合、記事タイトルがスラッグとして使用されます。
この自動的に設定されるスラッグをもうちょっと好きなようにしたいと思い、修正する方法について調べてみました。
ADs
スラッグは以下の様なルールで生成されます。
・他の記事に同一スラッグがある場合、「-2」(-3、-4…)が付加される
・記事タイトルをURLエンコードし、200文字以内に収まるように末尾を切り捨てる
ちなみに、このスラッグを生成する処理はwp_unique_post_slugという関数が行っていますので、詳しく知りたい場合はソースも参考にしてみてください。
URLの長さについて特に規定はありませんが、あまりに長すぎるURLは不都合が起きる可能性があります。
ブログ運営においてははてブとページ名の長いWikiの、登録URLの長さ問題で指摘されているように、はてブされた際の問題が大きいかと思います。
そこで、スラッグが200文字以下ではなくURLの長さが255文字以下になるようにスラッグを生成するアクションフックを書いてみました。
以下をfunctions.phpに記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
add_action('transition_post_status','triming_slug',10,3); function triming_slug($new_status, $old_status, $post){ if($new_status == 'publish' && $old_status != 'publish'){ $url = get_permalink($post->ID); //URL取得 $url_length = strlen($url); //URL文字数取得 $slug = $post->post_name; //現在のスラッグ //URLを合計255文字以下にする if($url_length > 255){ $slug_length = 255 - ($url_length - strlen($slug)); //スラッグを$slug_lengthに切り捨てる //スラッグは200文字以上は使えないので200文字以上のときは200に設定 if($slug_length >= 200){ $slug_length = 200; } //(ないと思うけど)$slug_lengthが1以下なら何もしない if($slug_length >= 1){ $slug = _truncate_post_slug($slug,$slug_length); } } $newpost = array(); $newpost['post_name'] = $slug; //ここでスラッグを指定 $newpost['ID'] = $post->ID; wp_update_post($newpost); } } |
transition_post_statusは投稿の状態(公開、下書き、レビュー待ちなど)が変更されたタイミングで実行されるアクションフックです。
記事投稿時に実行したい処理がある場合は、このtransition_post_statusを使うのが一番よさそうな感じです。
_truncate_post_slugはスラッグを指定文字数に切り捨てる関数です。
URLエンコード後の文字列を切り捨てる場合は変なところで切ると文字化けする恐れがありますが、そのあたりも考慮していい感じにやってくれます。
ソースコードもご参照ください。
$newpost[‘post_name’]という配列がスラッグを指定している部分ですので、今回のような文字数調整だけでなく、たとえばカテゴリ名称をスラッグに加えたり日付を加えたりなど、自分好みにいろいろできるかと思います。
スラッグは英語にしたいけどいちいち英文を考えるのがめんどくさい、ということもあるかと思います。
そういうときにうってつけな、WP Slug Translateというプラグインがあります。
このプラグインはスラッグを設定する際にMicrosoft Translatorという翻訳APIを使うことで英文に翻訳し、スラッグに設定してくれます。
ADs
コメントはまだありません。