Cambiar el texto del botón Publicar

3 nov 2010, 00:29:07
Vistas: 19.8K
Votos: 24

Sí, es posible cambiar el texto del botón "Publicar" en un tipo de contenido personalizado para que muestre un texto diferente, como "Guardar". También se puede eliminar el botón de borrador. Aquí te muestro cómo hacerlo:

// Cambiar el texto del botón Publicar
function cambiar_texto_boton_publicar( $translation, $text ) {
    if ( 'tu_post_type' == get_post_type() ) {
        if ( $text == 'Publish' ) {
            return 'Guardar';
        }
    }
    return $translation;
}
add_filter( 'gettext', 'cambiar_texto_boton_publicar', 10, 2 );

// Eliminar el botón de borrador
function eliminar_boton_borrador() {
    if ( 'tu_post_type' == get_post_type() ) {
        echo '
        <style type="text/css">
            #minor-publishing {
                display: none;
            }
        </style>';
    }
}
add_action( 'admin_head-post.php', 'eliminar_boton_borrador' );
add_action( 'admin_head-post-new.php', 'eliminar_boton_borrador' );

Asegúrate de reemplazar 'tu_post_type' con el nombre real de tu tipo de contenido personalizado. Este código debe agregarse en el archivo functions.php de tu tema o en un plugin personalizado.

0
Todas las respuestas a la pregunta 7
7
18

Si buscas en /wp-admin/edit-form-advanced.php, encontrarás el meta box:

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

Observa el __('Publish') – la función __() lleva a translate() donde obtienes el filtro 'gettext'.

Hay dos formas de manejar tu problema: 1. Dirigirte a la cadena en una función especializada (¡asegúrate de coincidir con el dominio de texto correcto!) o 2. usar un enfoque más genérico.

@Rarst acaba de publicar la versión 1, así que añadiré la versión 2. :)

<?php
/*
Plugin Name: Retranslate
Description: Añade traducciones.
Version:     0.1
Author:      Thomas Scholz
Author URI:  http://toscho.de
License:     GPL v2
*/

class Toscho_Retrans {
    // almacena las opciones
    protected $params;

    /**
     * Configura la información básica
     * 
     * @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 );

        // Cuándo añadir el filtro
        $hook = 'backend' == $this->params['context'] 
            ? 'admin_head' : 'template_redirect';

        add_action( $hook, array ( $this, 'register_filter' ) );
    }

    /**
     * Contenedor para add_filter()
     * @return void
     */
    public function register_filter()
    {
        add_filter( 'gettext', array ( $this, 'translate' ), 10, 3 );
    }

    /**
     * El código que realmente trabaja.
     * 
     * @param  string $translated
     * @param  string $original
     * @param  string $domain
     * @return string
     */
    public function translate( $translated, $original, $domain )
    {
        // salir temprano
        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;
        }

        // Finalmente reemplazar
        return strtr( $original, $this->params['replacements'] );
    }
}

// Código de ejemplo
// Reemplaza 'Publish' con 'Save' y 'Preview' con 'Lurk' en páginas y entradas
$Toscho_Retrans = new Toscho_Retrans(
    array (
        'replacements' => array ( 
            'Publish' => 'Save'
        ,   'Preview' => 'Lurk' 
        )
    ,   'post_type'    => array ( 'page', 'post' )
    )
);

No necesitas usar el código como un plugin. Incluirlo en el functions.php de tu tema será suficiente.

Actualización

Para eliminar el botón original de Guardar (no estoy seguro de qué es el botón 'draft'), añade el siguiente código a tu functions.php o a 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
}

Sí, es feo.

5 nov 2010 10:08:11
Comentarios

¡Eso se parece más a la versión 20! :) Código increíble.

Rarst Rarst
5 nov 2010 10:22:00

A mí también me gusta. Todavía falta ocultar el otro botón.

hakre hakre
6 nov 2010 20:49:17

Eliminar el botón de guardar es realmente difícil, porque post_submit_meta_box() simplemente vuelca su contenido. No hay ningún filtro. Javascript o ob_start() podrían resolverlo. Ninguna de las dos opciones es muy elegante.

fuxia fuxia
6 nov 2010 23:21:28

Hm, vale, he añadido algo de código para eliminar el botón Guardar original. No fue tan difícil. :)

fuxia fuxia
6 nov 2010 23:55:26

Me faltan palabras para describir esto :) - y lo dije antes: el uso de la coma para formatear el array merece un Premio PHP a los Formateadores +1+

brasofilo brasofilo
17 may 2012 17:45:07

¡Gracias por este código! Pregunta genuina - ¿cuáles son las ventajas de este enfoque ("versión 1") en comparación con el código de @Rarst ("versión 2")? Usar gettext parece el enfoque más limpio aquí ya que no queremos cambiar ninguna funcionalidad, solo el texto - exactamente para lo que gettext fue diseñado. Además, la Versión 2 probablemente sea más a prueba de futuro.

rinogo rinogo
23 jun 2016 03:51:23

@rinogo Ambas versiones están utilizando el filtro gettext. La mía simplemente es reutilizable para cualquier texto.

fuxia fuxia
23 jun 2016 04:19:41
Mostrar los 2 comentarios restantes
3
15

El código para la sugerencia de hakre de usar un filtro de traducción sería algo así:

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

function cambiar_boton_publicar( $traduccion, $texto ) {

if ( $texto == 'Publish' )
    return 'Guardar';

return $traduccion;
}
5 nov 2010 08:44:51
Comentarios

¿Hay razones por las que la "versión 1" (la respuesta aceptada actual, escrita por @toscho) es superior/inferior a este enfoque? A mí me parece que este es el mejor de los dos: más simple, no requiere trucos para eliminar el botón "Guardar" y es más futuro.

rinogo rinogo
23 jun 2016 03:53:41

Tu respuesta me inspiró: he evolucionado tu enfoque para cubrir muchos más strings. http://wordpress.stackexchange.com/a/230513/10388

rinogo rinogo
23 jun 2016 05:33:29

El inconveniente sería que el filtro de traducción se dispara muchas veces, y engancharse a él supone una sobrecarga significativa de rendimiento. Esto puede reducirse filtrando solo durante un tiempo limitado, añadiendo/eliminando el filtro cerca del punto necesario en tiempo de ejecución.

Rarst Rarst
29 jun 2016 16:24:56
0

Esta no es una respuesta completa sino algunas indicaciones: Cualquier texto que se muestra pasa por un filtro de traducción y por lo tanto puede ser modificado en una función de callback (hook). Así que si el hook solo está registrado en la página donde quieres cambiar eso, misión cumplida.

El botón de borrador podría "eliminarse" ocultándolo mediante CSS. El CSS podría inyectarse en la etiqueta <head> del administrador con otro callback. Creo que el filtro para eso se llama admin_head. Es un poco sucio ya que el botón sigue estando ahí, por ejemplo si un usuario desactiva el CSS.

4 nov 2010 04:23:12
3

Para mantener la consistencia, asumo que prefieres usar "Guardar" en lugar de "Publicar" en todo WordPress, no solo en el texto del botón.

Meta box

Post list

Basándome en la solución proporcionada por @Rarst, expandí el código para que traduzca muchas (¿todas?) las demás 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 "Guardar";
        case "Published on: <b>%1\$s</b>":  return "Guardado el: <b>%1\$s</b>";
        case "Publish <b>immediately</b>":  return "Aprobar <b>inmediatamente</b>";
        case "Publish on: <b>%1\$s</b>":    return "Aprobar el: <b>%1\$s</b>";
        case "Privately Published":         return "Guardado como privado";
        case "Published":                   return "Guardado";
        case "Save & Publish":              return "Guardar"; //¿"Doble guardado"? :)
        default:                            return $translation;
    }
}

function translate_publish_post_status_number($translation, $single, $plural, $number, $domain) {
    if($translation == "Published <span class=\"count\">(%s)</span>") {
        return "Guardado <span class=\"count\">(%s)</span>";
    }

    return $translation;
}

Para eliminar el botón de Borrador, la respuesta dada por @toscho contiene una buena solución.

23 jun 2016 05:32:13
Comentarios

Aviso: Variable no definida: s

Amjad Amjad
2 may 2017 02:16:56

@Amjad - Intenta cambiar todas las instancias de %1$s por %1\$s. O bien, desactivar los avisos/advertencias ocultará estos errores.

rinogo rinogo
2 may 2017 19:11:54

Necesito mantener los avisos y advertencias activados para depuración. Pero gracias por esto. Los errores ya no aparecen al añadir esa \

Amjad Amjad
2 may 2017 21:31:52
0

Otro enfoque sería desregistrar el metabox y luego volver a registrarlo con valores diferentes, específicamente el texto de publicación...

Consulta la discusión que tuve aquí sobre cómo mover un meta box, deberías poder aplicar algo similar para renombrar ese texto de Publicar.

5 nov 2010 12:40:06
0

Podrías simplemente encontrar el botón mediante jQuery y reemplazar el nodo de texto por algo diferente. Sería pan comido hacerlo.

5 nov 2010 04:53:44
0

Solución mucho más limpia y sencilla.

function change_publish_btn_txt() {
    echo "<script type='text/javascript'>jQuery(document).ready(function(){
        jQuery('#publish').attr('value', 'Tu Texto Personalizado');
    });</script>";
}
add_action('admin_footer-post-new.php', 'change_publish_btn_txt', 99);
24 ago 2016 17:50:54