Zmień tekst na przycisku Publikuj


21

Czy istnieje sposób na zmianę tekstu przycisku publikowania w niestandardowym typie postu, aby powiedzieć coś innego? Na przykład Zapisz zamiast Publikuj. A także usunąć przycisk wersji roboczej?

Odpowiedzi:


16

Jeśli zajrzysz /wp-admin/edit-form-advanced.php, znajdziesz meta box:

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

Uwaga __('Publish')- funkcja __()prowadzi do translate()miejsca, w którym otrzymujesz filtr 'gettext'.

Istnieją dwa sposoby rozwiązania problemu: 1. Zaadresuj ciąg w jednej specjalizowanej funkcji (pamiętaj, aby dopasować poprawną domenę tekstową!) Lub 2. zastosuj bardziej ogólne podejście.

@Rarst właśnie opublikował wersję 1, więc dodam wersję 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' )
    )
);

Nie musisz używać kodu jako wtyczki. Dołączenie go do funkcji twojego motywu. Php wystarczy.

Aktualizacja

Aby usunąć oryginalny przycisk Zapisz (nie jestem pewien, co to jest przycisk „wersja robocza”), dodaj następujący kod do swojego functions.php / wtyczki:

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

Tak, to brzydkie.


1
To bardziej przypomina wersję 20 :) Niesamowity kod!
Rarst

Ja też to lubię. Wciąż brakuje, aby ukryć drugi przycisk.
hakre

Usunięcie przycisku Zapisz jest naprawdę trudne, ponieważ post_submit_meta_box()po prostu zrzuca jego zawartość. W ogóle brak filtra. JavaScript lub ob_start()może to rozwiązać. Oba niezbyt eleganckie.
fuxia

Hm, w porządku, dodałem kod, aby usunąć oryginalny przycisk Zapisz. Nie było takie trudne. :)
fuxia

Brakuje mi słów, aby to opisać :) - i powiedziałem to wcześniej: użycie przecinka do sformatowania tablicy zasługuje na Nagrodę Formatters w PHP +1+
brasofilo

11

Kod sugerujący hakre użycie filtra tłumaczącego byłby mniej więcej taki:

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}

Czy istnieją powody, dla których „wersja 1” (obecna akceptowana odpowiedź, napisana przez @toscho) jest lepsza / gorsza od tego podejścia? Wydaje mi się, że jest to jedna z lepszych opcji - prostsze, nie wymaga włamań do usunięcia przycisku „Zapisz” i jest bardziej przyszłościowe.
rinogo

Twoja odpowiedź zainspirowała mnie - rozwinąłem twoje podejście, aby objąć o wiele więcej strun. wordpress.stackexchange.com/a/230513/10388
rinogo

2
Minusem byłoby to, że filtr translacyjny uruchamia się wiele razy, a zaczepienie się o niego jest znaczącym kosztem wydajności. Można to zmniejszyć, filtrując tylko przez ograniczony czas, dodając / usuwając filtr blisko wymaganego punktu w czasie wykonywania.
Rarst

4

To nie jest pełna odpowiedź, ale niektóre wskazówki: Każdy wyświetlany tekst przekracza filtr tłumaczenia i dlatego można go zmienić w funkcji wywołania zwrotnego (hook). Więc jeśli hak jest zarejestrowany tylko na stronie, na której chcesz to zmienić, zadanie wykonane.

Przycisk wersji roboczej można „usunąć”, ukrywając go za pomocą CSS. CSS może zostać wstrzyknięty do <head>-tag administratora z innym wywołaniem zwrotnym. Myślę, że do tego potrzebny jest filtr admin_head. Jest jakoś brudny, ponieważ przycisk wciąż tam jest, na przykład, jeśli użytkownik wyłączy CSS.


3

Dla zachowania spójności zakładam, że wolisz używać opcji „Zapisz” zamiast „Publikuj” w całym Wordpressie zamiast samego tekstu przycisku.

Meta box

Lista postów

W oparciu o rozwiązanie dostarczone przez @Rarst rozszerzyłem kod, aby tłumaczył wiele (wszystkie?) Innych wystąpień słowa „Publikuj” na odpowiednią odmianę „Zapisz”.

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;
}

Do usunięcia przycisku Szkic odpowiedź udzielona przez @toscho zawiera dobre rozwiązanie.


Uwaga: Zmienna niezdefiniowana: s
Amjad

@Ajjad - Spróbuj zmienić wszystkie wystąpienia %1$sna %1\$s. Lub wyłączenie powiadomień / ostrzeżeń ukryje te błędy.
rinogo

Muszę zachować powiadomienia i ostrzeżenia przy debugowaniu. Ale dzięki za to. Błędy już się nie pokazują, dodając, że \
Amjad

2

Innym podejściem byłoby wyrejestrowanie metaboxa, a następnie ponowne zarejestrowanie tego samego pola z różnymi wartościami, czyli nazewnictwo tekstu publikacji.

Zobacz dyskusję, którą tutaj przeprowadziłem, dotyczącą przeniesienia meta-boxa, powinieneś być w stanie zastosować coś podobnego do zmiany nazwy tego Publikuj tekst.


0

Możesz po prostu znaleźć przycisk za pomocą jQuery i zamienić węzeł tekstowy na coś innego. To by było bułka z masłem.


0

Znacznie czystsze i łatwiejsze rozwiązanie.

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.