Змініть текст на кнопці Опублікувати


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. Зверніться до рядка в одній спеціалізованій функції (не забудьте відповідати правильному textdomain!) Або 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' )
    )
);

Вам не потрібно використовувати код як плагін. Включення його у свою функцію теми.php буде достатньо.

Оновлення

Щоб видалити оригінальну кнопку "Зберегти" (не впевнений, що таке "чернетка"), додайте наступний код до своїх функцій.php / плагін:

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 :) Дивовижний код!
Рарст

Мені це також подобається. Ще не вистачає, щоб приховати іншу кнопку.
хакре

Видалити кнопку збереження дійсно важко, тому що post_submit_meta_box()просто викидає її вміст. Фільтр взагалі немає. Javascript або ob_start()міг це вирішити. Обидва не дуже елегантні.
fuxia

Гм, добре, я додав код, щоб видалити оригінальну кнопку "Зберегти". Не було так важко. :)
fuxia

Я пропускаю слова, щоб описати це :) - і сказав це раніше: використання кома для форматування масиву заслуговує на PHP Formatters Award +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) перевершує / поступається цьому підходу? Мені здається, що для мене це краще - простіше, не потрібно хакам для видалення кнопки "Зберегти", і є більш надійним у майбутньому.
rinogo

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

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 - Спробуйте змінити всі екземпляри %1$sдо %1\$s. Або вимкнення повідомлень / попереджень приховає ці помилки.
rinogo

Мені потрібно тримати сповіщення та попередження про налагодження. Але дякую за це. Помилки більше не показуються, додавши, що \
Амджад

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.