| ブログトップ | CMS関連 |

【WordPress】スラッグ名が重複すると、公開中の投稿ページが404になる

※これは、現在最新バージョンである4.7.1で確認しています。

 

WordPressの管理画面にログインし、以下の手順で記事を作成してみてください。

①新規投稿で、スラッグ名をhogeと設定し、公開保存する。
②再び新規投稿で、スラッグ名をhogeと設定し、下書き保存する。(実際はhoge-2に変わりますが気にせずに)

※①と②の記事は別の記事です。
※スラッグ名は手動で設定してください。

①の投稿ページを、別のブラウザか、Wordpressからログアウトして開いてみてください。
公開しているにも関わらず、エラー404ページになってしまいます。
(pre_get_postsなどで、投稿詳細ページの取得ルールを変えている場合は起こらない可能性があります)

 

原因

②の投稿を作成する際、スラッグ名を「hoge」と入力すると、重複を回避するため「hoge-2」と表示されるのですが、実際は下書き保存では「-2」はつかず、そのまま「hoge」と保存されてしまいます。(データベースを確認すると、postnameがhogeとなっているレコードが2つ確認できます)

そのため、①のページを開こうとした際、②の投稿データを取得してしまい、しかし下書きのため404ページとなってしまうわけです。

ちなみに投稿詳細ページでのデータ取得の順番は公開日時順になっているらしく、②の下書き投稿が①の公開投稿よりも過去の公開日時に設定していると、①の投稿ページは正常に表示されます。

この現象が発生する条件は正確には以下となります。

  • スラッグ名を設定することができるパーマリンク設定になっていること
    (%postname%が含まれる設定の場合)
  • 投稿タイプが「投稿」であること
    (固定ページではこの現象は起きない)
  • 投稿の作成・編集時にスラッグ名を任意に設定すること
    (WPがタイトルから自動的に生成する場合は、重複してもこの現象は起きない)
  • 設定したスラッグ名に自動的に連番がつくこと
    (すでに公開されている投稿記事が存在している場合)
  • 保存時に下書き保存すること
    (公開保存なら大丈夫)
  • 下書き保存した投稿記事と同じURLの公開中の記事が存在すること
    (連番なしのURLと完全一致する公開中の投稿記事があること。日付やカテゴリーがパーマリンクに含まれる場合で、これらが異なる場合はこの現象は起きない)
  • 公開保存されている投稿より、下書き保存した投稿の方が、公開日時が未来に設定されていること

という条件なので、投稿でも命名規則を決めてスラッグ名をきっちり設定するという運用を行っている(例えばニュースなら「news20160120」と設定する)サイトの場合以外は起きないので、なかなか見つかりづらい不具合ではあると思われます。

 

対策

ひとまず404エラーを回避する方法ですが、functions.phpに以下を追記すると、回避できます。

add_action('pre_get_posts', 'custom_pre_get_posts' );
function custom_pre_get_posts($query){
if ( is_admin() || ! $query->is_main_query() ){
return;
}
if($query->is_single && !$query->is_preview){
$query->set( 'post_status' , 'publish');
}
}

要するに、公開されているものを開けばよいのですが、なぜ下書きのものを取得しようとしてしまうのか、不思議です・・・

なお、この方法で404エラーは回避できますが、もう1つ問題があります。

該当の公開中の記事を編集すると、こっちは重複を回避しようとしてスラッグ名の後ろに「-2」がついて保存されてしまうことです。(なんでやねん)

スラッグ名が変わっても、一応リダイレクトしてくれるみたいですが、下書きの方の記事が「hoge」で公開保存されたら、完全に入れ替わっちゃいます。

結局気を付けるしかないのが現状ですね・・・

 

冒頭でも書いていますが、これはバージョン4.7.1で起こっています。

もしかしたらこれより古いバージョンでは起きないかもしれません。

また、さらにバージョンアップされたら起きなくなるかもしれません(というか起きなくなってくれ)

日々の生活にhappyをプラスする|ハピタス

このエントリーをはてなブックマークに追加

LINEで送る

総合管理者 | 2017年01月20日 | コメント(0) | トラックバック(0) | CMS関連

トラックバック

トラックバックURL

コメントする

※メールアドレスが公開されることはありません。

名前 *
メール*
URL
Copyright(c) 2010 - 2017 ダリの雑記