記事タイトルに自動でカテゴリーを追加して投稿する

記事タイトルにカテゴリが入っているのはとても親切ですよね。いろんなサイトでよく見るのがタイトル左端に[カテゴリ1][カテゴリ2]・・・・と連なっているようなあれです。

WordPressでタイトルを自動作成 | com4tis
カスタムフィールドなどを使うときにタイトルを使用しない場合や、 タイトルには決まった値(カテゴリ + 〇〇)などの場合にタイトルを自動化する方法です。 …
参考にさせていただきました。

常々探していたのですが、この度参考になる記事を見つけたのでチャレンジしてみました。

function replace_post_title($title) {
  global $post;
// 記事かどうかを判別する。
  if ($post->post_type == 'post') {
    $countv = count($_POST[post_category]);
//  カテゴリの数が一つ以上かどうか判別する。一つだった場合は問答無用でそのカテゴリを設定。
    if ($countv == "1") {
      $catname = get_cat_name($_POST[post_category][0]);
      $titlecat = "[" . $catname . "]";
    } else {
      for ($i = 0; $i < $countv; $i++) {
        $cat = get_category($_POST[post_category][$i]);
        $catfad = $cat->parent;
//     親カテゴリなら切り捨て、次の回へとスキップ
        if ($catfad == "0") {
          continue;
        }
        $catname = get_cat_name($_POST[post_category][$i]);
//     カテゴリーが空欄じゃなければカテゴリを連ねていく。
        if ($catname != "") {
          $titlecat .= "[" . $catname . "]";
        }
      }
    }
//    このままでは記事を更新するたびに[カテゴリ]が文字通りネズミ算で増えていくので正規表現でカテゴリを除去したのちに設定しなおす。
    $title = preg_replace("/^([(.?|.*?)])+/iu", "", $title);
    $title = $titlecat . $title;
  }
  return $title;
}
add_filter('title_save_pre', 'replace_post_title');

 

私のブログでは親カテゴリを記事タイトルに連ねてもあまり意味が無いので省くようにしています。

記事の情報を取得するのに、「$post」と「$_POST」を利用しているけれど、「$post」は既に保存された情報を抜き出すのに利用している。「$_POST」は今まさにwordpressに送信している情報から抜き出している。「$post」からカテゴリー情報を抜き出すと、既に保存された設定カテゴリーを返す。

例えば、既に作成されたカテゴリー1の記事を編集していて、カテゴリー2もやっぱり追加するとする。記事更新を押した瞬間上記スクリプトが走るわけだが、この場合「$_POST」には今まさに送信している情報、「カテゴリー1、カテゴリー2」が収納されている。対して「$post」は既に設定されていた情報である「カテゴリー1」のみしか収納されていない。「$post」に「カテゴリー2」が追加されるのは上記スクリプトが走った後というわけだ。

title_save_preというフックは、記事を保存する前にタイトルを抜き出すというもので、それぞれの関数のタイミングを理解していないと意外と手間取る。簡単だと思っていたのに結構時間がかかってしまったわ。

じゃあ全部「$_POST」を利用すればいいんじゃないか、と気づいたのは完成したあとだったり。とほほ。精神状態が安定しないから記事の口調も定まっていない次第。