Problemas con title-tag y document_title_parts

12

Wordpress version 4.5.1

Estoy tratando de actualizar dinámicamente los títulos de página en una plantilla en particular. Después de mucho excavar y aprender sobre los wp_title()cambios, estoy tratando de usar document_title_parts. Sin embargo, no puedo hacer que el filtro se ejecute en absoluto.

Estoy en un 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 );

He intentado ambas variaciones de agregar compatibilidad con temas como se muestra arriba, pero viendo mi registro, no aparece nada en la recarga de la página. Eso error_logfuncionaba con otras funciones (como wp_title), por lo que el registro de errores funciona.

También lo intenté pre_get_document_title, lo que se dispara al cargar la página, aunque no puedo hacer que cambie realmente el título.

¡Entonces! Estoy usando el filtro incorrectamente, no configuré mi tema correctamente o algo más de lo que no estoy al tanto. Cualquier ayuda sería muy apreciada!

editar para agregar más detalles

Intentando una función init, pero eso tampoco funciona: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Además, aunque eliminé cualquier referencia <title>de header.php, el título real del sitio todavía aparece en la fuente.

hookedonwinter
fuente
¿Por qué comentaste esta línea //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Es el uso correcto de agregar soporte de temas.
Sumit
@Sumit Probé tanto la versión comentada como la versión activa.
hookedonwinter
Tal vez intente agregar una add_theme_support()función en un gancho de inicio . Otra cosa es asegurarse de sobrescribir su header.phparchivo para que no tenga una <title>etiqueta html .
Howdy_McGee
@Howdy_McGee Solo intenté eso, todavía nada. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter
@hookedonwinter ¿Y estás seguro de que no hay <title>etiquetas en tu header.php? Tal vez intente reemplazar 10con PHP_MAX_INT. Además, el parámetro pasado es una matriz en lugar de un valor de cadena.
Howdy_McGee

Respuestas:

13

Ejecuté su filtro en mi área de desarrollo. No funcionó. Luego apagué el plugin Yoast SEO, que sabía que también estaba jugando con el título de la página. Entonces funcionó. Por lo tanto, mi sugerencia sería que otro plugin está jugando con él.

En el caso de Yoast, fue una llamada de filtro para pre_get_document_titledevolver no vacío. En ese caso, wp_get_document_titlese cortocircuita y el resto de la función, incluido el documents_title_partsfiltro, no se evalúa, como puede ver en las primeras líneas de código:

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

Entonces, tomé tu filtro y cambié el gancho a pre_get_document_title. No funcionó. Luego cambié la prioridad a un nivel más alto que el mismo filtro en Yoast. Entonces funcionó. Por lo tanto, no sé acerca de su configuración, pero le sugiero que pruebe esto:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );
cjbj
fuente
1
¡Lo tienes! Encontré lo mismo y desactivé a Yoast. Acabo de reactivar y usé tu prioridad y funcionó. ¡GRACIAS!
hookedonwinter 01 de
Un poco más sobre ganchos aquí: wordpress.stackexchange.com/questions/109869/…
cjbj
Desde mi sitio, la pre_get_document_titleprioridad 15 es suficiente.
vee
7

Después de experimentar un poco, llegué a la siguiente sugerencia: ¿podría ser que la <title>etiqueta está "codificada" dentro del tema principal header.php? Si ese es el caso, puede intentar eliminar la <title>etiqueta del tema de su hijo header.php(copie el de sus padres header.phpen la carpeta del tema de su hijo) y luego agregar el soporte del tema nuevamente a través de functions.php:

add_theme_support( 'title-tag' );

Trataré de explicar lo que me llevó a esta sugerencia: intenté como usted y otros sugirieron, pero resultó que encontré dos <title>etiquetas en el código fuente. El primero tenía el título estándar , el segundo el título modificado . Pero (por supuesto) en la barra de título del navegador solo pude ver el título predeterminado.

Luego verifiqué el header.phptema principal que usé (veinticuatro) y la <title>etiqueta estaba codificada dentro de esa plantilla así:

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

Después de eliminarlo, agregué el siguiente código al tema secundario functions.phpy funcionó:

/**
 * 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 );

Básicamente, también funcionó antes de eliminar la <title>etiqueta de la plantilla, solo que había dos <title> etiquetas de las cuales la última se ignoró. ¿Podría ser este el mismo problema con tu tema?

Desde wp 4.4.0, sin embargo, la <title>etiqueta se crea dinámicamente por la función _wp_render_title_tag()que básicamente llama a otra función wp_get_document_title()y envuelve las etiquetas html alrededor del resultado. Larga historia corta: si a su tema header.phple falta la <title>etiqueta, es probable que pueda anular el título directamente pre_get_document_titleo document_title_partscomo se describe aquí :

1) cambiar el título directamente:

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

2) filtrar las partes del título:

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

Después de leer su publicación de arriba a abajo y de abajo hacia arriba, es probable que tenga un filtro que está pasando un título a través del pre_get_document_titlefiltro. La pista aquí la siguiente declaración:

También lo intenté pre_get_document_title, que se dispara al cargar la página,

Mirando el código soure parawp_get_document_title() , vemos el siguiente código:

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

Lo que esto significa es que, cuando un valor no vacío pasa a través del pre_get_document_titlefiltro, la wp_get_document_title()función devolverá cualquier valor que se haya pasado a través del pre_get_document_titlefiltro. En este caso, el document_title_separatorfiltro y el document_title_partsfiltro nunca se ejecutarán, ya que estos solo se ejecutan después del pre_get_document_titlefiltro.

Mirando lo que dijiste un poco más adelante:

... aunque no puedo lograr que realmente cambie el título.

definitivamente tiene un pre_get_document_titlefiltro con autoridad que anula su instancia del mismo filtro y, debido a este filtro, la función devuelve lo que se le pasa, lo que hace que su document_title_partsfiltro no se ejecute.

Lo que deberá hacer es utilizar uno grepo un buen editor y buscar wp-contentese pre_get_document_titlefiltro en toda su carpeta . Una vez que haya localizado ese filtro, puede sacarlo de allí para quitarlo y reemplazarlo con el suyo.

Pieter Goosen
fuente
¡Gracias por la respuesta! Desafortunadamente, la búsqueda de todo el contenido de wp document_title_partso pre_get_document_titledevuelve 0 resultados. Estoy usando SublimeText 2 para buscar todo el contenido de wp ...
hookedonwinter
Esto realmente me gana. Es realmente extraño que un filtro en una función se active correctamente y el filtro después de eso no. Intenta borrar todos los cachés y reinstala WordPress si estás seguro de que no es un complemento o tu tema. Lo que sucede en una instalación de vainilla con un tema incluido, lo que sucede si modifica directamente el tema principal. Desafortunadamente, esto es todo lo que puedo ayudar con la información proporcionada. Si tiene información adicional, presente una edición para que podamos ayudarlo a resolver esto
Pieter Goosen
@PieterGoosen Cuando el primer filtro vuelve no vacío, la función se cortocircuita y el segundo filtro no se evalúa.
cjbj 01 de
@cjbj sí, correcto, eso es lo que dije en mi respuesta, el problema es qué. Como dijo el OP, no puede encontrar un filtro activado pre_get_document_title, lo que habría explicado totalmente por qué el segundo filtro no se dispararía. Esto deja el pre_get_document_titlefiltro vacío, lo que significa que los otros dos filtros en la función deben activarse, pero no lo hacen. Me deja concluir un núcleo corrupto de Wordpress.
Pieter Goosen
Excepto que conseguí que ese filtro funcionara fácilmente.
cjbj 01 de
2

Si el tema principal no declara soporte para title-tagusted, puede hacerlo así en el tema secundario

/**
 * 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 la document_title_partsmatriz de tipo de retorno esperado, de esta manera, asegúrese de cambiar la condición if según sus requisitos, o elimínela por completo para cambiar el título en todo el sitio solo para probar si 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' );

¿Puedes probar estas dos funciones?

Nikhil Chavan
fuente
Gracias por la respuesta. Lo intenté, eliminando la declaración if para hacerlo más amplio, y agregué algunos registros de errores para ver qué pasa. Aquí está el código. . Solo add_theme_support_childse registra.
hookedonwinter