Ich habe einen benutzerdefinierten Beitragstyp wie
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 );
und eine Metabox wie
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'
);
}
}
nach dem Ausführen des Codes wird die Metabox auf allen Page
name__s und Post
name__s angezeigt, aber nicht auf Custom Post Type ProjectsCPT
Können Sie mir bitte mitteilen, was ich falsch mache? (Es funktioniert gut, wenn ich die if-Anweisung entferne
if (in_array($post_type, $types)) {}
aber dies fügt allen Posts und Pages Metabox hinzu, was nicht das ist, was ich tun muss
Namen von Beitragstypen dürfen keine Großbuchstaben enthalten. Hinter den Kulissen wird Ihr CPT wahrscheinlich als projectscpt und nicht als ProjectsCPT bezeichnet. Daher stimmt er nicht mit dem Wert in Ihrem Array überein.
Beachten Sie den Unterschied zwischen add_meta_boxes
und register_meta_box_cb
.
Wenn Sie die Meta-Boxen mit add_meta_boxes
registrieren, nennt WordPress so 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 );
Das erste Argument ist post type und das zweite ist post object.
Und wenn Rückruf mit register_meta_box_cb
registriert ist, dann füge in register_post_type()
function WordPress eine Aktion hinzu.
if ( $args->register_meta_box_cb )
add_action( 'add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1 );
Dann
/**
* 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 );
Das erste und einzige Argument ist also $post
das Post-Objekt und Sie verwenden es als Post-Typ.
Sie müssen den Beitragstyp erhalten, bevor Sie vergleichen können.
Beispiel:-
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'
);
}
}
ANMERKUNG 1 Als @vancoder geantwortet hat, egal in welchem Fall Sie den Beitragstyp übergeben. Es wird in Kleinbuchstaben umgewandelt. Was WordPress empfiehlt, um Beitragstyp ohne Leerzeichen und Großbuchstaben zu registrieren. Sie müssen projectscpt
anstelle von Großbuchstaben verwenden.
HINWEIS # 2 Bei Verwendung von register_meta_box_cb
wird die Rückruffunktion bei einer add_meta_boxes_{post_type}
-Aktion aktiviert. Dieses Meta-Feld wird in keinem anderen Beitragstyp angezeigt. Daher müssen Sie den Beitragstyp in der Rückruffunktion nicht überprüfen. Wenn Sie auch bei anderen Beitragstypen eine Meta-Box erhalten, überprüfen Sie den Code. Vielleicht haben Sie einen Fehler gemacht.
Stellen Sie sicher, dass Sie Ihren benutzerdefinierten Beitragstyp in den Funktionsargumenten add_meta_box für $ screen hinzufügen.
add_meta_box (string $ id, string $ title, aufrufbarer $ callback,string|array|WP_Screen $screen = null,
string $ context = 'advanced', string $ priority = 'default', array $ callback_args = null)
Beispiel:
add_meta_box(
'my_id', My Title, 'my_callback_function', '**my_post_type**', 'normal', 'default'
);