新規ページのメタボックスのデフォルト値を自動で指定する

ページには属性メタボックスがあり、[親][テンプレート][順序]をそれぞれ指定することができます。例えばクライアントでページを追加できるようにした場合、それらを「クライアント追加分」としてグルーピングしておくと便利だとか、決まったレイアウトで表示したい(=テンプレートを指定)という流れになりがちです。そしてできれば、それをクライアント様にわざわざ入力していただくのもアレだし、入力ミスがあるととてもメンドウな事になりますから、デフォルトで任意の値に設定しておきたいとなるわけです。そんなときは、新規ページ作成時にメタボックス表示前のアクションをフックしてデフォルト値をいじってしまえば OK 。

例えば、新規ページの属性メタボックスの[親][テンプレート]のデフォルト値を任意に設定する(フォーラムネタ)なら、functions.php に以下を追加すれば OK。

function my_meta_box($page, $context, $post){
  if('page' == $page && 'side' == $context && 0 == $post->ID){
	if(0 == $post->post_parent && 'default' == $post->page_template){ // 無くてもOK
	  $post->post_parent = 3; // デフォルトにしたいページID
	  $post->page_template = 'page-home.php'; // デフォルトにしたいページテンプレートファイル名
	}
  }
}
add_action('do_meta_boxes', 'my_meta_box', 10, 3);

新規ページの画面が表示されるまでの流れを調べる(抜粋)

  1. wp-admin/page-new.php から開始。
  2. 24行目でデフォルト値を取得。この関数内でのフィルタはタイトル・本文・抜粋だけなので利用できず。
    $post = get_default_page_to_edit();
  3. 26 行目 wp-admin/edit-page-form.php をインクルード。
  4. 78行目〜 メタボックスを追加。
    add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', 'page', 'side', 'core');
    add_meta_box('pageparentdiv', __('Attributes'), 'page_attributes_meta_box', 'page', 'side', 'core');
        :
    対象のメタボックスは page_attributes_meta_box。でも今回はメタボックスが何かは気にしなくて OK。
  5. 95行目〜 各コンテキスト(normal, advanced, side)のメタボックスについて do_meta_boxes アクションが呼ばれる。
    do_action('do_meta_boxes', 'page', 'normal', $post);
    do_action('do_meta_boxes', 'page', 'advanced', $post);
    do_action('do_meta_boxes', 'page', 'side', $post);
  6. 102行目〜 HTML出力。
  7. 131行目 page_attributes_meta_box が属する side コンテキストのメタボックスを出力。
    $side_meta_boxes = do_meta_boxes('page', 'side', $post); ?>
    5.の do_meta_boxes はアクションですが、こちらはメタボックスの HTML を出力するファンクションです。名前は同じだけど別物なので混同しないように。

ということで、デフォルト値をいじれるのは do_action('do_meta_boxes', 'page', 'side', $post) のタイミングと判明しました。

do_meta_boxes アクションでデフォルト値を設定する

PHP5から関数の引数がオブジェクトだと参照渡しになります。なので、do_meta_boxes アクションをフックした関数内で引数 $post を変更すれば、それがデフォルト値になります。
新規ページなのかどうかは 'page' == $page && 0 == $post->ID で判断できます。最低限それだけ確認して、お好みのデフォルト値を設定すれば OK です。

タイトル・本文・抜粋のデフォルト値を変更する方法

これらは get_default_page_to_edit() 内で以下のようにフィルタが呼ばれてるのでそれを利用すると楽チンです。投稿・ページの両方に作用します。

$post->post_content = apply_filters( 'default_content', $post_content);
$post->post_title = apply_filters( 'default_title', $post_title );
$post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt);

例)忍者ブログでデフォルトのタイトルを「でござるの巻」にする場合。

function my_default_title($post_title){
  return $post_title . 'でござるの巻';
}
add_filter( 'default_title', 'my_default_title')
参照:
フォーラム:ページの新規作成時、親とテンプレートを自動選択したい
動作確認バージョン
  • WordPress 2.9.1
  • PHP 5.2.1

3 Comments

  • すごいよまさるさん。じゃなかったkzさん。
    フォーラムの回答の奥にこんな解説まであるとわ。
    勉強になります!_〆(゚▽゚*)

    • kz kz

      解決に至るまでのプロセスを知ることで
      理解の助けとかWPistの技術レベルの向上に役立つといいなって感じです。
      ステキだな俺、ウットリ。

  • こういうのは些細なことだけど、実案件では結構重要だったりする