期限超過したWordPress下書きを日次公開とは別枠で回収する


期限超過したWordPress下書きを日次公開とは別枠で回収する

WordPress記事を毎日1本ずつ公開する運用では、公開サイクルが安全弁になる一方で、別の問題も起きる。たとえば「実践記事の日」「情報記事の日」のように日次サイクルを持たせると、公開予定日を過ぎた下書きが別カテゴリに残っていても、その日のサイクルに合わなければ拾われない。今回は、Hermes AgentのWordPress日次投稿スクリプトに、期限超過下書きの回収処理を追加した。

実際に行ったことと確認結果

手元の実装では、Blog用Vault内の記事一覧を公式Obsidian CLIで読み、`status: draft`、未同期、公開予定日時が現在時刻以前の記事を抽出する関数を追加した。通常の1日1記事サイクルとは別に、期限超過候補を先に処理し、公開済みになった記事は通常候補から除外する。公開時は既存のWordPress投稿処理を再利用し、REST APIで公開状態を読み戻し、公開URLのHTTP応答とコメント停止も確認する。

確認として、`uv run python -m unittest discover -s tests -p 'test_wordpress_daily_publish.py' -v` を実行し、3件すべて成功した。テストでは、JSTの日時解析、公開予定日を過ぎた実践記事と情報記事をサイクルに関係なく両方抽出すること、未来日・公開済み・WordPress投稿ID付きの記事を除外すること、cron配備先からでもプロジェクトを解決できることを確認している。

仕組みの流れ

処理は次の順番にした。

1. Obsidian CLIの`files`でBlog用Vaultの記事候補を列挙する。
2. 各記事を`read`し、frontmatterの`status`、`publish_date`、`article_type`、WordPress同期情報を読む。
3. `publish_date <= now`で、まだ公開・同期されていない記事を期限超過候補にする。
4. 期限超過候補があれば、通常サイクルより先に公開処理へ渡す。
5. WordPress REST APIで作成または既存下書きを公開へ更新する。
6. API読み戻しと公開URL確認後、Obsidian側の状態を`published`へ同期する。
7. 通知本文には、通常枠か期限超過回収かを分けて出す。

この変更で、日次サイクルは維持しながら、過去日の下書きが静かに滞留する状態を検出できるようになった。

再現手順

まず、Blog用Vaultの記事frontmatterをそろえる。公開例では値をプレースホルダーにする。

“`yaml
status: draft
publish_date: 2026-09-01T07:00:00+09:00
article_type: 実践連載
slug: example-draft
“`

次に、WordPress接続とObsidian CLIを環境変数で渡す。秘密値はGitや記事本文に置かない。

“`bash
WORDPRESS_BASE_URL=https://example.com
WORDPRESS_USERNAME=your-user
WORDPRESS_APP_PASSWORD=YOUR_WORDPRESS_APP_PASSWORD
WORDPRESS_OBSIDIAN_CLI=/path/to/obsidian-cli
WORDPRESS_OBSIDIAN_VAULT=Blog00
WORDPRESS_ENABLE_PUBLISH_WRITES=true
“`

実装変更後は、まずテストとドライランで候補を確認する。

“`bash
python -m unittest discover -s tests -p 'test_wordpress_daily_publish.py' -v
python /path/to/project/wordpress_daily_publish.py –dry-run
“`

本番ではHermes cronから毎日実行し、出力に「期限超過記事」の件数と処理結果が出ることを確認する。

失敗しやすい点と安全策

注意点は、期限超過だからといって無条件に公開しないことだ。本文の秘密情報検査、カテゴリ照合、同一slug確認、既存下書きの投稿者確認、コメント停止、公開URL確認は通常公開と同じ経路を通す。既に`wordpress_post_id`がある記事は別の同期状態を持つため、期限超過候補から外す。

また、複数の期限超過記事を処理すると公開本数が増える。確認日現在の手元実装では回収を優先する設計だが、サイトの運用方針によっては一回の回収上限を設けた方がよい。投資・会計・法務など判断を含む記事は、自動公開ではなく人の確認を残す。

再現チェックリスト

  • [ ] Obsidian CLIで記事一覧と本文を読める。
  • [ ] `publish_date`をAsia/Tokyo基準で比較している。
  • [ ] 未来日、公開済み、既にWordPress投稿IDがある記事を除外している。
  • [ ] 通常サイクルと期限超過回収を通知上で区別している。
  • [ ] WordPress APIの公開状態、公開URL、コメント停止を読み戻している。
  • [ ] Obsidian側のfrontmatterを公開後に同期している。

公式一次情報

  • [Hermes Agent Scheduled Tasks](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron)
  • [WordPress REST API: Posts](https://developer.wordpress.org/rest-api/reference/posts/)
  • [Obsidian CLI](https://help.obsidian.md/cli)

Back to top