カスタムポストのタイトルを自動化しよう その2

2012.11.13(火) WordPress, 機能, 関数
このエントリーをはてなブックマークに追加

以前、「カスタムポストのタイトルを自動化しよう」という記事を投稿したんですが、少しというか、大分というか不具合があったので、再度チャレンジしました。



どのフィルターorフックを使えばいいのか?

そもそも、タイトルを自動化するには、記事をDBに登録する前に、タイトルを変更して、タイトルをDBに登録してしまおうという方法で、そのタイミングを「title_save_pre」でフィルターして取得できたかなと思っていたのですが、どうやら下書き保存時のタイトルを登録するまえのタイミングで呼び出されているみたいで、本登録のタイミングでは呼び出されてませんでした。ですので、下書き保存せずに直接公開するとタイトルがうまく切り替わりません。

ですので、本登録時に呼び出されそうなフィルター「title_edit_pre」「sanitize_title」などで試してみたものの、やっぱりうまくいかない。

DBに登録せず、表示するときに切り替えてみるか・・・

なので、少し方向転換して、DBには入れずに、出力するとにき変換してやればどうかと思って、「the_title」「single_post_title」などを試してみたところ、実はまあまあうまくいってました。ちなみに2つのフィルターで引っ掛けないと、管理画面上に反映されないとか、シングルページのページタイトルに反映されないとか、それぞれ足りない部分がありました。
ただ、一つ問題があって、the_titleは非常に広範囲に呼ばれているので、かなり制御しないと思っても見ないところに、自動化したタイトルが表示されてしまったりしました。なので、この方法もあまり良くないかなと思います。
 

やっぱり、初心に戻ってDBに登録したい

やっぱり、表示時に制御してやるよりも、DBに登録してしまったほうが楽だなと思い、再度アクションフィルター、フックあたりを試してみることに。特に、アクションフックはそれらしき「save_post」「wp_insert_post」とか、それらしきものがたくさんあるわけですが、いくらやってもタイトルが変わらない。
やはり、こういうときはソースを眺めるに限るということで、post.php辺りをひたすら眺めてたのですが、ようやくその謎が解けました。
save_post、wp_insert_postは、両方とも記事をDBに登録した後に呼び出されるので、そこでタイトルをいくら変更しても無駄なんです。じゃあ、preなんとかとか、なんとかpreじゃないの?とか思うわけですが、なんかピッタリのものはないわけです。
 

うーん、こうなったらもう自分でDB登録(実質はUpdate)するしかない!ということで、やってみたのが以下です。
 

function my_auto_title2($post_ID, $post){

 	global $wpdb;

 	/* ポストタイプがカスタムかどうかチェック */
	if( $post->post_type == 'lessons'  ){

		/* カスタムフィールドの取得 */
		$lesson_date = get_post_custom_values('lesson_date', $post_ID);
		if( $lesson_date ){
			$title_message = date('m/d',strtotime($lesson_date[0]));
		}
		else{
			$title_message = "NULLNULL";
		}

		/* lesson_timeをキーとして、練習時間を取得 */
	    $lesson_time = get_post_custom_values('lesson_time', $post_ID);
	    if( $lesson_time  ){
	    	$title_message = $title_message . '(';
			$title_message = $title_message . $lesson_time[0];
	    	$title_message = $title_message . ')';
	    }
		/* lesson_placeをキーとして、練習場所を取得 */
	    $lesson_place = get_post_custom_values('lesson_place', $post_ID);
	    if( $lesson_place  ){
			$title_message = $title_message . ' at ';
			$title_message = $title_message . $lesson_place[0];
	    }

		$where = array( 'ID' => $post_ID );
		$wpdb->update( $wpdb->posts, array( 'post_title' => $title_message ), $where );
		if ( $wp_error )
			return new WP_Error('db_update_error', __('Could not update post in the database'), $wpdb->last_error);
		else
			return 0;
	}

}

add_action('wp_insert_post', 'my_auto_title2', 10, 2);

 

$wpdb->updateとしているところがDB更新している所ですね。これでなんとかうまくいきました。
フィルターとかフックとか、もう少しタイミングと引数の説明がみれる資料とかあればいいのにと思いますが、その辺はオープンソース故、気付いた人がやるということなんでしょうね。ボクにはとても出来ませんが。。。

“カスタムポストのタイトルを自動化しよう その2” への3件のコメント

  1. kentaro より:

    はじめまして。こちらの記事で、ワードプレスのタイトル自動化が実現できました。ありがとうございます。

    ひとつご質問なのですが、このタイトル自動化について、管理画面の投稿一覧から「クイック編集」で記事を更新した際にも、同じアクションを起こす方法で何か良い案はないでしょうか?

    目的としては

    ・自動タイトルのテンプレートを修正した場合、クイック編集から更新をクリックするだけで修正したテンプレート通りにタイトルが修正される

    ・なんらかの不具合、アップデートが原因で、自動タイトルが初期化された際に、一括操作からの更新で管理画面上で自動タイトルが行える

    などが目的です。

    特に、複数の記事(あるいは全記事)をまとめて修正したいと思っており、何か良い方法はないでしょうか?

    もしヒントがございましたらご教授いただきたく思います。
    よろしくお願いいたします。

    • teru03 より:

      kentaro様

      コメントありがとうございます。
      クイック投稿ですか。個人的には使った事がないんですが、ちょっと調べてみます。期待せずにお待ちを〜。

    • teru03 より:

      あっ、クイック投稿じゃなくてクイック編集でしたね。

コメントをどうぞ