Intereting Posts
Короткое обозначение из виджета обернуто в нежелательный элемент <p> Thumb удваивает размер файла изображения Экспорт сообщений в блоге с помощью MathJax в документ LaTeX? Как ограничить действия и фильтры «правильно» условиями Перезаписать перезаписываемый слиток встроенного пост-типа «пост» Как смешивать частичное и полное обновление страницы в том же разделе настройки? Как использовать Amazon Elastic Transcoder из WordPress с помощью AWS SDK для PHP? Обслуживание HTTP и HTTPS с одной установки Как отображать дочерние страницы в ограниченном детском контенте? Ошибка установления соединения с базой данных – высокий трафик? Интеграция API с WordPress Как я могу использовать CKEditor с WordPress и позволить клиентам редактировать контент? Сохранять индекс поисковой системы при переходе на новый домен WP Query между почтовыми пользовательскими полями Вызов метода класса, созданного ajax-вызовом в wordpress

Пользовательский тип сообщения, есть только мои мета-боксы

Я работаю над плагином, для которого я создаю пользовательский тип сообщения и несколько мета-полей на странице сообщений.

Тем не менее, тема, которая, как мне кажется, добавляет мета-поле объявления (переход к нашей премиальной теме и т. Д.) На страницах всех пользовательских типов сообщений.

Я считаю это злоупотреблением, и я не хочу, чтобы это мета-окно или любые другие внешние мета-поля на моей странице типа сообщения, только те, которые я добавляю.

Как я могу очистить все мета-поля, кроме моего?

Редактировать : Я ищу общий подход к этому. Если я разверну свой плагин для публики, я хочу быть уверенным, что на странице моего сообщения нет других мета-полей из других тем и плагинов, если это возможно.

Вы можете использовать remove_meta_box () для этого.

Для использования remove_meta_box() вам понадобятся 3 части информации:

  1. id мета-поля, который вы хотите удалить.
  2. screen (или экраны), который вы хотите удалить
  3. context он был добавлен (например, «сторона», «нормальная» и т. д.),

Чтобы получить эти 3 части информации, выполните поиск через источник для темы add_meta_box() ), которые используются для добавления мета-поля.

И в случае, если это не очевидно, убедитесь, что вы вызываете remove_meta_box() в действии, которое запускается после того, как действие было добавлено в мета-поле.

Например, если тема выглядит так:

 add_action ('after_theme_setup', 'add_theme_meta_boxes') ; function add_theme_meta_boxes () { add_meta_box ('ad-to-upgrade-to-pro', 'Upgrade to Pro', 'render_upgrade_ad', 'post', 'normal', 'high') ; return ; } 

Ваш плагин должен содержать следующее:

 // make sure you hook to an action that is fired *after* the meta box was added add_action ('init', 'remove_theme_ad_meta_box') ; function remove_theme_ad_meta_box () { remove_meta_box ('ad-to-upgrade-to-pro', 'post', 'normal') ; return ; } 

редактировать

Чтобы ответить на вопрос, заданный в комментарии: невозможно абсолютно гарантировать, что никакая другая тема / плагин не добавляет мета-поля.

Кроме того, с открытой системой, такой как WP, неплохо делать то, что вы пытаетесь сделать (IMHO). В дикой природе существует целый ряд плагинов «общего назначения», которые имеют законные основания для добавления мета-ящиков на экраны post{,-new}.php вашего CPT.

Например, плагин WordPress SEO добавляет мета-окно к любому типу сообщений, который является «видимым», что позволяет добавлять метаданные, связанные с SEO, на общедоступную страницу для сообщений (примечание: упоминание о WordPress SEO не означает одобрение, это просто 1-й, который пришел на ум).

В дополнение к вышеуказанному ответу. Доступны глобальные таблицы для существующих мета-ящиков. Вы также можете найти последнюю do_meta_boxes action / filter hook на вашем CPT (возможно, do_meta_boxes ) и просто удалить все.

Глобальный: global $wp_meta_boxes;

Посмотрите на функцию remove_meta_box как это работает: https://developer.wordpress.org/reference/functions/remove_meta_box/

Так будет что-то вроде этого:

 add_action( 'do_meta_boxes', 'my_metabox_hack', 99, 3 ); function my_metabox_hack( $post_type, $cur_context, $post ) { global $wp_meta_boxes; $screen_id = 'YOUR_SCREEN_ID'; // Remove anything there foreach ( $wp_meta_boxes[$screen_id] as $context => $priorities ) { if ( $context !== $cur_context ) { continue; } if ( empty( $priorities ) ) { $wp_meta_boxes[$screen_id][$context] = array(); continue; } foreach ( $priorities as $priority => $metabox_id ) { $wp_meta_boxes[$screen_id][$context][$priority] = array(); } } // Now add your own metaboxes bases on the $cur_context parameter. // add_meta_box( $id, $title, $callback, $screen, etc.... ) } 

Имейте в виду, что этот clobal содержит ВСЕ мета-боксы, а не только для CPT!

Я считаю это взломом, поэтому, пожалуйста, будьте очень осторожны при использовании этого подхода. Это не стандарты кода WP, и, когда они не используются должным образом, они могут сломать другие плагины / функции.

EDIT: Я также добавил приоритет действия. Вы можете установить его еще выше, чтобы убедиться, что это действие сделано последним.

EDIT2 Также имейте в виду, что это действие может срабатывать несколько раз и имеет 3 параметра для каждого $context . Изменен код, чтобы отразить это.