Alterar o texto no botão Publicar

21

Existe uma maneira de alterar o texto do botão de publicação em um tipo de postagem personalizado para dizer algo diferente? Por exemplo, salve em vez de publicar. E também remover o botão de rascunho?

Paul Sheldrake
fonte

Respostas:

16

Se você olhar /wp-admin/edit-form-advanced.php, encontrará a caixa meta:

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

Observe a __('Publish')- a função __()leva para translate()onde você obtém o filtro 'gettext'.

Há duas maneiras de lidar com o seu problema: 1. Aborde a string em uma única função especializada (certifique-se de corresponder ao domínio de texto correto!) Ou 2. use uma abordagem mais genérica.

A @Rarst acaba de publicar a versão 1, então adicionarei a versão 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' )
    )
);

Você não precisa usar o código como um plug-in. Incluí-lo nas funções do seu tema.php será suficiente.

Atualizar

Para remover o botão Salvar original (não sei ao certo qual é o botão 'rascunho'), adicione o seguinte código ao seu functions.php / a plugin:

add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{   
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}

Sim, é feio.

fuxia
fonte
1
Isso é mais parecido com a versão 20 :) Código incrível!
Rarst
Eu também gosto disso. Ainda falta ocultar o outro botão.
hakre
Remover o botão Salvar é realmente difícil, porque post_submit_meta_box()apenas despeja seu conteúdo. Nenhum filtro. Javascript ou ob_start()poderia resolver isso. Ambos não são muito elegantes.
fuxia
Hum, ok, adicionei um código para remover o botão Salvar original. Não foi tão difícil. :)
fuxia
Eu sinto falta de palavras para descrever este :) - e disse isso antes: o uso da vírgula para formatar a matriz merece um Prêmio Formatadores PHP +1+
brasofilo
11

O código para a sugestão do hakre de usar o filtro de tradução seria algo como isto:

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

function change_publish_button( $translation, $text ) {

if ( $text == 'Publish' )
    return 'Save';

return $translation;
}
Rarst
fonte
Existem razões pelas quais a "versão 1" (a resposta atual aceita, escrita por @toscho) é superior / inferior a essa abordagem? Este parece ser o melhor dos dois para mim - mais simples, não requer hacks para remover o botão "Salvar" e é mais à prova de futuro.
Rinogo 23/06
Sua resposta me inspirou - desenvolvi sua abordagem para cobrir muito mais strings. wordpress.stackexchange.com/a/230513/10388
rinogo 23/06
2
A desvantagem seria que o filtro de conversão é acionado muitas vezes, conectando-o a uma sobrecarga de desempenho significativa. Isso pode ser reduzido filtrando apenas por um tempo limitado, adicionando / removendo o filtro próximo ao ponto necessário no tempo de execução.
Rarst
4

Esta não é uma resposta completa, mas algumas orientações: Qualquer texto exibido ultrapassa um filtro de tradução e, portanto, pode ser alterado em uma função de retorno de chamada (gancho). Portanto, se o gancho estiver registrado apenas na página em que você deseja alterar isso, trabalho feito.

O botão de rascunho pode ser "removido" ocultando-o via CSS. O CSS pode ser injetado na <head>tag-do administrador com outro retorno de chamada. Eu acho que o filtro é chamado admin_headpara isso. De alguma forma, está sujo, pois o botão ainda está lá, por exemplo, se um usuário desativar o CSS.

hakre
fonte
3

Por uma questão de consistência, suponho que você prefira usar "Salvar" em vez de "Publicar" no Wordpress, em vez de apenas no texto do botão.

Meta box

Lista de postagem

Com base na solução fornecida pelo @Rarst, ampliei o código para converter muitas (todas?) Outras instâncias da palavra "Publicar" na variação apropriada de "Salvar".

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 remover o botão Rascunho, a resposta dada por @toscho contém uma boa solução.

rinogo
fonte
Nota: Variável indefinida: s
Amjad
@ Ammad - Tente alterar todas as instâncias de %1$spara %1\$s. Ou, desativar avisos / avisos ocultará esses erros.
Rinogo 2/17
Eu preciso manter avisos e avisos para depuração. Mas obrigado por isso. Os erros não aparecem mais ao adicionar que \
Amjad
2

Outra abordagem seria cancelar o registro da metabox e registrar novamente a mesma caixa com valores diferentes, nomeando o texto de publicação.

Veja a discussão que tive aqui sobre como mover uma caixa de meta. Você deve aplicar algo semelhante para renomear o texto Publicar.

t31os
fonte
0

Você pode encontrar o botão via jQuery e trocar o nó de texto por outra coisa. Isso seria um pedaço de bolo para fazer.

Dan Gayle
fonte
0

Solução muito mais limpa e 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);
O J
fonte