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?
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:
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.
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.
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.
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;
}
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.
Dla zachowania spójności zakładam, że wolisz używać opcji „Zapisz” zamiast „Publikuj” w całym Wordpressie zamiast samego tekstu przycisku.
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.
%1$s
na %1\$s
. Lub wyłączenie powiadomień / ostrzeżeń ukryje te błędy.
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.
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);