web-dev-qa-db-ja.com

既存のメタボックスを新しいカスタム投稿タイプに追加する

"post"と "pages"の投稿タイプに追加されるカスタムメタボックスをいくつか作成する親テーマと、そのテーマによって作成されるいくつかの投稿タイプもあります。

私の子テーマでは、新しいカスタム投稿タイプをいくつか作成しました。そのため、自分の子テーマのどこかに関数を追加して、これらの既存のメタボックスを自分の子テーマで定義した新しい投稿タイプに追加します。

私はすでに多くのことを試してみましたが、いずれの場合も、親テーマのメタボックスファイルを編集することを除いて、メタボックスをカスタム投稿タイプに追加することはできません。

私はこれを行う方法を学びたいと思います。私のやり方を教えてもらえますか。

ありがとう

3
Zach Nicodemous

これはあなたの親テーマがどのようにmeta_boxにフックするかに依存します。コールバックがadd_meta_boxesにフックされて、Codexから次のように書かれるならば:

function myplugin_add_meta_box() {

    $screens = array( 'post', 'page' );

    foreach ( $screens as $screen ) {

        add_meta_box(
            'myplugin_sectionid',
            __( 'My Post Section Title', 'myplugin_textdomain' ),
            'myplugin_meta_box_callback',
            $screen
        );
    }
}
add_action( 'add_meta_boxes', 'myplugin_add_meta_box' );

そうすれば、ファイルをハッキングせずにボックスを追加できなくなります。その$screens = array( 'post', 'page' );とそれに続く配列はそれを防ぎます。

同様に、追加することはできません:

function adding_custom_meta_boxes( $post_type, $post ) {
  if ('abcd' == $post_type) return;
  add_meta_box( 
      'my-meta-box',
      __( 'My Meta Box' ),
      'render_my_meta_box',
      'post',
      'normal',
      'default'
  );
}
add_action( 'add_meta_boxes', 'adding_custom_meta_boxes', 10, 2 );

if ('abcd' == $post_type) return;はそれを防ぎます。

ただし、ポストタイプ固有のフックでフックされている場合は 推奨どおり ...

add_action( 'add_meta_boxes_post', 'adding_custom_meta_boxes' );

...他の人を追加するのは簡単です。

add_action( 'add_meta_boxes_mytype', 'adding_custom_meta_boxes' );
add_action( 'add_meta_boxes_myothertype', 'adding_custom_meta_boxes' );
1
s_ha_dum

親テーマが定義してadd_meta_boxesにフックする関数が見つかった場合は、アクションを削除して子テーマで再定義できます。

function my_child_theme_meta_box_override_cb() {
    $post_types = array( 'post', 'page', 'my_other_post_type' );
    // copy the add_meta_box function from the parent theme hook below...
}

function wpse_override_meta_box_action(){
    remove_action( 'add_meta_boxes', 'parent_theme_meta_box_hook_cb' );
    add_action( 'add_meta_boxes', 'my_child_theme_meta_box_override_cb' );
}
add_action( 'after_setup_theme', 'wpse_override_meta_box_action' );
0
brianjohnhanna