Intereting Posts
Создать ручной счетчик WordPress Необязательно все группы захвата в правиле перезаписи Проблема запуска разработки копии WordPress на WebMatrix? проверить функцию wp_mail Ajax больше загружает иерархические категории Как получить страницу пользовательских 500 ошибок для показа? Добавление опции в Shortcode галереи Как показать пользовательские поля для всех пользователей по умолчанию при изменении после публикации Добавить класс в oEmbed видео из редактора сообщений? Обрезаемая фатальная ошибка: объект класса WP_Term не может быть преобразован в строку Добавить colorpicker для показа изображения Редактирование информации нижнего колонтитула Показать изображения категорий на странице продукта и странице продукта Multisite / Network – стабильный? первый отрывок штраф, последующие выдержки из выдержек сдвигаются вправо, а не отображаются вертикально

Metabox не отображается на пользовательском типе сообщений, но на страницах и сообщениях

У меня есть тип пользовательского сообщения, например

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

и метабокс вроде

  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 и Post но не в Custom Post Type ProjectsCPT Можете ли вы сообщить мне, что я делаю неправильно? (Он отлично работает, если я удалю оператор if

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

но это добавляет метабокс ко всем сообщениям и страницам, которые мне не нужны

Имена типов сообщений не могут содержать заглавных букв. Поэтому за кулисами ваш CPT, вероятно, называется projectscpt, а не ProjectCPT – следовательно, он не соответствует значению в вашем массиве.

add_meta_boxes на разницу между 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 ); 

Первый аргумент – тип сообщения, а второй – объект post.

И когда обратный вызов регистрируется с помощью 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 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' ); } } 

ПРИМЕЧАНИЕ # 1 Как ответил @vancoder, независимо от того, в каком случае вы передаете тип сообщения. Он преобразуется в нижний регистр. Что WordPress рекомендует регистрировать тип сообщения без пробелов и заглавных букв. Вы должны использовать projectscpt вместо прописных букв.

ПРИМЕЧАНИЕ # 2 При использовании register_meta_box_cb он подключает функцию обратного вызова к add_meta_boxes_{post_type} . Этот мета-поле не будет отображаться ни в одном другом типе сообщения. Поэтому вам не нужно проверять тип сообщения в функции обратного вызова. Если вы получаете мета-поле для других типов сообщений, проверьте код, возможно, вы допустили ошибку.