Вопрос или проблема
Какой эффективный способ удалить все метабоксы для конкретного типа записи в WordPress?
Единственным решением для полного удаления метабоксов, которое я нашел, кажется, является функция remove_meta_box()
, которая требует идентификатор метабокса для удаления. Я мог бы удалить все стандартные метабоксы так, это было бы немного сложно, но не невозможно и не слишком трудно.
Однако как мне последовательно удалять метабоксы, добавленные плагинами или функциями тем? Они динамичны и непредсказуемы, возможно, я могу надежно получить сводку метабоксов для страницы редактирования произвольных типов записей и, возможно, работать оттуда?
Если вы хотите скрыть все метабоксы для всех пользователей, вы можете сделать это с помощью get_user_option_metaboxhidden_{cpt}
, default_hidden_meta_boxes
или фильтра hidden_meta_boxes
, согласно файлу /wp-admin/includes/screen.php
.
Вот пример для типа записи post
:
/**
* Скрыть все метабоксы в глобальном $wp_meta_boxes
*/
add_filter( 'hidden_meta_boxes', function( $hidden, $screen, $use_defaults )
{
global $wp_meta_boxes;
$cpt="post"; // Измените это в соответствии с вашими потребностями!
if( $cpt === $screen->id && isset( $wp_meta_boxes[$cpt] ) )
{
$tmp = array();
foreach( (array) $wp_meta_boxes[$cpt] as $context_key => $context_item )
{
foreach( $context_item as $priority_key => $priority_item )
{
foreach( $priority_item as $metabox_key => $metabox_item )
{
//Сохранить те, которые нужны
if(! in_array($metabox_key,array("submitdiv")))
{
$tmp[] = $metabox_key;
}
}
}
}
$hidden = $tmp; // Переопределите текущий параметр пользователя здесь.
}
return $hidden;
}, 10, 3 );
Источник для remove_meta_box()
должен дать вам разумное представление.
Зарегистрированные метабоксы хранятся в глобальной переменной $wp_meta_boxes
. Очистка этой глобальной переменной (например, присвоение пустого массива) предотвратит их отображение.
Единственная сложная часть заключается в том, чтобы выяснить правильный контекст и время. Если вы сделаете это слишком рано, ядро или какой-либо плагин могут добавить метабоксы позже. Если вы сделаете это слишком поздно, то некоторые уже окажутся в выводе.
Как сказал @rarst, установка глобальной переменной $wp_meta_boxes
в пустой массив может быть решением.
Что касается проблемы времени, лучшее место для сброса переменной – это прямо перед ее использованием.
Метабоксы выводятся через do_meta_boxes()
функцию, и внутри нее нет хуков, однако она содержит
get_user_option( "meta-box-order_$page" )
и get_user_option()
вызывает фильтр 'get_user_option_{$option}'
, так что вы можете использовать его для выполнения вашей очистки.
Что-то вроде этого:
function remove_all_metaboxes($type) {
add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
global $wp_meta_boxes;
$wp_meta_boxes[$type] = array();
return array();
}, PHP_INT_MAX);
}
Однако проблема времени – не единственная.
Другой проблемой является то, что если вы установите $wp_meta_boxes
в пустой массив, все метабоксы будут удалены, даже те, что в ядре, например, блок, который позволяет вам сохранить запись.
Таким образом, решение заключается не в том, чтобы устанавливать его в пустой массив, а в том, чтобы устанавливать его в массив, содержащий метабоксы, которые вы хотите сохранить.
Например, чтобы сохранить только блок с кнопкой публикации, используйте:
function remove_all_metaboxes($type) {
add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
global $wp_meta_boxes;
$publishbox = $wp_meta_boxes[$type]['side']['core']['submitdiv'];
$wp_meta_boxes[$type] = array(
'side' => array('core' => array('submitdiv' => $publishbox))
);
return array();
}, PHP_INT_MAX);
}
add_action('admin_init', function() {
// замените на slug типа записи, который хотите нацелить
remove_all_metaboxes('post');
});
Ответ или решение
Чтобы удалить все метабоксы для пользовательского типа записи в WordPress, вы можете использовать несколько подходов. Основной метод заключается в использовании глобального массива $wp_meta_boxes
, который содержит все метабоксы, добавленные как ядром WordPress, так и плагинами или темами.
Шаг 1: Понимание структуры метабоксов
Сначала необходимо понять, что метабоксы хранятся в глобальном массиве $wp_meta_boxes
в следующей структуре:
$wp_meta_boxes[$post_type][$context][$priority][$metabox_id];
Где:
$post_type
— тип записи.$context
— контекст, в котором отображается метабокс (например,normal
,side
).$priority
— приоритет метабокса (например,high
,core
,default
).$metabox_id
— уникальный идентификатор метабокса.
Шаг 2: Удаление всех метабоксов
Чтобы удалить все метабоксы для определенного типа записи, используйте следующий код:
function remove_all_metaboxes($type) {
add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
global $wp_meta_boxes;
$wp_meta_boxes[$type] = array();
return array();
}, PHP_INT_MAX);
}
// Вызываем функцию для нужного типа записи
add_action('admin_init', function() {
remove_all_metaboxes('your_custom_post_type'); // Замените на ваш тип записи
});
Этот код добавляет фильтр get_user_option_meta-box-order_{type}
, который очищает массив $wp_meta_boxes
для указанного типа записи. Однако имейте в виду, что этот способ удаляет все метабоксы, включая критически важные, такие как метабокс для сохранения записи.
Шаг 3: Сохранение критически важных метабоксов
Чтобы избежать удаления важных метабоксов, например, метабокса для публикации, можно сохранить необходимые метабоксы следующим образом:
function remove_all_metaboxes($type) {
add_filter("get_user_option_meta-box-order_{$type}", function() use($type) {
global $wp_meta_boxes;
// Сохраняем метабокс для публикации
$publishbox = $wp_meta_boxes[$type]['side']['core']['submitdiv'];
// Очищаем все метабоксы, кроме publish
$wp_meta_boxes[$type] = array(
'side' => array('core' => array('submitdiv' => $publishbox))
);
return array();
}, PHP_INT_MAX);
}
// Замените 'your_custom_post_type' на ваш тип записи
add_action('admin_init', function() {
remove_all_metaboxes('your_custom_post_type');
});
Заключение
Данный подход позволяет гибко управлять метабоксами для пользовательских типов записей в WordPress. Вы легко можете добавить или удалить метабоксы, сохранив при этом необходимые функциональные элементы интерфейса.
Не забудьте протестировать изменения на локальной среде или staging-сайте, прежде чем применять их на рабочем сайте. Это помогает избежать непредвиденных ошибок, которые могут повлиять на работу сайта.