web-dev-qa-db-fra.com

Metabox ne figurant pas sur le type de publication personnalisé, mais sur les pages et la publication

J'ai un type de message personnalisé comme

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 );

et un Metabox comme

  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'
      );
   }
  }

après avoir exécuté le code, Metabox affiche toutes les Pages et Posts, mais pas le type de message personnalisé ProjectsCPT Pouvez-vous me dire ce que je ne fais pas correctement? (Cela fonctionne bien si je supprime la déclaration if

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

mais cela ajoute metabox à tous les articles et pages, ce qui n'est pas ce que je dois faire

2
Behseini

Les noms de type de message ne peuvent pas contenir de lettres majuscules. Donc, en coulisse, votre CPT s'appelle probablement projectscpt plutôt que ProjectsCPT - il ne correspond donc pas à la valeur de votre tableau.

2
vancoder

NOTE la différence entre add_meta_boxes et register_meta_box_cb.

Lorsque vous enregistrez les méta-boîtes à l'aide de add_meta_boxes, voici comment WordPress appelle 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 );

Le premier argument est type de poste et le second est objet de publication.

Et quand le rappel est enregistré en utilisant register_meta_box_cb, alors dans la fonction register_post_type(), WordPress ajoute une action.

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

Ensuite

/**
 * 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 );

Donc, le premier et unique argument est $post l'objet post et vous l'utilisez en tant que type post.

Vous devez obtenir le type de message avant de comparer.

Exemple:-

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 Comme @vancoder a répondu, quel que soit le cas où vous transmettez le type de message. Il est converti en minuscule. Qu'est-ce que WordPress recommande d'enregistrer type de message sans espaces et lettres majuscules. Vous devez utiliser projectscpt au lieu de lettres majuscules.

NOTE # 2 Lors de l'utilisation de register_meta_box_cb, la fonction de rappel est associée à l'action add_meta_boxes_{post_type}. Cette méta-boîte n'apparaîtra sur aucun autre type de message. Par conséquent, vous n'avez pas besoin de vérifier le type de publication dans la fonction de rappel. Si vous obtenez également des méta-boîtes sur d'autres types de messages, vérifiez le code, vous avez peut-être commis une erreur.

0
Sumit

Assurez-vous d’ajouter votre type de publication personnalisé dans les arguments de la fonction add_meta_box pour $ screen.

add_meta_box (chaîne $ id, chaîne $ title, callable $ callback,string|array|WP_Screen $screen = null,chaîne $ context = 'advanced', chaîne $ priority = 'default', tableau $ callback_args = null)

Exemple:

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