it-swarm.com.de

Metabox wird nicht auf benutzten Beitragstypen, sondern auf Seiten und Beiträgen angezeigt

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 Pagename__s und Postname__s angezeigt, aber nicht auf Custom Post Type ProjectsCPTKö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

2
Behseini

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.

2
vancoder

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.

0
Sumit

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' 
);
0
Prince Ahmed