Как изменить заголовок метабокса в WordPress
Я пытаюсь создать функцию, которая позволит мне изменить заголовок существующего метабокса (например, изменить заголовок метабокса 'Authors' на 'Team' и т.д.).
Я не хотел использовать JavaScript или удалять оригинальный метабокс и добавлять его заново.
Я начал с следующего кода, как было предложено в другой теме:
// Хук для действия 'add_meta_boxes'
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles($post_type, $post)) {
global $wp_meta_boxes; // массив определенных метабоксов
// пройтись по массиву, изменить нужные заголовки
}
Я застрял на части "пройтись по массиву и изменить нужные заголовки".
Какой будет лучший способ выполнить это? Использовать foreach для цикла? Или сценарий Switch/Case? Я довольно новичок в этом, может ли кто-нибудь привести пример, как это сделать?
Обновление: Пример Стивена Харриса работает для стандартных метабоксов (спасибо!):
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
global $wp_meta_boxes; // массив определенных метабоксов
// пройтись по массиву, изменить нужные заголовки
$wp_meta_boxes['post']['normal']['core']['authordiv']['title']= 'Участник команды';
}
Обновление: Исправлено для пользовательских метабоксов
Чтобы это работало с вашими пользовательскими метабоксами, измените add_action следующим образом, чтобы он выполнял код изменения заголовка после добавления метабокса:
add_action('add_meta_boxes', 'change_meta_box_titles', 999);

Улучшенный ответ
Я решил вернуться к этому вопросу, осознав, насколько излишне сложным было предыдущее решение.
Лучший способ — удалить метабокс, а затем добавить его заново с изменённым заголовком. Вот пример для типа записи post.
add_action( 'add_meta_boxes_post', 'wpse39446_add_meta_boxes' );
function wpse39446_add_meta_boxes() {
remove_meta_box( 'authordiv', 'post', 'core' );
add_meta_box( 'authordiv', __('Участник команды','wpse39446_domain'), 'post_author_meta_box', 'post', 'core', 'high' );
}
Примечание: Если вы делаете это для нестандартного метабокса, убедитесь, что ваш колбэк вызывается после добавления метабокса, указав более высокий приоритет.
Итак, $wp_meta_boxes
содержит много вложенных массивов.
Для ваших целей:
$wp_meta_boxes['post_type']['normal']['core']['authordiv']['title']= 'команды';
(Примечание: не уверен, передаются ли какие-либо аргументы в это действие...:
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
global $wp_meta_boxes; // массив определённых метабоксов
// пройдитесь по массиву и измените нужные заголовки
}
На самом деле структура массива более сложная. Я обновил свой код. Я протестировал его, и он работает :D (Просто убедитесь, что вы заменили 'post_type'
на нужный тип записи, например 'post').
Примерная структура массива: тип_записи > приоритет > core > ID метабокса.
Если вы хотите увидеть массив самостоятельно, используйте внутри своей функции:
echo '<pre>';
print_r($wp_meta_boxes);
echo '</pre>';
wp_die('');

Стивен Харрис, я готов тебя расцеловать! Это сработало как по волшебству, огромное спасибо!
Похоже, я слишком усложнил свой код, когда пытался разобраться с этим самостоятельно.

Хм... Я попробовал это с кастомным метабоксом, который создал. "projectinfo" был уникальным идентификатором метабокса, так что я попытался...
$wp_meta_boxes['post']['side']['core']['projectinfo']['title']= 'New Title';
но это не сработало. Я что-то упустил?

Попробуйте echo '<pre>';
print_r($wp_meta_boxes);
echo '</pre>';
wp_die('');
после изменения заголовка, чтобы увидеть, что пошло не так. Я предполагаю, что это не 'core' :D

Я добавил это, но пользовательские мета-поля не отображаются в списке. Так что, скорее всего, вы правы - это не 'core'.

Спасибо за этот замечательный ответ и вопрос. Я как раз искал то же самое! Ещё раз спасибо. :)

Смотрите мой ответ ниже на этой странице о том, как обрабатывать несколько типов записей одновременно (WordPress 4.4 и выше).

Насколько я знаю, лучшим решением будет подключить функцию к хуку непосредственно перед созданием метабокса:
function alter_meta_box_titles( $post_type, $priority, $post )
{
global $wp_meta_boxes;
// Проверяем, что находимся на нужном типе записи $post_type, приоритете и т.д.
// Затем изменяем вывод
foreach( $wp_meta_boxes as $index => $box )
$wp_meta_boxes[ $index]['title'] = 'ПОЛЬЗОВАТЕЛЬСКИЙ ЗАГОЛОВОК';
return $wp_meta_boxes;
}
add_action( 'do_meta_boxes', 'alter_meta_box_titles', 0, 3);

Я знаю, что это старый вопрос, но для этого существует фильтр-хук. Вам нужно добавить в functions.php
вашей темы или в плагин кастомной функциональности функцию, подключенную к хуку post_type_labels_{$post_type}
.
Например, у нас есть кастомный тип записи band
, и мы хотим изменить метки для миниатюры записи на "Фото группы". Функция будет выглядеть примерно так:
function wpse39446_modify_featured_image_labels( $labels ) {
$labels->featured_image = __( 'Фото группы', 'textdomain' );
$labels->set_featured_image = __( 'Установить фото группы', 'textdomain' );
$labels->remove_featured_image = __( 'Удалить фото группы', 'textdomain' );
$labels->use_featured_image = __( 'Использовать как фото группы', 'textdomain' );
return $labels;
}
add_filter( 'post_type_labels_band', 'wpse39446_modify_featured_image_labels', 10, 1 );
Источник: https://developer.wordpress.org/reference/hooks/post_type_labels_post_type/

Начиная с WordPress 4.4, аргумент $screen может быть массивом, что значительно упрощает массовое добавление или изменение метабоксов.
Следующий код изменяет заголовок метабокса "Автор" на "Редактор" для страниц, записей, вложений и всех пользовательских типов записей, независимо от их количества или времени добавления на сайт.
add_action('do_meta_boxes', 'my_customize_meta_boxes'); //использование do_meta_boxes также позволяет изменять метабоксы плагинов
function my_customize_meta_boxes(){
$post_types = get_post_types();
remove_meta_box( 'authordiv', $post_types, 'normal' );
add_meta_box('authordiv', __('Редактор'), 'post_author_meta_box', $post_types, 'side', 'default');
}

Это немного хакерский способ, но для тех, кому нужно простое CSS-решение, используйте это:
.meta-box-sortables #your-metabox-id .ui-sortable-handle span {
color: transparent;
}
.meta-box-sortables #your-metabox-id .ui-sortable-handle span:before {
content: 'Ваш новый заголовок';
display: inline-block;
color: #000;
}
Просто замените your-metabox-id на свой идентификатор. :)
(примечание: я обычно добавляю admin.css через functions.php, там я управляю некоторыми стилями админки WordPress)

Ладно... Это немного хакерский подход, но мне кажется, что он довольно умный. По сути, вы просто используете встроенные функции языка для изменения того, что вам нужно. Главное — знать оригинальное слово или фразу, которые вы хотите заменить, и чтобы они были правильно указаны в коде, например, с помощью конструкции __('текст здесь')
. Тогда вы можете изменить их на что угодно.
Я однажды использовал это, чтобы изменить название метабокса "Excerpts" (Анонсы) на другое (вместе с описанием внутри), потому что моя тема использовала его для очень коротких текстов. Взгляните:
/**
* Вот несколько настроек, которые изменяют вывод текста через фильтр gettext.
* Изначально он предназначен для перевода тем на другие языки, но почему бы не
* использовать его для дополнительной кастомизации?
*
* @link http://codex.wordpress.org/Plugin_API/Filter_Reference/gettext
*
*/
add_filter( 'gettext', 'change_excerpt_name', 20, 3 );
function change_excerpt_name( $translated_text, $text, $domain ) {
if( $_GET['post_type'] == 'events' ) {
switch ( $translated_text ) {
case 'Excerpt' :
$translated_text = 'Краткое описание';
break;
case 'Excerpts are optional hand-crafted summaries of your content that can be used in your theme. <a href="%s">Learn more about manual excerpts</a>.' :
$translated_text = 'Используйте это поле для ОЧЕНЬ краткого описания события. Постарайтесь уложиться в 12 слов или меньше. Если оставить поле пустым, вместо этого будут использованы первые слова из основного текста.';
break;
}
}
return $translated_text;
}
Как оказалось, я был не единственным, кто придумал это. Сюрприз. Вот статья, где обсуждается та же идея, но с другим способом использования gettext.
