Как изменить заголовок метабокса в WordPress

19 янв. 2012 г., 18:12:36
Просмотры: 16.2K
Голосов: 10

Я пытаюсь создать функцию, которая позволит мне изменить заголовок существующего метабокса (например, изменить заголовок метабокса '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);
0
Все ответы на вопрос 6
7
13

Улучшенный ответ

Я решил вернуться к этому вопросу, осознав, насколько излишне сложным было предыдущее решение.

Лучший способ — удалить метабокс, а затем добавить его заново с изменённым заголовком. Вот пример для типа записи 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('');
19 янв. 2012 г. 18:34:31
Комментарии

Стивен Харрис, я готов тебя расцеловать! Это сработало как по волшебству, огромное спасибо!

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

Syrehn Syrehn
19 янв. 2012 г. 19:15:00

Рад помочь :D

Stephen Harris Stephen Harris
19 янв. 2012 г. 19:16:24

Хм... Я попробовал это с кастомным метабоксом, который создал. "projectinfo" был уникальным идентификатором метабокса, так что я попытался...

$wp_meta_boxes['post']['side']['core']['projectinfo']['title']= 'New Title'; но это не сработало. Я что-то упустил?

Syrehn Syrehn
19 янв. 2012 г. 19:45:57

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

Stephen Harris Stephen Harris
19 янв. 2012 г. 19:55:46

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

Syrehn Syrehn
19 янв. 2012 г. 19:59:18

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

Nicole Nicole
19 сент. 2012 г. 01:59:35

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

Slam Slam
11 окт. 2017 г. 18:38:27
Показать остальные 2 комментариев
0

Насколько я знаю, лучшим решением будет подключить функцию к хуку непосредственно перед созданием метабокса:

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);
19 янв. 2012 г. 18:38:21
0

Я знаю, что это старый вопрос, но для этого существует фильтр-хук. Вам нужно добавить в 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/

25 мая 2017 г. 23:41:13
1

Начиная с 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');
}
6 авг. 2017 г. 18:17:46
Комментарии

Работает отлично, спасибо! Я заменил $post_types на массив с конкретными типами записей, которые хотел затронуть, поскольку get_post_types() возвращает все известные типы записей.

alexg alexg
20 мая 2021 г. 19:37:07
0

Это немного хакерский способ, но для тех, кому нужно простое 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)

9 дек. 2017 г. 21:40:49
0

Ладно... Это немного хакерский подход, но мне кажется, что он довольно умный. По сути, вы просто используете встроенные функции языка для изменения того, что вам нужно. Главное — знать оригинальное слово или фразу, которые вы хотите заменить, и чтобы они были правильно указаны в коде, например, с помощью конструкции __('текст здесь'). Тогда вы можете изменить их на что угодно.

Я однажды использовал это, чтобы изменить название метабокса "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.

10 мая 2012 г. 09:11:31