WordPress のパーマリンクが「-2」と重複する時の、意外?な解決策

スラッグの重複解決方法

はい、ごめんください。コスギです。
とても小さなことで頭を悩ませてくれる WordPress が大好きです。

そんな WordPress あるあるのひとつが、「どうやってもパーマリンクに “-2” がついて直らない!!ムキーーー!!」だったりしますが、その解決策をまとめました。

ちなみに、正しくは「パーマリンク」「スラッグ」の部分です。データベースでは「post_name」に当たります。

事例)contact としたいのに contact-2 となるケース

具体的なフィクションで説明します。ご自身の環境に合わせ、脳内で読み替えてください。

  1. お問い合わせ用の固定ページを新規作成した。
    やっぱりCF7の使い勝手がいいな。管理画面を省くのがナウでヤング。
  2. 画像を入れて、本文も入れて、プラグインで作ったフォームも入れた。
    スタイルシートでフォームの修飾もバッチリだ。もちろん、レスポンシブ。
  3. 後から、お問い合わせは電話のみでいいからと、仕様変更の通達があった。
    先方にメールを受けられるウェブ担がいないからという理由らしい。
  4. お問い合わせページが不要になったので、削除した。
    さようなら、私の input[type=text] 。さようなら、私の input[type=submit] 。
  5. しばらくして、やっぱりお問い合わせページは必要ということになった。
    来たよ、この「すぐできるでしょ?」オーラの仕様変更。もちろん笑顔で快諾だ。
  6. http://〜〜/contact/ で作ってほしいと言われた。
    ページは消えてしまったけど、CSSや画像は消していなかった私、GJ!

上記は極端な例ですが、こんな状況を想定しています。
こんなことをやっていたら死ねるという、あくまでも極端な例です。

そして、

新規で「contact」という固定ページを作ったのに、「contact-2」になってしまう・・・!!

という状況に陥った場合の解決策が、以下になります。

まずは、ゴミ箱から完全に消去しよう

投稿一覧や固定ページのゴミ箱に、削除した記事が残っていませんか?

上記なら、「4.お問い合わせページが不要になったので、削除した。」のステップで、

ゴミ箱には入れたけれど、完全に削除してはいない

という状況があり得ます。

trashed

今回の事例のように、再利用したいなら、ゴミ箱から「復元」すると良いでしょう。

まったく違うページの場合は「完全に削除する」を選ぶと良いでしょう。

投稿や固定ページなどのデフォルト機能だけでなく、カスタム投稿タイプも確認しておいたほうがいいですよ。

ゴミ箱に入れたものは、重複しなくなった?

最近の WordPress のアップデート(4.5.0から)で、一旦ゴミ箱に入れた記事には「__trashed」が自動で付与されるようになり、重複しなくなったようです。

参考:wp_add_trashed_suffix_to_post_name_for_post() | Function | WordPress Developer Resources(英語)

これはゴミ箱から復元した場合にも「__trashed」はついたままなので、復元した記事のスラッグは確認しておいたほうが良さそうですね。

それでも直らない場合は、メディアを確認してみよう

「4.お問い合わせページが不要になったので、削除した。」のステップで、

完全に削除したにも関わらず、やはり重複している。でも、同じスラッグのページはない!

という場合です。

「2.画像を入れて、本文も入れて、プラグインで作ったフォームも入れた。」のステップで使った画像に注目してみましょう。

「メディア」のページで、画像を確認してください。

もしかしたら「contact.jpg」という画像を作っていませんか?

その場合、画像の登録の際にスラッグを「contact」として登録してしまうので、重複を避けるため、自動的に「-2」がついてしまいます。

画像を登録する際、重複を避けるためにファイル名が変わることもありますが、今後、上記のゴミ箱の対応のように、画像のファイル名が自動的に変わる可能性もあります。

ただ、画像の名前=スラッグになるということを覚えておき、画像には「h3_◯◯◯.png」や「header_◯◯◯.jpg」など、区別できるファイル名がベターでしょう。

できるだけ画像を減らすということも考えたいですね。

ちなみに私がハマったのは、ここでした。

どうしてもダメな場合は、データベースをチェック

PHPのわかる中級者向けです。

要するに post_name の重複を確認すれば良いので、phpMyAdmin が使えるようなら、wp_posts の中身を確認してみてください。

お名前.comのサーバのように phpMyAdminが入っていない場合は、以下のように $wpdb で SQL を記述して動かせば、強引に表示できます。

<?php
$query = "SELECT post_name,post_title,post_status,post_type
    FROM wp_posts
    WHERE post_name!='' AND post_name LIKE '%contact%'
    ORDER BY post_name";
$res = $wpdb->get_results( $query );
var_dump($res);
?>

※動的な変数は使っていないため、prepare していません。

この「contact」の部分を、重複しているスラッグ名に変えると、データが表示されます。

タイトルや投稿タイプで「あ!れ!かあああぁぁぁぁーーー!!」と、目星がつくことでしょう。

 

余談ですが、「スラッグ」って直訳すると「ナメクジ」なんですが、語源はどうもタイプライターの「文字のカタマリを打つためもの」から来ているようですね。
参考:Linotype machine – Wikipedia, the free encyclopedia(英語)

 

それでは、ごめんください。

ウェブの心理戦略家。WordPressの勉強会(WordBench新潟・長岡藩)も主催。顧客の心理と分析を裏付けるデータを元に、心理学に基づいたライティングとWordPressでのサイト構築が得意。新潟県長岡市在住。2013年4月には新潟県で初のウェブ解析士マスターになり、同年6月よりコスギスとして活動。夫と子ども2人をこよなく愛す。おやつはプリン。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL