同じ記事を11本つくってしまった|WordPressの重複投稿を止めるチェック

同じ作品を紹介する記事を、11本ぶん二重に作ってしまいました。公開したその日は気づかず、翌日に在庫を数えていて発見した、という間の抜けた見つかり方です。

原因は「重複チェックをしていなかった」ではありません。チェックはしていて、その方法に穴がありました。同じ穴は、記事数が増えたブログならどこでも空きます。何が起きたのかと、どう直したかを書きます。

先に結論:IDで照合すると、IDを持たない記事に当たらない

やったこと 結果
照合キー 商品IDと品番(数字) 数字を含まないスラッグには構造上ぜったい当たらない
スラッグの形式 運用中に3回変わっていた 初期の記事だけ数字が入っていなかった
気づけた場所 翌日の在庫棚卸し 公開直後の検証では見えなかった

公開前に「未公開のものだけ選んだ」と確認したつもりでいました。確認の網が、対象の一部を最初から見ていなかっただけです。

何が起きていたのか

そのブログのURLは、運用しながら3回形式が変わっていました。

  • 初期:/名前-作品名ローマ字/ ← 数字がひとつも入らない
  • 中期:/prefix-品番-連番/
  • 現在:/名前-商品ID/

私が書いた重複チェックは、公開済みスラッグを1本の文字列につないで、候補の商品IDや品番がその中に含まれるかを見るものでした。中期と現在の形式には効きます。初期の形式には、当たりようがありません。

しかも厄介なことに、この方法は7件は正しく検出しました。「ちゃんと動いている」という手応えがあったので、余計に疑いませんでした。部分的に当たる検査がいちばん危ないと思います。

直し方:数字ではなく「名前」で引く

WordPressのREST APIには検索パラメータがあります。ログインも不要です。

const j = await (await fetch(
  '/wp-json/wp/v2/posts?per_page=20&search=' + encodeURIComponent(作品名)
  + '&_fields=id,slug,title,date'
)).json();

// タイトルに固有名詞(人名・施設名など)も含まれていれば重複
j.filter(x => x.title.rendered.includes(固有名詞));

ポイントは2つの語で絞ることです。作品名だけだと一般語に引っかかり、人名だけだと同じ人の別記事が全部出ます。両方が入っているものだけを重複とみなすと、実用上ちょうどよくなりました。

スラッグは表記ゆれ・ローマ字ゆれ・形式変更でいくらでも変わりますが、タイトルに入る固有名詞は変わりません。だから照合キーとして安定します。

投稿する直前に回す

もうひとつ変えたのはチェックのタイミングです。以前は「候補を選ぶとき」に一括で照合していました。いまは1本POSTする直前に、その1本ぶんだけ引いています。

for (const item of items) {
  const dup = await 重複チェック(item);
  if (dup.length) { skip(item); continue; }   // ここで止める
  await 投稿する(item);
}

まとめて事前チェックすると、チェックしてから投稿するまでの間に前提が変わっても気づけません。ループの中に入れておけば、その1本については必ず最新の状態で見ています。処理は10本で数秒しか増えませんでした。

どちらを残すか

重複が見つかったあと、消すのは新しく作ったほうにしました。古いほうにはインデックスの履歴と掲載順位があるからです。実際、片方は検索の掲載順位5位台をすでに取っていました。

そして削除ではなく下書きに戻しました。新しく作った側にはアイキャッチや構造化した本文が入っていたので、古い側に足りない要素があれば移植する材料になります(今回は古い側にも全部入っていたので、そのまま下書きに置いてあります)。

残した記事の内部リンクが、下書きにしたURLを指したままになる点だけ注意です。下書き化とリンクの貼り替えはセットで終わらせてください。

この件から一般化できること

  • 照合キーは、途中で変わらないものを選ぶ。URLやIDより、タイトルの中の固有名詞のほうが安定していた
  • 部分的に当たる検査を信用しない。7件見つかったから正しい、とはならない
  • チェックは実行の直前に、1件ずつ。事前の一括確認は、実行までの間に古くなる
  • 間違いは消さずに下書きへ。直すときの材料になる

よくある質問

プラグインで防げませんか?

タイトル完全一致の重複を弾くプラグインはありますが、今回のようにタイトルの書き方が違う(同じ作品で別の表現)ケースは弾けません。何を同一とみなすかは、そのサイト固有の判断になります。

Search Consoleで気づけますか?

いずれ重複コンテンツとして表れますが、公開直後には出ません。数日から数週間かかります。公開前に自分で止めるほうが確実です。

何本くらいから危なくなりますか?

本数よりもURLの付け方を一度でも変えたかどうかだと思います。変えた瞬間に、古い記事と新しい記事で照合キーが揃わなくなります。

おわりに

記事を機械的に増やせるようにすると、間違いも機械的に増えます。今回は11本でしたが、チェックの穴に気づかないまま続けていれば、もっと増えていました。

速く出せるようにしたなら、同じ速さで止められるようにしておく。そこまでで1セットだと思っています。

あわせて読みたい

この記事が参考になったら、ランキングの応援をお願いします。

にほんブログ村 小遣いブログ 副業・副収入へ にほんブログ村 小遣いブログ 在宅ワークへ
おすすめの記事