Ändern Sie den Text auf der Schaltfläche Veröffentlichen

21

Gibt es eine Möglichkeit, den Text der Veröffentlichungsschaltfläche in einem benutzerdefinierten Beitragstyp zu ändern, um etwas anderes auszudrücken? Beispiel: Speichern statt veröffentlichen. Und auch den Zugluftknopf entfernen?

Paul Sheldrake
quelle

Antworten:

16

Wenn Sie nachsehen /wp-admin/edit-form-advanced.php, finden Sie die Meta-Box:

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

Beachten Sie, dass __('Publish')- die Funktion dazu __()führt, translate()wo Sie den Filter erhalten 'gettext'.

Es gibt zwei Möglichkeiten, um mit Ihrem Problem umzugehen: 1. Adressieren Sie die Zeichenfolge in einer einzigen speziellen Funktion (achten Sie darauf, dass Sie mit der richtigen Textdomäne übereinstimmen!) Oder 2. Verwenden Sie einen allgemeineren Ansatz.

@Rarst hat gerade Version 1 gepostet, daher füge ich Version 2 hinzu. :)

<?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' )
    )
);

Sie müssen den Code nicht als Plugin verwenden. Es reicht aus, es in die functions.php deines Themas aufzunehmen.

Aktualisieren

Um die ursprüngliche Schaltfläche "Speichern" zu entfernen (nicht sicher, was die Schaltfläche "Entwurf" ist), fügen Sie den folgenden Code zu Ihrer Datei functions.php / a hinzu:

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

Ja, es ist hässlich.

fuxia
quelle
1
Das ist eher wie Version 20 :) Super Code!
Rarst
Ich mag es auch. Fehlt noch, um den anderen Knopf zu verstecken.
Hakre
Das Entfernen der Schaltfläche zum Speichern ist sehr schwierig, da post_submit_meta_box()nur der Inhalt ausgegeben wird. Überhaupt kein Filter. Javascript oder ob_start()könnte das lösen. Beides nicht sehr elegant.
fuxia
Hm, okay, ich habe Code hinzugefügt, um die ursprüngliche Schaltfläche "Speichern" zu entfernen. War nicht so schwer. :)
fuxia
Ich vermisse Worte, um dies zu beschreiben :) - & sagte es vorher: Die Verwendung des Kommas zum Formatieren des Arrays verdient einen PHP Formatters Award +1+
brasofilo
11

Der Code für den Vorschlag von hakre, den Übersetzungsfilter zu verwenden, würde ungefähr so ​​lauten:

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}
Rarst
quelle
Gibt es Gründe, warum "Version 1" (die aktuell akzeptierte Antwort, geschrieben von @toscho) diesem Ansatz überlegen / unterlegen ist? Dies scheint mir das Beste von beidem zu sein - einfacher, erfordert keine Hacks, um die Schaltfläche "Speichern" zu entfernen, und ist zukunftssicherer.
Rinogo
Ihre Antwort hat mich inspiriert - ich habe Ihren Ansatz dahingehend weiterentwickelt, dass viel mehr Zeichenfolgen abgedeckt werden. wordpress.stackexchange.com/a/230513/10388
rinogo
2
Der Nachteil wäre , dass die Übersetzung Filterbrände viel Zeit, in sie Einhaken ist erhebliche Leistungsaufwand. Dies kann reduziert werden, indem nur eine begrenzte Zeit gefiltert wird, indem der Filter in der Nähe des erforderlichen Zeitpunkts in der Laufzeit hinzugefügt oder entfernt wird.
Rarst
4

Dies ist keine vollständige Antwort, aber einige Anweisungen: Jeder angezeigte Text übersteigt einen Übersetzungsfilter und kann daher in einer Rückruffunktion (Hook) geändert werden. Wenn der Haken also nur auf der Seite registriert ist, auf der Sie das ändern möchten, ist die Aufgabe erledigt.

Die Entwurfsschaltfläche kann durch Ausblenden über CSS "entfernt" werden. Das CSS könnte <head>mit einem anderen Rückruf in den -tag des Administrators eingefügt werden. Ich denke der Filter heißt admin_headdafür. Es ist irgendwie dreckig, da die Schaltfläche noch vorhanden ist, zum Beispiel, wenn ein Benutzer CSS ausschaltet.

hakre
quelle
3

Aus Gründen der Konsistenz gehe ich davon aus, dass Sie in Wordpress lieber "Speichern" als "Veröffentlichen" verwenden möchten, anstatt nur auf den Text der Schaltfläche zuzugreifen.

Meta-Box

Beitragsliste

Basierend auf der von @Rarst bereitgestellten Lösung habe ich den Code so erweitert, dass er viele (alle?) Andere Instanzen des Wortes "Veröffentlichen" in die entsprechende Variante von "Speichern" übersetzt.

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

Zum Entfernen der Schaltfläche "Entwurf" enthält die Antwort von @toscho eine gute Lösung.

rinogo
quelle
Hinweis: Nicht definierte Variable: s
Amjad
@Amjad - Versuchen Sie, alle Instanzen von %1$sto zu ändern %1\$s. Wenn Sie Benachrichtigungen / Warnungen deaktivieren, werden diese Fehler ausgeblendet.
rinogo
Ich muss Benachrichtigungen und Warnungen für das Debuggen aktiviert lassen. Aber danke dafür. Die Fehler werden nicht mehr angezeigt, wenn \
Amjad
2

Ein anderer Ansatz wäre, die Registrierung der Metabox aufzuheben und dasselbe Feld mit unterschiedlichen Werten neu zu registrieren, nämlich den Veröffentlichungstext.

In der Diskussion, die ich hier über das Verschieben eines Metakastens geführt habe, sollten Sie in der Lage sein, etwas Ähnliches anzuwenden, um diesen Veröffentlichungstext umzubenennen.

t31os
quelle
0

Sie können die Schaltfläche einfach über jQuery finden und den Textknoten gegen etwas anderes austauschen. Das wäre ein Kinderspiel.

Dan Gayle
quelle
0

Viel sauberere und einfachere Lösung.

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);
Der J
quelle