投稿前に同じslugが見つからなくても、公開記事の一覧だけを調べていた可能性があります。WordPressの投稿一覧は標準では公開済みを対象にするため、下書きや予約も必要に応じて確認します。
事前確認と保存後の確認を組にします。slugの検索だけで、同時に行われる別の作成まで防げると考えないようにしてください。
候補slugを原稿一覧で点検する
まず、今回投入する原稿の中に同じslugがないかを調べます。同じ題名の記事を再作成するのか、既存記事を更新するのかも分けます。更新する記事なら、slugから推測するだけでなく既存の投稿IDを使います。
英数字の名前を決める場合も、機械的に短くすることだけを優先せず、記事の内容を見分けられる名前にします。公開済みURLを変える作業は、新規下書きのslugを決める作業と分けて扱います。
状態ごとに一覧を確認する
次は読み取り用URLの例です。example.comは説明用のドメインです。下書きなどの取得には認証と権限が必要です。
GET /wp-json/wp/v2/posts?slug=csv-summary&status=publish
GET /wp-json/wp/v2/posts?slug=csv-summary&status=draft&context=edit
GET /wp-json/wp/v2/posts?slug=csv-summary&status=future&context=edit
運用に応じてpendingやprivateの対象も確認します。取得できない状態がある場合は「重複なし」とせず、確認できた範囲を残します。投稿タイプが違うURLや、サイト固有のパーマリンク設定まで、この記事の検索だけで確認できるとは限りません。
作成直後のslugを読み直す
保存後に返ってきたidとslugを記録し、予定した値と比べます。WordPressが保存した値を使って管理画面やURLを確認し、入力側の予定値だけを結果の記録にしないようにします。
作成の直前と直後の間に、別の処理が投稿を作る場合もあります。事前検索は重複を減らす確認であり、サーバー側の排他制御や完全な重複防止を保証するものではありません。
重複や想定外の値が見つかった場合
結果が違った場合も、既存の記事を自動で削除したりURLを上書きしたりせず、原稿と保存結果を照合します。この記事では検索の考え方とURL例を示しており、実サイトの投稿作成やslug変更は行っていません。
| 状態 | 次に確認すること |
|---|---|
| 既存の同じ記事がある | 新規作成を止め、そのIDを更新対象にするか判断 |
| 別の記事が同じ候補を使う | 内容を見分けるslugへ原稿側の候補を直す |
| 返却slugが予定と違う | 今回のID、既存投稿、公開状態を照合 |
| 応答がなく保存結果が不明 | 下書き一覧を確認してから再送を判断 |
