作業記録:PHPを書けない私が、ChatGPTとWordPressのシリーズ機能を作った話

今日やったこと

ブログ「だからなんだ。」で明日以降展開される予定の、複数回に分かれる記事を扱いやすくするため、
WordPressに「シリーズ記事」の仕組みを実装した。

テーマは、

覚えておくのではなく、安心して忘れられる仕組みにする。


1. シリーズ子記事を通常の記事一覧から隠す

シリーズの第1回、第2回……のような子記事については、
トップページやカテゴリー一覧などに単独で大量表示されると、
シリーズ全体の構造が分かりにくくなる。

そこで、子記事にはカスタムフィールド

series_child = 1

を付与。

PHP側で、

  • トップページ
  • カテゴリー一覧
  • タグ一覧
  • 日付別一覧

などでは、
series_child が付いている記事を除外するようにした。

一方、シリーズの親記事は通常どおり表示される。


2. シリーズ内の順番を series_order で管理

子記事にはさらに、

series_order = 1
series_order = 2
series_order = 3

……

のように番号を設定。

重要なのは、

シリーズ親記事には series_order を付けない。

という運用にしたこと。

つまり、

親記事
→ シリーズ全体の入口

series_order = 1
→ 第1回

series_order = 2
→ 第2回

という構造。


3. シリーズトップに自動目次を作成

シリーズ親記事の本文に、

というショートコードを置くと、
同じ「シリーズ」に所属する子記事を
series_order 順に自動取得して表示するようにした。

表示例:

第1回:○○
第2回:○○(近日公開)
第3回:○○(近日公開)

公開済みの記事はリンクになる。

予約投稿の記事は、
公開前はリンクなしで

(近日公開)

と表示される。

予約時刻を迎えてWordPress上で公開状態になると、
自動でリンクに切り替わる。

つまり、

「公開日にシリーズトップを編集してリンクを開通する」

という作業が不要になった。


4. 子記事からシリーズトップへ戻れるようにした

次に、
シリーズ子記事を直接読んだ人が

「これは何の記事の一部なのか」

分からなくならないように、
記事末尾へシリーズトップへのリンクを自動追加。

当初は、

←「○○」シリーズトップへ

という単独リンクだった。

ただし、
参考・出典が非常に長い記事では、
本文を読み終わった位置からリンクまでの距離が長すぎる。

そこで、

というショートコードも追加。

必要な記事では、
本文終了直後・出典の前など、
好きな位置にシリーズトップへのリンクを置けるようにした。

記事の最下部にも自動リンクは残るため、
長い出典の前後両方からシリーズへ戻れる。


5. 記事末尾を「シリーズナビ」に拡張

さらに考えてみると、
記事末尾が

シリーズトップへ

だけでは、
次回予告を書いた直後の導線として少し弱い。

そこで記事末尾の自動リンクを、
シリーズ全体のナビゲーションに変更。

第1回なら、

シリーズトップへ | 第2回(近日公開)

第2回が公開済みになれば、

シリーズトップへ | 第2回へ →

中間回なら、

← 第1回へ | シリーズトップへ | 第3回へ →

最終回なら、

← 第1回へ | シリーズトップへ

となる。

前後の記事は series_order を使って自動判定。

ここでも、
予約中の記事はリンクにせず

第N回(近日公開)

と表示する。


6. 結果としてできた構造

シリーズ親記事

  • シリーズ全体の説明
  • 各回への自動リンク

シリーズ子記事

  • series_child = 1
  • series_order = N
  • 通常一覧からは非表示
  • 記事末尾に前後ナビを自動表示
  • 必要なら本文途中に

構造としては、

シリーズトップ
↓
第1回
↓
第2回
↓
第3回

と読み進められる一方で、

各記事
↓
シリーズトップ

にも戻れるようになった。


7. WAF犬との戦い

Code SnippetsでPHPを保存しようとすると、
何度か

Request failed with status code 403

が発生。

最初はコードミスを疑ったが、
原因はConoHa WINGのWAF。

Code Snippetsの

wp-json/code-snippet…

への保存リクエストが、

SQLインジェクション
XPathインジェクション

などの可能性として検知されていた。

一時的にWAFをOFFにすると保存成功。

作業後はWAFをONに戻して戸締り確認。

今日の教訓:

403が出たら、まずコードを見るな。犬を見ろ。


8. PHPを「書けなくても読む」話

作業の最後に、
PHPそのものについて少し確認。

たとえば、

‘post_status’ => array( ‘publish’, ‘future’ ),

は、

公開済みの記事
+
予約中の記事

の両方を対象にする指定。

array は、
複数の値をひとまとめにする箱。

今日のPHPは大きく見ると、

  1. WordPressから情報を取得する
  2. 条件を判断する
  3. HTMLを作る
  4. WordPressへ返す

という流れになっている。

PHPを書けるようになることより先に、

「このコードは何をWordPressに頼んでいるのか」

くらいは読めるようにしておくと、
AIにコードを書かせる場合でも中身を監査しやすい。


今日の作業全体を通して、
ブログ運営の考え方がかなり明確になった。

覚えておくために仕組みを作るのではない。

忘れても困らないように仕組みを作る。

予約投稿した記事のリンク開通日時を覚えておく必要はない。

シリーズの次回リンクを公開日に手作業で直す必要もない。

必要な情報だけ設定しておけば、
あとはWordPressが処理する。

「だからなんだ。」は、
思考を保存する場所であると同時に、
安心して忘れるための装置にもなりつつある。


私とチャッピーの分業

さて、ここからが本題のAIとの協業の話である。

今回の作業では、
私はPHPを1行も書いていない。

代わりに私がやったのは、

  • どんな動作にしたいか決める
  • 実際のブログ画面を見ながら違和感を拾う
  • 「親記事と子記事の関係」を整理する
  • 表示位置や導線を判断する
  • 実際にWordPressへコードを入れて動作確認する
  • 403などのエラーが出たとき、管理画面やWAFログを確認する

といった部分。

一方、チャッピーには、

  • 要件をPHPの処理に落とす
  • Code Snippets用のコードを書く
  • 修正箇所を具体的に示す
  • エラー原因の候補を整理する
  • 実装後の挙動を説明する
  • series_child / series_order / shortcode の関係を言語化する

といった部分を任せた。

それを、

私:
「こう動いてほしい」
「ここは変じゃない?」
「この位置のほうが自然では?」

チャッピー:
「では、その仕様ならこう実装できます」

という往復で作業した。

最終的な判断は、
実際にブログを見ている私が行い、
コード化はチャッピーが担当する。

言うなれば私の担当は、わがままを言うこと。

ただし、ここでいう「わがまま」は、要件定義に近い。
「こうしたい」「これは嫌だ」「ここは自動にしたい」と言い続ける。
その曖昧な希望を、チャッピーがPHPの条件分岐やWordPressの処理に翻訳していく。

「子記事は一覧から隠したい」
「でもシリーズトップには出したい」
「予約中は近日公開にしたい」
「公開されたら勝手にリンクになってほしい」
「子記事からトップに戻りたい」
「いや、前後記事にも移動したい」
「参考が長い記事は途中にもリンク欲しい」
「でも普段は自動がいい」

非エンジニアの私の本分は、わがままを具体化することだった。

今回の作業で面白かったのは、
私がPHPを書けなくても、
コードの中にある

publish
future
array
series_child
series_order

といった要素を追っていくことで、

「いま何を条件にして、何を探して、何を表示しているか」

くらいは少しずつ読めるようになったこと。

生成AIを使うと、
プログラミングが完全にブラックボックスになるとは限らない。

むしろ、

「自分は仕様を決める」
「AIはコードを書く」
「自分は結果を見て修正する」

という分業を繰り返すことで、
仕組みそのものへの理解は深まることもある。

Share on X

コメントを残す

コメントについて

コメントは公開前に運営者が確認しています。投稿後すぐには表示されません。

スパムや誹謗中傷などを防ぐためのもので、意見の違いだけを理由に非公開にはしません。お気軽にコメントをお寄せください。