Изменить текст на кнопке публикации


21

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

Ответы:


16

Если вы посмотрите в /wp-admin/edit-form-advanced.php, вы найдете мета-поле:

add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core');

Обратите внимание на __('Publish')- функция __()ведет туда, translate()где вы получаете фильтр 'gettext'.

Есть два способа решения вашей проблемы: 1. Адрес строки в одной специализированной функции (убедитесь, что она соответствует правильному текстовому домену!) Или 2. Используйте более общий подход.

@Rarst только что опубликовал версию 1, поэтому я добавлю версию 2. :)

<?php
/*
Plugin Name: Retranslate
Description: Adds translations.
Version:     0.1
Author:      Thomas Scholz
Author URI:  http://toscho.de
License:     GPL v2
*/

class Toscho_Retrans {
    // store the options
    protected $params;

    /**
     * Set up basic information
     * 
     * @param  array $options
     * @return void
     */
    public function __construct( array $options )
    {
        $defaults = array (
            'domain'       => 'default'
        ,   'context'      => 'backend'
        ,   'replacements' => array ()
        ,   'post_type'    => array ( 'post' )
        );

        $this->params = array_merge( $defaults, $options );

        // When to add the filter
        $hook = 'backend' == $this->params['context'] 
            ? 'admin_head' : 'template_redirect';

        add_action( $hook, array ( $this, 'register_filter' ) );
    }

    /**
     * Conatiner for add_filter()
     * @return void
     */
    public function register_filter()
    {
        add_filter( 'gettext', array ( $this, 'translate' ), 10, 3 );
    }

    /**
     * The real working code.
     * 
     * @param  string $translated
     * @param  string $original
     * @param  string $domain
     * @return string
     */
    public function translate( $translated, $original, $domain )
    {
        // exit early
        if ( 'backend' == $this->params['context'] )
        {
            global $post_type;

            if ( ! empty ( $post_type ) 
                && ! in_array( $post_type, $this->params['post_type'] ) )
            {
                return $translated;
            }
        }

        if ( $this->params['domain'] !== $domain )
        {
            return $translated;
        }

        // Finally replace
        return strtr( $original, $this->params['replacements'] );
    }
}

// Sample code
// Replace 'Publish' with 'Save' and 'Preview' with 'Lurk' on pages and posts
$Toscho_Retrans = new Toscho_Retrans(
    array (
        'replacements' => array ( 
            'Publish' => 'Save'
        ,   'Preview' => 'Lurk' 
        )
    ,   'post_type'    => array ( 'page', 'post' )
    )
);

Вам не нужно использовать код в качестве плагина. Включение этого в functions.php вашей темы будет достаточно.

Обновить

Чтобы удалить исходную кнопку «Сохранить» (не уверен, что означает «черновик»), добавьте следующий код в ваш файл functions.php / a:

add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{   
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}

Да, это некрасиво.


1
Это больше похоже на версию 20 :) Потрясающий код!
Первое

Мне это тоже нравится. Все еще не хватает, чтобы скрыть другую кнопку.
2010 г.

Удалить кнопку сохранения очень сложно, потому post_submit_meta_box()что ее содержимое просто выгружается. Нет фильтра вообще. Javascript или ob_start()может решить это. Оба не очень элегантно.
fuxia

Хм, хорошо, я добавил код, чтобы удалить оригинальную кнопку Сохранить. Было не так сложно. :)
fuxia

Мне не хватает слов, чтобы описать это :) - и сказал это раньше: использование запятой для форматирования массива заслуживает награды PHP Formatters +1+
brasofilo

11

Код для предложения Хакре использовать фильтр перевода будет выглядеть примерно так:

add_filter( 'gettext', 'change_publish_button', 10, 2 );

function change_publish_button( $translation, $text ) {

if ( $text == 'Publish' )
    return 'Save';

return $translation;
}

Есть ли причины, по которым «версия 1» (текущий принятый ответ, написанный @toscho) превосходит / уступает этому подходу? Мне кажется, что это лучшее из двух: проще, не требует взлома для удаления кнопки «Сохранить» и более перспективно на будущее.
Риного

Ваш ответ вдохновил меня - я развил ваш подход, чтобы охватить гораздо больше строк. wordpress.stackexchange.com/a/230513/10388
риного

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

4

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

Кнопка «Черновик» может быть «удалена», скрывая ее с помощью CSS. CSS может быть введен в <head>-tag администратора с помощью другого обратного вызова. Я думаю, что фильтр призван admin_headдля этого. Это как-то грязно, так как кнопка все еще есть, например, если пользователь выключает CSS.


3

Для согласованности, я предполагаю, что вы предпочитаете использовать «Сохранить» вместо «Публикация» в Wordpress, а не только в тексте кнопки.

Мета бокс

Список сообщений

Основываясь на решении, предоставленном @Rarst, я расширил код, чтобы он переводил многие (все?) Другие экземпляры слова «Опубликовать» в соответствующий вариант «Сохранить».

add_filter("gettext", "translate_publish_post_status", 10, 2);
add_filter("ngettext", "translate_publish_post_status_number", 10, 5);
add_filter("ngettext_with_context", "translate_publish_post_status_number", 10, 6);

function translate_publish_post_status($translation, $text) {
    switch($text) {
        case "Publish":                     return "Save";
        case "Published on: <b>%1\$s</b>":  return "Saved on: <b>%1\$s</b>";
        case "Publish <b>immediately</b>":  return "Approve <b>immediately</b>";
        case "Publish on: <b>%1\$s</b>":    return "Approve on: <b>%1\$s</b>";
        case "Privately Published":         return "Privately Saved";
        case "Published":                   return "Saved";
        case "Save & Publish":              return "Save"; //"Double-save"? :)
        default:                            return $translation;
    }
}

function translate_publish_post_status_number($translation, $single, $plural, $number, $domain) {
    if($translation == "Published <span class=\"count\">(%s)</span>") {
        return "Saved <span class=\"count\">(%s)</span>";
    }

    return $translation;
}

Для удаления кнопки Черновик ответ @toscho содержит хорошее решение.


Примечание: неопределенная переменная: s
Amjad

@Amjad - Попробуйте изменить все экземпляры %1$sна %1\$s. Или отключение уведомлений / предупреждений позволит скрыть эти ошибки.
Риного

Мне нужно держать уведомления и предупреждения для отладки. Но спасибо за это. Ошибки больше не отображаются, добавив, что \
Amjad

2

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

Посмотрите обсуждение, которое я провел здесь о перемещении мета-блока, вы сможете применить нечто похожее, чтобы переименовать этот Опубликовать текст.


0

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


0

Гораздо чище и проще решение.

function change_publish_btn_txt() {
    echo "<script type='text/javascript'>jQuery(document).ready(function(){
        jQuery('#publish').attr('value', 'Your Custom Text');
    });</script>";
}
add_action('admin_footer-post-new.php', 'change_publish_btn_txt', 99);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.