Cambiar el texto en el botón Publicar

21

¿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?

Paul Sheldrake
fuente

Respuestas:

16

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.

Actualizar

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.

fuxia
fuente
1
Eso es más como la versión 20 :) ¡Código increíble!
Rarst
A mí también me gusta. Todavía falta para ocultar el otro botón.
Hakre
Eliminar el botón Guardar es realmente difícil, ya que post_submit_meta_box()solo descarga su contenido. Sin filtro en absoluto. Javascript o ob_start()podría resolver eso. Ambos no muy elegantes.
fuxia
Hm, está bien, agregué un código para eliminar el botón Guardar original. No fue tan difícil. :)
fuxia
Echo de menos palabras para describir esto :) - y lo dije antes: el uso de la coma para formatear la matriz merece un Premio de Formateadores PHP +1+
brasofilo
11

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;
}
Rarst
fuente
¿Hay razones por las que la "versión 1" (la respuesta aceptada actual, escrita por @toscho) es superior / inferior a este enfoque? Este parece ser el mejor de los dos para mí: más simple, no requiere hacks para eliminar el botón "Guardar" y está más preparado para el futuro.
rinogo
Su respuesta me inspiró: he desarrollado su enfoque para cubrir muchas más cadenas. wordpress.stackexchange.com/a/230513/10388
rinogo
2
La desventaja sería que el filtro de traducción se dispara muchas veces, engancharlo es una sobrecarga de rendimiento significativa. Esto se puede reducir al filtrar solo durante un tiempo limitado agregando / quitando el filtro cerca del punto necesario en tiempo de ejecución.
Rarst
4

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_headpara eso. De alguna manera está sucio ya que el botón todavía está allí, por ejemplo, si un usuario apaga CSS.

hakre
fuente
3

Por coherencia, supongo que preferiría usar "Guardar" en lugar de "Publicar" en Wordpress en lugar de solo en el texto del botón.

Caja meta

Lista de publicaciones

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.

rinogo
fuente
Aviso: Variable indefinida: s
Amjad
@Amjad: intente cambiar todas las instancias de %1$sa %1\$s. O, al desactivar los avisos / advertencias se ocultarán estos errores.
rinogo
Necesito mantener avisos y advertencias para la depuración. Pero gracias por esto. Los errores ya no se muestran al agregar que \
Amjad
2

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.

t31os
fuente
0

Simplemente puede encontrar el botón a través de jQuery e intercambiar el nodo de texto por otra cosa. Eso sería pan comido.

Dan Gayle
fuente
0

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);
La j
fuente