Skip to content

EP-033 daily_article_what_day_from_mail(日別記事 エスパスの〇〇の日候補抽出) ​

← EP-一覧 · DailyArticlePostType README

概要 ​

日別記事の編集画面(基本情報メタボックス「エスパスの〇〇の日」)から、考察日のエスパスの P-WORLD メール文言を材料に「〇〇の日」の候補を返す。EP-026 の姉妹。ハンドラは候補 JSON のみ返し、post meta(espasu_what_day_manual)への自動保存はしない。db_what_day_master への自動登録もしない。LLM・画像の文字読み取りは使わない。

処理順:

  1. 考察日(Y-m-d)とホール エスパス秋葉原 で、記事に表示するメール(find_for_article_display_by_halls)を取得する。件名と processed_html のプレーンテキスト(<br> やブロック要素の終わりを改行にする)が全て空なら失敗
  2. 照合先は考察日の月日 mmdd の表示対象マスタ(select_visible_by_mmdd。API-001-5 と同じ集合)
  3. 本文の「M月D日は何の日?」見出し(全角数字可)のうち、日付が考察日の mmdd と一致するものに続く「・」始まりの行を名前として読む。見出し直後の「(雑学ネタ帳調べ)」のような括弧だけの行は読み飛ばし、それ以外の行で一覧を終える。名前の絵文字は除く
  4. 一覧が 1 件以上あれば、各名前をマスタ名と正規化キー(絵文字・記号・句読点・空白を除き、全角英数とカナ幅と大文字小文字を揃える)の完全一致で照合する。一致は matched(source: "mail_list")、不一致は unmatched_names
  5. 一覧が無ければ、件名・本文を 1 行ずつ、マスタ名の正規化キー(2 文字以上)が含まれるかで照合する(source: "text")。行・メールをまたいだ一致はしない。
    • 一致箇所の直前の文字(記号・空白を除く前の元の行で見る)が漢字・かな・英数字なら採用しない。マスタに「肉の日」しか無くても「焼肉の日」からは拾わない。「本日は肉の日」のように文中に続けて書かれたものも拾わない(行頭・空白・記号・絵文字の直後なら拾う)
    • 長い名前から照合し、採用した箇所は以降の照合から外す。マスタに「夫婦の日」と「いい夫婦の日」の両方があれば「【いい夫婦の日】」からは「いい夫婦の日」だけを拾う(「夫婦の日」だけでも直前が「い」なので拾わない)

POST パラメータ ​

フィールド必須型・制約説明
action○文字列daily_article_what_day_from_mail
_wpnonce○文字列daily_article_what_day_from_mail で発行した nonce。nonce でも受け付ける
post_id○正整数対象の daily_article 投稿 ID
kousatsu_date−文字列画面上の考察日(Y-m-d)。キー送信時は空でも保存済み meta より優先(未送信時のみ meta)

編集画面は #daily-article-kousatsu-date-input の現在値を(空でも)常に POST する。ボタンはエスパスが対象ホールに選ばれているとき(欄が表示されているとき)だけ出る。

成功時 data ​

論理名物理名型説明
一致候補matchedarray{ id: number, name: string, source: "mail_list"|"text" } の配列。name はマスタ表記
未登録候補名unmatched_namesarray「何の日?」一覧にあるがマスタに無い名前(絵文字除去済み)。本文照合では空

画面は matched の name を空いている入力欄へ入れ(足りなければ欄を足す)、既にある名前(絵文字・空白違いを含む)は足さない。既に入っている値は変えない。ただし自動で入れるのは source: "mail_list" だけ。source: "text" は確度が低いので「本文から拾った候補(要確認)」として、unmatched_names は「メールにあるがマスタに無い名前」として、それぞれ「入力欄に追加」ボタン付きで表示し、押したものだけ入れる。

送信した考察日と応答を受け取った時点の考察日が違えば応答を捨て、STATUS_KOUSATSU_DATE_CHANGED を出す。考察日を変えたとき(dailyArticleKousatsuDateChanged)は表示中の候補とメッセージを消す。

失敗・ブロック(success: false の data に含み得るキー) ​

条件message の内容
AJAX コンテキスト外・nonce 不正Messages::AUTH_FAILED
post_id が不正、または投稿タイプが daily_article でないDailyArticleWhatDayFromMailCopy::INVALID_POST
edit_post 権限なしMessages::PERMISSION_DENIED
考察日が未設定・不正DailyArticleWhatDayFromMailCopy::MISSING_CONTEXT
対象日のエスパスのメール文言が無いDailyArticleWhatDayFromMailCopy::NO_MAIL

考察日未設定・メール無しでの失敗は、ハンドラが [DailyArticleWhatDayFromMailAjaxHandler] <message> を error_log に出す。

権限 ​

  • ログイン必須(wp_ajax_ のみ。nopriv は付けない)
  • capability: edit_post(対象 post_id)

第 1 段階で入れていないもの(Issue #3733) ​

  • 画像(チラシ・GIF 静止画)の文字読み取り。Issue 案の Claude / Gemini Vision フォールバック(ADM-028 のキー流用)は未実装のため、API キー未設定時の案内も無い
  • エスパス以外のホールのメール
  • マスタ未登録名のマスタ登録

関連 ​

  • EP-026(ホール別イベント候補抽出)
  • API-001-5 〇〇の日オプション(GET /wp-json/daily-article/v1/what-day-options?mmdd=)
  • 〇〇の日マスタ管理: ADM-004