Problemas com tag de título e document_title_parts

12

Wordpress version 4.5.1

Estou tentando atualizar dinamicamente os títulos das páginas em um modelo específico. Depois de muita pesquisa e aprendizado sobre as wp_title()mudanças, estou tentando usar document_title_parts. No entanto, não consigo executar o filtro.

Estou em um tema infantil functions.php:

add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( 'document_title_parts', function( $title )
{
    error_log('here');
    return $title;

}, 10, 1 );

Eu tentei as duas variações de adição de suporte de tema, como mostrado acima, mas, observando meu log, nada aparece na página recarregada. Como error_logestava trabalhando com outras funções (como wp_title), o registro de erros está funcionando.

Eu também tentei pre_get_document_title, o que é acionado no carregamento da página, embora não seja possível alterá-lo.

Assim! Ou estou usando o filtro errado, não configurei meu tema corretamente ou outra coisa que não conheço. Qualquer ajuda seria muito apreciada!

edite para adicionar mais detalhes

Tentativa de uma função init, mas que também não está funcionando: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Além disso, embora eu tenha removido qualquer referência <title>de header.php, o título do site real ainda está aparecendo na fonte.

hookedonwinter
fonte
Por que você comentou esta linha //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? É o uso correto da adição de suporte de tema.
Sumit
@ Sumit Tentei a versão comentada e a versão ativa.
Hookedonwinter 12/05
Talvez tente adicionar add_theme_support()função em um gancho init . Outra coisa é garantir que você substitua seu header.phparquivo para não ter uma <title>tag html .
Howdy_McGee
@Howdy_McGee Apenas tentei isso, ainda nada. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter
@hookedonwinter E você tem certeza de que não há <title>tags no seu header.php? Talvez tente substituir 10por PHP_MAX_INT. Além disso, o parâmetro passado é uma matriz em vez de um valor de sequência.
Howdy_McGee

Respostas:

13

Eu executei seu filtro na minha área de desenvolvimento. Não deu certo. Depois, desliguei o plugin Yoast SEO, que eu sabia que também estava mexendo no título da página. Então funcionou. Então, minha sugestão seria que outro plugin esteja mexendo com ele.

No caso do Yoast, era uma chamada de filtro para pre_get_document_titleretornar não vazio. Nesse caso, wp_get_document_titleestá em curto-circuito e o restante da função, incluindo o documents_title_partsfiltro, não é avaliado, como você pode ver nas primeiras linhas de código:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

Então, peguei seu filtro e mudei o gancho para pre_get_document_title. Não deu certo. Então mudei a prioridade para um nível mais alto que o mesmo filtro no Yoast. Então funcionou. Portanto, não conheço sua configuração, mas sugiro que você experimente:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );
cjbj
fonte
1
Você entendeu! Encontrei a mesma coisa e desativei o Yoast. Acabei de reativar e usei sua prioridade e funcionou. OBRIGADO!
Hookedonwinter
Um pouco mais sobre ganchos aqui: wordpress.stackexchange.com/questions/109869/…
cjbj
No meu site, a pre_get_document_titleprioridade 15 é suficiente.
vee
7

Após algumas experiências, cheguei à seguinte sugestão: poderia ser, que a <title>tag seja "codificada" dentro do tema do seu pai header.php? Se for esse o caso, você pode tentar remover a <title>tag dos temas do seu filho header.php(copiar os pais header.phppara a pasta do tema filho) e adicionar o suporte ao tema novamente através do functions.php:

add_theme_support( 'title-tag' );

Vou tentar explicar o que me levou a essa sugestão: tentei como você e outras pessoas sugeriram - mas descobri que encontrei duas <title>tags no código-fonte. O primeiro teve o título padrão , o segundo o título modificado . Mas (é claro) na barra de título do navegador, só pude ver o título padrão.

Em seguida, verifiquei o header.phptema principal que usei (vinte e quatorze) e a <title>tag foi realmente codificada dentro desse modelo da seguinte forma:

<title><?php wp_title( '|', true, 'right' ); ?></title>

Depois de removê-lo, adicionei o seguinte código ao tema filho functions.phpe ele funcionou:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

Por isso, basicamente também funcionou antes de remover a <title>tag do modelo - apenas que havia duas <title> tags das quais a posterior foi ignorada. Esse poderia ser o mesmo problema com o seu tema?

Desde o wp 4.4.0, no entanto, o <title>tag é criado dinamicamente pela função _wp_render_title_tag()que basicamente chama outra função wp_get_document_title()e envolve os tags html em torno do resultado. Para encurtar a história: se o tema header.phpestiver sem a <title>tag, é possível que você substitua o título diretamente pre_get_document_titleou document_title_partsconforme descrito aqui :

1) altere o título diretamente:

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) filtrando as partes do título:

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}
tillinberlin
fonte
3

Depois de ler sua postagem de cima para baixo e de baixo para cima, você tem com toda a probabilidade um filtro que passa um título pelo pre_get_document_titlefiltro. A pista aqui a seguinte declaração:

Eu também tentei pre_get_document_title, que dispara no carregamento da página,

Observando o código de sourewp_get_document_title() , vemos o seguinte código:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

O que isso significa é que, sempre que um valor não vazio é passado pelo pre_get_document_titlefiltro, a wp_get_document_title()função retornará qualquer valor que foi passado pelo pre_get_document_titlefiltro. Nesse caso, o document_title_separatorfiltro e o document_title_partsfiltro nunca serão executados, pois estes são executados somente após o pre_get_document_titlefiltro.

Olhando o que você disse um pouco mais adiante:

... embora eu não consiga mudar o título.

você definitivamente tem um pre_get_document_titlefiltro com autoridade que está substituindo sua instância do mesmo filtro e, por causa desse filtro, a função retorna o que for passado para ele, resultando na sua document_title_partsexecução do filtro.

O que você precisará fazer é usar um grepou um bom editor e pesquisar wp-contentesse pre_get_document_titlefiltro na pasta inteira . Depois de localizar esse filtro, você pode removê-lo e substituí-lo pelo seu

Pieter Goosen
fonte
Obrigado pela resposta! Infelizmente, pesquisar todo o conteúdo wp document_title_partsou pre_get_document_titleretornar 0 resultados. Estou usando sublime text 2 para procurar todos wp-content ...
hookedonwinter
Isso realmente me bate. É realmente estranho que um filtro em uma função seja acionado corretamente e o filtro depois disso não. Tente limpar todos os caches e reinstalar o WordPress se tiver certeza de que não é um plug-in ou seu tema. O que acontece em uma instalação de baunilha com um tema em pacote, o que acontece se você alterar diretamente o tema pai. Infelizmente, isso é o que posso ajudar com as informações fornecidas. Se você tem alguma informação extra, apresentar uma edição para que possamos ajudá-lo a resolver isso
Pieter Goosen
@PieterGoosen Quando o primeiro filtro retorna vazio, a função fica em curto-circuito e o segundo filtro não é avaliado.
Cjbj 01/07
@ cjbj sim, correto, foi o que eu disse na minha resposta, a questão é o que. Como o OP disse, ele não consegue encontrar um filtro pre_get_document_title, o que teria explicado totalmente por que o segundo filtro não seria acionado. Isso deixa o pre_get_document_titlefiltro vazio, o que significa que os outros dois filtros na função devem ser acionados, mas não são. Deixa-me concluir um núcleo corrompido do Wordpress.
Pieter Goosen
Só que eu consegui esse filtro para trabalhar facilmente.
Cjbj 01/07
2

Se o tema pai não declarar suporte, title-tagvocê poderá fazê-lo desta maneira no tema filho

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

Filtre a document_title_partsmatriz do tipo de retorno esperado, assim, altere a condição if de acordo com seus requisitos ou remova-a completamente para alterar o título em todo o site apenas para testar se funciona.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

Você pode tentar estas duas funções?

Nikhil Chavan
fonte
Obrigado pela resposta. Eu tentei, removendo a instrução if para torná-la mais ampla e adicionei algum log de erro para ver o que estava acontecendo. Aqui está o código. . Somente add_theme_support_childé registrado.
precisa