Modificare text buton Publicare
Există o modalitate de a schimba textul butonului de publicare pentru un tip de postare personalizat, astfel încât să afișeze un text diferit? De exemplu, să afișeze "Salvează" în loc de "Publică". Și, de asemenea, să eliminați butonul de ciornă?

Dacă te uiți în /wp-admin/edit-form-advanced.php
, vei găsi meta box-ul:
add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core');
Observă __('Publish')
– funcția __()
duce la translate()
unde ai acces la filtrul 'gettext'
.
Există două modalități de a rezolva problema ta: 1. Abordează șirul într-o singură funcție specializată (asigură-te că utilizezi textdomain-ul corect!) sau 2. folosește o abordare mai generică.
@Rarst tocmai a postat varianta 1, așa că voi adăuga varianta 2. :)
<?php
/*
Plugin Name: Retranslate
Description: Adaugă traduceri.
Version: 0.1
Author: Thomas Scholz
Author URI: http://toscho.de
License: GPL v2
*/
class Toscho_Retrans {
// stochează opțiunile
protected $params;
/**
* Configurează informațiile de bază
*
* @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 );
// Când să adaugi filtrul
$hook = 'backend' == $this->params['context']
? 'admin_head' : 'template_redirect';
add_action( $hook, array ( $this, 'register_filter' ) );
}
/**
* Container pentru add_filter()
* @return void
*/
public function register_filter()
{
add_filter( 'gettext', array ( $this, 'translate' ), 10, 3 );
}
/**
* Codul care face treaba.
*
* @param string $translated
* @param string $original
* @param string $domain
* @return string
*/
public function translate( $translated, $original, $domain )
{
// ieși rapid
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;
}
// Înlocuiește în final
return strtr( $original, $this->params['replacements'] );
}
}
// Cod exemplu
// Înlocuiește 'Publish' cu 'Salvează' și 'Preview' cu 'Previzualizează' pe pagini și articole
$Toscho_Retrans = new Toscho_Retrans(
array (
'replacements' => array (
'Publish' => 'Salvează'
, 'Preview' => 'Previzualizează'
)
, 'post_type' => array ( 'page', 'post' )
)
);
Nu este necesar să folosești codul ca plugin. Includerea lui în functions.php al temei tale va fi suficient.
Actualizare
Pentru a elimina butonul original de Salvare (nu sunt sigur ce este butonul 'draft'), adaugă următorul cod în functions.php/un plugin:
add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}
Da, este urât.

Eliminarea butonului de salvare este foarte dificilă, deoarece post_submit_meta_box()
doar afișează conținutul său. Nu există niciun filtru. Javascript sau ob_start()
ar putea rezolva asta. Ambele soluții nu sunt foarte elegante.

Hm, bine, am adăugat niște cod pentru a elimina butonul original Salvează. Nu a fost atât de greu. :)

Îmi lipsesc cuvintele pentru a descrie asta :) - și am mai spus-o: folosirea virgulei pentru a formata array-ul merită un Premiu PHP pentru Formatoare +1+

Mulțumesc pentru acest cod! Întrebare sinceră - care sunt avantajele acestei abordări ("versiunea 1") în comparație cu codul lui @Rarst ("versiunea 2")? Folosirea gettext
pare abordarea mai curată aici, deoarece nu vrem să schimbăm nicio funcționalitate, doar textul - exact pentru ce a fost conceput gettext
. De asemenea, Versiunea 2 este probabil mai rezistentă la viitor.

Există motive pentru care "versiunea 1" (răspunsul acceptat în prezent, scris de @toscho) este superioară/inferioară acestei abordări? Aceasta mi se pare cea mai bună dintre cele două - mai simplă, nu necesită hack-uri pentru a elimina butonul "Save" și este mai viabilă pe termen lung.

Răspunsul tău m-a inspirat - am evoluat abordarea ta pentru a acoperi mult mai multe șiruri. http://wordpress.stackexchange.com/a/230513/10388

Dezavantajul ar fi că filtrul de traducere se activează de foarte multe ori, iar conectarea la el reprezintă o suprasolicitare semnificativă a performanței. Aceasta poate fi redusă prin filtrarea doar pentru o perioadă limitată de timp, adăugând/eliminând filtrul aproape de punctul necesar în timpul de execuție.

Acesta nu este un răspuns complet, ci doar câteva indicații: Orice text afișat trece printr-un filtru de traducere și poate fi modificat într-o funcție de callback (hook). Deci, dacă hook-ul este înregistrat doar pe pagina unde doriți să schimbați acel text, problema este rezolvată.
Butonul de "draft" poate fi "eliminat" prin ascunderea lui via CSS. CSS-ul poate fi injectat în tag-ul <head>
al panoului de administrare cu un alt callback. Cred că filtrul se numește admin_head
pentru asta. Este o soluție puțin murdară, deoarece butonul este încă acolo, de exemplu dacă un utilizator dezactivează CSS-ul.

Pentru consistență, presupun că ai prefera să folosești "Salvează" în loc de "Publică" în întregul Wordpress, nu doar pe textul butonului.
Bazându-mă pe soluția oferită de @Rarst, am extins codul astfel încât să traducă multe (toate?) celelalte instanțe ale cuvântului "Publică" în variația corespunzătoare a "Salvează".
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 "Salvează";
case "Published on: <b>%1\$s</b>": return "Salvat pe: <b>%1\$s</b>";
case "Publish <b>immediately</b>": return "Aprobă <b>imediat</b>";
case "Publish on: <b>%1\$s</b>": return "Aprobă pe: <b>%1\$s</b>";
case "Privately Published": return "Salvat privat";
case "Published": return "Salvat";
case "Save & Publish": return "Salvează"; //"Dublu-salvare"? :)
default: return $translation;
}
}
function translate_publish_post_status_number($translation, $single, $plural, $number, $domain) {
if($translation == "Published <span class=\"count\">(%s)</span>") {
return "Salvat <span class=\"count\">(%s)</span>";
}
return $translation;
}
Pentru eliminarea butonului Draft, răspunsul dat de @toscho conține o soluție bună.

@Amjad - Încearcă să schimbi toate aparițiile %1$s
în %1\$s
. Sau, dezactivarea notificărilor/avertismentelor va ascunde aceste erori.

O altă abordare ar fi dezînregistrarea metabox-ului, apoi reînregistrarea aceluiași box cu valori diferite, în special textul de publicare..
Vezi discuția pe care am avut-o aici referitor la mutarea unui meta box, ar trebui să poți aplica ceva similar pentru a redenumi acel text de Publicare.

Soluție mult mai curată și mai ușoară.
function change_publish_btn_txt() {
echo "<script type='text/javascript'>jQuery(document).ready(function(){
jQuery('#publish').attr('value', 'Textul tău personalizat');
});</script>";
}
add_action('admin_footer-post-new.php', 'change_publish_btn_txt', 99);
