Yoast Duplicate Post で「書き換え&再公開」が表示されない不具合あった時のメモ

普段 Yoast Duplicate Post という、すでに公開されている投稿を更新したい時に、差し替え用の投稿を作成できる「書き換え&再公開」という便利な機能を備えたプラグインを使っているのだが、何度か使っているうちに特定の投稿で「書き換え&再公開」が表示されなくなってしまった。

原因は複数記事の予定投稿(同時刻指定)?

どんな時に起こるのかを知りたかったので、固定ページで「書き換え&再公開」を何回か試してみた。
すると、複数のページに対して同時刻の予約再公開を設定し再公開が実行された後に「書き換え&再公開」が表示できなくなるページがあるのを1回だけ確認できた。
たまたまだろうか?他のケースもありそう…

再公開自体は完了しているので、オリジナルページの内容は書き換え用ページの内容に置き換わっている。
しかしページのカスタムフィールドには、すでに書き換えられいるのに「この ID のページで書き換えられますよ」という _dp_has_rewrite_republish_copy が残っていた。
_dp_ の部分は duplicate post の略だろうか?

アンダースコア付きのフィールドは通常は非表示だが、functions.php に以下のフィルターフックを追加することで表示されるようになる。

// functions.php
// ページ編集画面で隠しカスタムフィールドを表示
add_filter( 'is_protected_meta', '__return_false' );

_dp_has_rewrite_republish_copy を削除で解決

編集画面では削除できない

_dp_has_rewrite_republish_copy を削除すれば再度「書き換え&再公開」が可能になるようなので、ページ編集画面から削除ボタンをクリックして試みた。だが削除する権限が無いと言われて削除できなかった。

phpMyAdmin で削除

編集画面からは無理っぽいので、phpMyAdmin を使って wp_postmeta テーブルを編集した。
「書き換え&再公開」を使えるようにしたい投稿の post_id のレコードを削除する。
現在書き換え編集中の記事のメタフィールドも表示されるので、削除には注意する。

削除後は無事に表示されて、再度「書き換え&再公開」が可能になった。

_dp_ が付くフィールドが他に無いか、少し調べてみた

複製された書き換え用の投稿にもあった

_dp_とプレフィックスが付く meta_key が他に無いか調べてみるといくつかあった。
オリジナルの投稿から複製された書き換え用の投稿には、3つ _dp_ が付くフィールドがあった。

  • _dp_creation_date_gmt … 複製した時間(9時間早い時間になってる、タイムゾーン的な?)
  • _dp_is_rewrite_republish_copy … 書き換え用の投稿であることを示している。1を0にするとただの下書きになった。
  • _dp_original … この投稿のオリジナルの投稿ID。この数字のIDの内容を書き換える。

_dp_has_been_republished

wp_postmeta テーブルには、meta_key が _dp_has_been_republished というレコードもあった。
そのレコードの post_id を元に wp_posts テーブルを調べると、post_status が dp-rewrite-republish という投稿のレコードが見つかった。

この投稿データは WordPress の管理画面には表示されていなかった。
内容を確認してみると、すでに書き換えに使った後の書き換え用の投稿データが、そのまま削除されずに残っているように見える。
しかも「書き換え&再公開」が表示されない不具合のある投稿の書き換え用の投稿データのようだ。

プラグインのコードをしっかり読めば分かるのだろうけど、面倒なので現状から推測する。
再公開は成功したけど、その後の「書き換え用の投稿データ」の削除に失敗ということでデータが残っているっぽい。
さらにオリジナル投稿の _dp_has_rewrite_republish_copy のカスタムフィールドも残ってしまっているのかな?どちらを先に処理するかは分からないけど…

post_status が dp-rewrite-republish の投稿データを削除

書き換え済みでなおかつ管理画面からアクセスできない不必要と思われる投稿データが残っているのは、なんだか気持ち悪いので削除してみた。
本当に不必要かどうかは分からないけど..まぁバックアップもして自己責任ということで。

削除方法としては、post_status が dp-rewrite-republish の投稿を wp_delete_post() を使って削除した。
wp_delete_post() は引数で渡した post_id の投稿に関連するカスタムフィールドなども同時に削除してくれる。

削除しても、今のところ問題ないように見える。

とりあえず問題は解決できたので良かった。
もし時間があったら、Yoast Duplicate Post のプラグインのコードちょっと覗いて、不具合のある投稿のカスタムフィールドと孤立した投稿データの削除を簡単にできるプラグインも自作してみたい。(しないと思うけど…)

ページの先頭へ