Изменить заголовок мета-бокса

8

Я пытаюсь создать функцию, которая позволила бы мне изменить заголовок установленного мета-блока (т. Е. Изменить заголовок мета-блока «Авторы» на «Команда» и т. Д.)

Я не хотел использовать JS или должен был сбросить исходный мета-блок и заново добавить его.

Я начал со следующего в соответствии с другим потоком, который перечислил код следующим образом:

// hook to the 'add_meta_boxes' action
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles($post_type, $post)) {
    global $wp_meta_boxes; // array of defined meta boxes
    // cycle through the array, change the titles you want
}

Я застрял на части "циклически перебирать массив и менять названия, которые вы хотите".

Каков наилучший способ сделать это? Использование foreach для цикла? Или сценарий «переключение / случай»? Я новичок в этом, кто-нибудь может привести пример, как это сделать?

Обновление: пример Стивена Харриса работает для Core Meta (спасибо!):

add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
    global $wp_meta_boxes; // array of defined meta boxes
    // cycle through the array, change the titles you want

    $wp_meta_boxes['post']['normal']['core']['authordiv']['title']= 'Team Member';
}

Обновление: исправлено для пользовательских мета

Чтобы заставить это работать с вашими пользовательскими мета, измените вашу add_action следующим образом, чтобы она запускала ваш код заголовка изменения после добавления мета-блока:

add_action('add_meta_boxes', 'change_meta_box_titles', 999);
Syrehn
источник

Ответы:

11

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

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

Лучшее решение состоит в том, чтобы удалить метабокс, а затем повторно добавить его, указав альтернативный заголовок. Вот пример для пост-пост-типа.

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', __('Team Member','wpse39446_domain'), 'post_author_meta_box', 'post', 'core', 'high' );
}

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


Итак, $wp_meta_boxesимеет много вложенных массивов

Для ваших целей:

$wp_meta_boxes['post_type']['normal']['core']['authordiv']['title']= 'teams';

(NB. Я не уверен, если какие-либо аргументы переданы этому действию ...:

add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
    global $wp_meta_boxes; // array of defined meta boxes
    // cycle through the array, change the titles you want
}

На самом деле структура массива более сложная. Я обновил свой код Я проверил это, и оно работает: D (Просто убедитесь, что вы изменили 'post_type'тип сообщения, например, «пост»).

Обычно структура массива имеет тип post> priority> core> metabox.

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

echo '<pre>';
print_r($wp_meta_boxes);
echo '</pre>';
wp_die('');
Стивен Харрис
источник
Стивен Харрис, я могу тебя поцеловать. Это работает как шарм, спасибо большое! Я переборщил свой код, кажется, когда я пытался разобраться в этом самостоятельно.
Syrehn
Рад помочь: D
Стивен Харрис
Хм ... Я попробовал это с помощью пользовательского мета-блока, который я создал "projectinfo" - это был уникальный идентификатор метабокса, поэтому я попытался ... $wp_meta_boxes['post']['side']['core']['projectinfo']['title']= 'New Title'; но это не сработало, я что-то здесь упустил?
Syrehn
Попробуйте echo '<pre>'; print_r($wp_meta_boxes); echo '</pre>'; wp_die('');После того, как вы изменили название, чтобы увидеть, что пошло не так. Я думаю, что это не «ядро»: D
Стивен Харрис
Я добавил, что пользовательская мета не отображается в списке. Так что вы, вероятно, правы, это не «ядро».
Syrehn
2

Я знаю, что это старый вопрос, но для этого есть фильтр. Вы бы добавили в плагин своей темы functions.phpили пользовательской функции функцию, подключенную кpost_type_labels_{$post_type}

Возьмем, к примеру, что у нас есть пользовательский тип поста, который bandмы хотим изменить, и мы хотим поменять метки избранного изображения на «Band Photo». Функция будет выглядеть примерно так:

function wpse39446_modify_featured_image_labels( $labels ) {
  $labels->featured_image = __( 'Band Photo', 'textdomain' );
  $labels->set_featured_image = __( 'Set Band Photo', 'textdomain' );
  $labels->remove_featured_image = __( 'Remove Band Photo', 'textdomain' );
  $labels->use_featured_image = __( 'Use as Band Photo', '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/

гороховый
источник
1

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

function alter_meta_box_titles( $post_type, $priority, $post )
{
    global $wp_meta_boxes;

    // Do check if you're on the right $post_type, $priority, etc.
    // Then alter the output
    foreach( $wp_meta_boxes as $index => $box )
        $wp_meta_boxes[ $index]['title'] = 'CUSTOM TITLE';

    return $wp_meta_boxes;
}
add_action( 'do_meta_boxes', 'alter_meta_box_titles', 0, 3);
кайзер
источник
0

Ладно ... Это немного глупо, но я вроде думал, что это было умно. По сути, вы просто используете встроенные функции языка, чтобы изменить то, что вам нравится. Пока вы знаете исходное слово или слова, которые вы хотите изменить, и они были правильно вызваны в коде с чем-то вроде этого __('text in here'), вы можете изменить их на то, что вам нравится.

Однажды я использовал его, чтобы изменить мета-поле «Выдержки» на другое имя (вместе с описанием внутри), потому что моя тема использовала его для очень маленьких фрагментов текста. Посмотри:

/**
 * Here are some customizations that change text output via the gettext filter.
 * This was intended for translating themes to other languages, but why not
 * use it for more customization?
 *
 * @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 = 'Quick Summary';
                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 = 'Use this field to REALLY condense the description of this event.  Keep it around 12 words or less if possible. If you skip this field, the first few words in the area above will be used instead.';
                break;

        }

    }

    return $translated_text;
}

Оказывается, я был не единственным, кто думал об этом. Сюрприз. Вот статья, обсуждающая ту же идею , с другим методом использования gettext.

дон
источник
0

Начиная с WordPress 4.4, аргумент $ screen может быть массивом, который значительно упрощает массовые добавления или изменения мета-блоков.

Следующий код меняет заголовок мета-поля «Автор» на «Редактор» на страницах, сообщениях, вложениях и всех пользовательских типах сообщений независимо от того, сколько их добавлено или когда они добавлены на ваш сайт.

add_action('do_meta_boxes', 'my_customize_meta_boxes'); //using do_meta_boxes also allows plugin metaboxes to be modified
function my_customize_meta_boxes(){
  $post_types = get_post_types();
  remove_meta_box( 'authordiv', $post_types, 'normal' );
  add_meta_box('authordiv', __('Editor'), 'post_author_meta_box', $post_types, 'side', 'default');
}
хлопать
источник
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: 'Your new title';
    display: inline-block;
    color: #000;
}

Просто замените your-metabox-id своим собственным. :)

(примечание: я обычно добавляю admin.css через functions.php, именно там я контролирую некоторые стили wp admin)

un.pez.vivo
источник