web-dev-qa-db-ja.com

カスタム投稿タイプではなくページと投稿にメタボックスが表示される

私はのようなカスタム投稿タイプがあります

function cpt_Projects() {
    $labels = array(
        'name'                 => 'Projects',
        'singular_name'        => 'Project',
        'menu_name'            => 'Projects',
        'name_admin_bar'       => 'Projects',
        'parent_item_colon'    => 'Parent Projects:',
        'all_items'            => 'All Projects',
        'view_item'            => 'View Project',
        'add_new_item'         => 'Add New Project',
        'add_new'              => 'Add New Project',
        'new_item'             => 'New Projects',
        'edit_item'            => 'Edit Project Item',
        'update_item'          => 'Update Project Item',
        'search_items'         => 'Search Project Item',
        'not_found'            => 'Project Not found',
        'not_found_in_trash'   => 'Project Not found in Trash',
    );
    $args = array(
        'label'                => 'ProjectsCPT',
        'description'          => 'This Post Type Adds Eyeglasses to Website',
        'labels'               => $labels,
        'supports'             => array( 'title', 'thumbnail', 'editor'),
        'taxonomies'           => array( 'ProjectsTax' ),
        'register_meta_box_cb' => 'add_details_metabox',
        'hierarchical'         => true,
        'public'               => true,
        'show_ui'              => true,
        'show_in_menu'         => true,
        'show_in_nav_menus'    => true,
        'show_in_admin_bar'    => true,
        'menu_position'        => 5,
        'can_export'           => true,
        'has_archive'          => true,
        'exclude_from_search'  => false,
        'publicly_queryable'   => true,
        'capability_type'      => 'post',
    );
    register_post_type( 'ProjectsCPT', $args );

}

add_action( 'init', 'cpt_Projects', 0 );

そしてMetaboxのような

  function add_details_metabox($post_type) {
    $types = array('post', 'page', 'ProjectsCPT');

   if (in_array($post_type, $types)) {
      add_meta_box(
        'details-metabox',
        'Project Details',
        'detail_meta_callback',
        $post_type,
        'normal',
        'high'
      );
   }
  }

コードを実行した後、MetaboxがすべてのPagesとPostsに表示されていますが、カスタム投稿タイプには表示されていませんProjectsCPTどうすればよいですか。 (if文を削除すれば問題なく動作します。

 if (in_array($post_type, $types)) {}

しかし、これはすべての投稿とページにメタボックスを追加するので、私がする必要はありません。

2
Behseini

投稿タイプ名に大文字を含めることはできません。そのため、舞台裏では、CPTはおそらくProjectsCPTではなくprojectscptと呼ばれます。したがって、配列の値と一致しません。

2
vancoder

add_meta_boxesregister_meta_box_cbの違いに注意してください。

add_meta_boxesを使用してメタボックスを登録するとき、WordPressがdo_action()を呼び出す方法は次のとおりです。

/**
 * Fires after all built-in meta boxes have been added.
 *
 * @since 3.0.0
 *
 * @param string  $post_type Post type.
 * @param WP_Post $post      Post object.
 */
do_action( 'add_meta_boxes', $post_type, $post );

最初の引数は投稿タイプ、2番目の引数は投稿オブジェクトです。

そしてコールバックがregister_meta_box_cbを使って登録されているとき、register_post_type()関数WordPressにアクションを追加します。

if ( $args->register_meta_box_cb )
        add_action( 'add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1 );

それから

/**
 * Fires after all built-in meta boxes have been added, contextually for the given post type.
 *
 * The dynamic portion of the hook, `$post_type`, refers to the post type of the post.
 *
 * @since 3.0.0
 *
 * @param WP_Post $post Post object.
 */
do_action( 'add_meta_boxes_' . $post_type, $post );

最初の唯一の引数は投稿オブジェクトの$postであり、あなたはそれを投稿タイプとして使用しています。

比較する前に投稿タイプを取得する必要があります。

例: -

function add_details_metabox($post) {
    $types = array('post', 'page', 'projectscpt');
    $post_type = get_post_type($post);

    if (in_array($post_type, $types)) {
        add_meta_box(
            'details-metabox',
            'Project Details',
            'detail_meta_callback',
            $post_type,
            'normal',
            'high'
        );
    }
}

NOTE#1@vancoderが答えた通り、どんな場合でも投稿タイプを渡します。小文字に変換されます。 WordPressがスペースや大文字を使用せずに投稿タイプを登録することを推奨するもの。大文字の代わりにprojectscptを使用する必要があります。

NOTE#2register_meta_box_cbを使うとき、add_meta_boxes_{post_type}アクションでコールバック関数をフックします。このメタボックスは他の投稿タイプには表示されません。そのため、コールバック関数で投稿タイプを確認する必要はありません。他の種類の投稿でもメタボックスが表示される場合は、コードを確認してください。おそらく、いくつかの間違いをしました。

0
Sumit

$ screenのadd_meta_box関数の引数にカスタム投稿タイプを追加してください。

add_meta_box(文字列$ id、文字列$タイトル、呼び出し可能な$コールバック、string|array|WP_Screen $screen = null,文字列$ context = 'advanced'、文字列$ priority = 'デフォルト'、配列$ callback_args = null)

例:

add_meta_box( 
    'my_id', My Title, 'my_callback_function', '**my_post_type**', 'normal', 'default' 
);
0
Prince Ahmed