私はのようなカスタム投稿タイプがあります
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がすべてのPage
sとPost
sに表示されていますが、カスタム投稿タイプには表示されていませんProjectsCPT
どうすればよいですか。 (if文を削除すれば問題なく動作します。
if (in_array($post_type, $types)) {}
しかし、これはすべての投稿とページにメタボックスを追加するので、私がする必要はありません。
投稿タイプ名に大文字を含めることはできません。そのため、舞台裏では、CPTはおそらくProjectsCPTではなくprojectscptと呼ばれます。したがって、配列の値と一致しません。
add_meta_boxes
とregister_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}
アクションでコールバック関数をフックします。このメタボックスは他の投稿タイプには表示されません。そのため、コールバック関数で投稿タイプを確認する必要はありません。他の種類の投稿でもメタボックスが表示される場合は、コードを確認してください。おそらく、いくつかの間違いをしました。
$ 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'
);