WordPressの投稿画面やWP-CLIに出てくる「スラッグ」。
なんとなくURLの一部、くらいで流している人も多いと思います。自分もそうでした。
ただ、間違えると地味に困ります。
基本と、使ってみて気づいたことをまとめます。
スラッグって、結局なに?
記事やカテゴリのURLに入る名前のことだよ。
スラッグとは?記事やカテゴリを、URLで表す名前
スラッグは、記事やカテゴリなどを、URLの中で表すための名前です。
WordPressの公式の用語集でも、スラッグはURLに使いやすくした名前、とされています。
実際のURLで見てみましょう。
https://cats-hand.pro/wp-cli-term-remove-success-uncategorized/
末尾のwp-cli-term-remove-success-uncategorizedが、この記事のスラッグです。
パーマリンク設定を/%postname%/にしているので、記事のスラッグがそのままURLの末尾に入ります。
スラッグがあるのは記事だけではありません。
固定ページにも、カテゴリにも、タグにもあります。
意外と、どこにでもいます。
初期状態の「未分類」のスラッグはuncategorized。
どんなときに出てくる?
スラッグに出会う場面は、だいたい3つです。
- 投稿の編集画面で、URLの末尾を決めるとき
- カテゴリやタグを作るとき
- WP-CLIやPHPで、記事やカテゴリを特定するとき
どれも、スラッグの出番です。
WP-CLIは、ターミナルからWordPressを操作するツールです。
管理画面でポチポチやっていた作業を、コマンドで一気に片づけられるので、記事数が増えてくるととても便利です。
記事の投稿も、Claude Codeがこれでやっています。
基本の決め方
決め方の基本は、次の3つです。
- 英語の小文字・数字・ハイフンで書く
- URLを見ただけで何の記事か想像できる、短めの言葉にする
- 公開前に決めて、公開後は原則変えない
日本語タイトルのまま自動で作らせると、URLが長くなります。
スラッグを指定し忘れた記事で、日本語がパーセントエンコードされた、やたら長いURLになったことがありました。
見た目がもう別物です。
以来、記事のスラッグは英語で必ず指定しています。
公開後でも、スラッグは変えられます。
ただ、変えるとURLも変わります。
つまり、別のURLです。
WordPressには、記事のスラッグを変えたとき、古いURLへのアクセスを新しいURLへ301で転送する仕組みがあります。
301は、「URLが引っ越しました」と案内する、恒久的な転送のことです。
それでも、検索結果に載ったURLが変わるのは避けたい。
なのでこのブログでは、リライトでもスラッグは変えません。
公開したあとでも、スラッグって変えられるの?
変えられるよ。ただURLも変わっちゃうから、このブログではリライトでも変えてないんだ。
自分はこう使ってます
基本は以上。
ここからが、実際に使ってみた話です。
ローカルと本番を行き来しながら、記事をコマンドやスクリプトでまとめて触る運用の中で、スラッグに助けられた場面がいくつもありました。
DB操作は、IDじゃなくスラッグで記事を探す
DB操作は、記事のデータを直接書き換える作業のことです。
ローカル環境は自分のPCで試す場所、本番環境は公開しているサイトのこと。
このブログは、この2つで同じ記事の投稿IDが違います。
記事やカテゴリのデータは、テーマのコードと違ってGitで同期する対象に入っていないので、投稿した順番やタイミングが少し違うだけで、同じ内容の記事でも別のIDが振られてしまうんです。
同じスラッグの記事が、ローカルでは228番。
本番では213番。
ズレていました。
地味に、落とし穴です。
これに気づかないまま、IDを決め打ちでバッチ処理させてしまいました。
ローカルと本番でIDが1つズレていたせいで、狙っていない記事に、検索結果に出る説明文(メタディスクリプション)が書き込まれました。
それ以来、IDは決め打ち禁止。
記事を探すときはスラッグを使っています。
PHPならスラッグから記事を探す関数のget_page_by_path、WP-CLIならwp post list --name=スラッグで探す形です。
スラッグなら、ローカルでも本番でも同じ記事を手がかりにできます。
しかも、スクリプト側で「記事が見つからなければ、その先の処理をしない」ようにしてあるので、安全弁にもなります。
IDで探せばいいんじゃないの?
ローカルと本番でIDが違うことがあるんだよね。スラッグなら同じ記事を指せるから、そっちで探してるよ。
本番の対象記事も、スラッグで特定する
関連記事の仕組みを直したときも、スラッグで探しました。
4記事とも、IDは全部違っていました。
やっぱり。
IDで探していたら、また確認作業が増えていたはず。
スラッグ扱いでハマった例
もうひとつ、スラッグで困ったことがあります。
WP-CLIで記事にカテゴリを付けるとき、渡した値が「スラッグ(または名前)」として扱われる仕様でした。
カテゴリのIDを数字で渡したつもりが、「11」という名前のカテゴリが新しく作られてしまいました。
しかも、11から16まで6個も。
IDとして渡すには、--by=idというオプションが必要です。
これだけです。
詳しくはうっかり「11」という名前のカテゴリを作ってしまった話に書いています。
別の日は、未分類を外そうとして、同じ原因で外れませんでした。
未分類のスラッグはuncategorizedなので、「1」というスラッグは見つからなかったんです。
それでもコマンドは「Success」と返してきました。
成功と言われても・・・
こちらはwp post term removeが「Success」なのに、未分類が外れなかった理由にまとめています。
迷ったときの確認ポイント
- 公開前に、英語の短いスラッグを自分で指定する
- 公開後は、理由がなければ変えない。ここ、見落としがちです
- ローカルと本番を行き来する作業では、IDではなくスラッグで記事を探して、見つからなければ処理が止まるようにしておく
- WP-CLIで数字を渡すときは、スラッグ扱いになっていないか見る
スラッグは地味です。
でも、URLにもDB操作にも関わってきます。
ローカルと本番を行き来しながら、スクリプトで記事をまとめて触るような運用になるほど、スラッグで記事を指定しておく安心感は大きくなっていきます。
最初に決めておけば、あとで助かる場面が多いです。
あわせて知っておきたい用語
- パーマリンク
- 記事のURLの形を決める設定。スラッグがURLのどこに入るかも、ここで決まります。
- 301(リダイレクト)
- 古いURLへのアクセスを、新しいURLへ案内する転送のこと。詳しくはこちら
- –by=id
- WP-CLIで、渡した値をIDとして扱わせるオプション。