¿Hay alguna manera de cambiar el texto del botón de publicación en un tipo de publicación personalizada para decir algo diferente? Por ejemplo, Guardar en lugar de Publicar. ¿Y también eliminar el botón de borrador?
¿Hay alguna manera de cambiar el texto del botón de publicación en un tipo de publicación personalizada para decir algo diferente? Por ejemplo, Guardar en lugar de Publicar. ¿Y también eliminar el botón de borrador?
Respuestas:
Si observa /wp-admin/edit-form-advanced.php
, encontrará el cuadro meta:
add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core');
Tenga en cuenta que la __('Publish')
función __()
lleva a translate()
donde obtiene el filtro 'gettext'
.
Hay dos formas de manejar su problema: 1. Aborde la cadena en una sola función especializada (¡asegúrese de que coincida con el dominio de texto correcto!) O 2. use un enfoque más genérico.
@Rarst acaba de publicar la versión 1, así que agregaré la versión 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' )
)
);
No necesita usar el código como complemento. Incluirlo en las funciones de tu tema.php será suficiente.
Para eliminar el botón Guardar original (no estoy seguro de cuál es el botón 'borrador'), agregue el siguiente código a su plugin functions.php / a:
add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}
Si, es feo.
post_submit_meta_box()
solo descarga su contenido. Sin filtro en absoluto. Javascript o ob_start()
podría resolver eso. Ambos no muy elegantes.
El código para la sugerencia de hakre de usar el filtro de traducción sería algo como esto:
add_filter( 'gettext', 'change_publish_button', 10, 2 );
function change_publish_button( $translation, $text ) {
if ( $text == 'Publish' )
return 'Save';
return $translation;
}
Esta no es una respuesta completa, sino algunas instrucciones: cualquier texto visualizado supera un filtro de traducción y, por lo tanto, se puede cambiar en una función de devolución de llamada (enlace). Entonces, si el gancho solo está registrado en la página donde desea cambiar eso, el trabajo está hecho.
El botón de borrador se puede "eliminar" ocultándolo a través de CSS. El CSS podría inyectarse en la <head>
etiqueta del administrador con otra devolución de llamada. Creo que el filtro se llama admin_head
para eso. De alguna manera está sucio ya que el botón todavía está allí, por ejemplo, si un usuario apaga CSS.
Por coherencia, supongo que preferiría usar "Guardar" en lugar de "Publicar" en Wordpress en lugar de solo en el texto del botón.
Basado en la solución provista por @Rarst, expandí el código para que traduzca muchas (¿todas?) Otras instancias de la palabra "Publicar" a la variación apropiada de "Guardar".
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;
}
Para eliminar el botón Borrador, la respuesta dada por @toscho contiene una buena solución.
%1$s
a %1\$s
. O, al desactivar los avisos / advertencias se ocultarán estos errores.
Otro enfoque sería cancelar el registro del metabox, luego volver a registrar ese mismo cuadro con diferentes valores, nombrando el texto de publicación.
Vea la discusión que tuve aquí sobre mover un cuadro de meta, debería poder aplicar algo similar para cambiar el nombre de ese texto de publicación.
Una solución mucho más limpia y fácil.
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);