add_theme_support( 'title-tag' ) en conflicto con función de títulos personalizados

3 feb 2015, 16:47:51
Vistas: 23.5K
Votos: 4

'Title-tag' es una característica del tema introducida en la Versión 4.1, y quiero usarla como título predeterminado de mi tema. Esta característica debe agregarse en la acción after_setup_theme o init. Está recomendado aquí. El uso de esta característica funciona perfectamente para mí. PERO:

Además, tengo una función de títulos personalizados que se puede habilitar/deshabilitar usando el framework Option-Tree. Este framework se carga directamente en functions.php. Luego, tengo el resto de las funciones agregadas en after_setup_theme con prioridad 2:

add_action( 'after_setup_theme', 'theme_functions', 2);

Y este es el filtro agregado para mis títulos personalizados:

add_filter( 'wp_title', 'custom_titles', 10, 2 );

Cuando deshabilito mi función custom_titles(), la nueva característica title-tag funciona perfectamente, pero cuando habilito los personalizados, devuelve el título dos veces. Exactamente así:

<title>Ejemplo de meta título de página principal</title>

Ejemplo de meta título de página principal<title></title>

El primero es correcto, y está usando la función wp_title() insertada en el header.php entre las etiquetas title, pero el segundo está incluido en la primera línea de la función wp_head().

De hecho, mi función custom_titles() funcionaba perfectamente sin el uso de la nueva característica title-tag. Así que parece que el conflicto aparece cuando intento usar ambos.

¿Crees que sería una buena solución poner ambas características en after_theme_setup prioridad 1 en una simple declaración condicional, o hay una mejor manera de hacer esto? Parece que la solución debería ser más sencilla.


ACTUALIZACIÓN: Esto es una locura. Si elimino las etiquetas title del encabezado para usar la nueva característica, el theme-check devuelve:

REQUERIDO: El tema necesita tener etiquetas title, idealmente en el archivo header.php.

Si elimino la nueva característica para usar mi función personalizada, el theme-check devuelve:

RECOMENDADO: No se encontró ninguna referencia a add_theme_support( "title-tag" ) en el tema. Se recomienda que el tema implemente esta funcionalidad para WordPress 4.1 y superior.

Para ser honesto: LOL. ¡Agregando add_theme_support en functions.php, y etiquetas title en header.php como ellos «RECOMIENDAN» y «REQUIEREN», respectivamente, siempre devuelve el título dos veces!

2
Comentarios

Una pista: Al usar la compatibilidad con 'title-tag', puedes ver el código fuente de function wp_get_document_title() - allí encontrarás los siguientes filtros (WP 4.7.3): pre_get_document_title, document_title_separator y document_title_parts. El primero te da control total sobre el título, en lugar del filtro específico wp_title mencionado en tu pregunta, que ahora parece obsoleto y pronto podría quedar desaprobado.

Minister Minister
21 abr 2017 10:54:25
Todas las respuestas a la pregunta 2
7

Tu problema es que no puedes usar wp_title() en el tema si el tema ya tiene soporte para title-tag. El <head> de tu tema debería verse así:

<head>
    <meta charset="<?php bloginfo( 'charset' ); ?>">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <?php wp_head(); ?>
</head>

El filtro y soporte para title-tag:

add_action( 'after_setup_theme', 'theme_functions' );
function theme_functions() {

    add_theme_support( 'title-tag' );

}

add_filter( 'wp_title', 'custom_titles', 10, 2 );
function custom_titles( $title, $sep ) {

    //Verifica si los títulos personalizados están activados desde tu framework de opciones
    if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
        //Un ejemplo sencillo
        $title = "Algún otro título" . $title;;
    }

    return $title;
}

Si haces esto, funcionará perfectamente.

3 feb 2015 18:52:23
Comentarios

Ya veo. Gracias. Sabía que tenía que ser más fácil... Creo que mi error estuvo en la función de títulos personalizados, sin llamar a las variables $title y $sep. Déjame intentarlo :)

Unix Unix
3 feb 2015 18:58:06

He añadido la verificación de la opción enable_custom_titles.

cybmeta cybmeta
3 feb 2015 18:59:19

¿Es mejor usar la verificación dentro de la función?

Unix Unix
3 feb 2015 19:02:48

Hay un problema: en esta función no guardo los títulos en variables, uso funciones cuando es posible, como the_title(); o single_tag_title();... Y en variables cuando es necesario, por ejemplo en meta-boxes: $metatitle = get_post_meta($post->ID, 'metabox_title_tag', true);. ¿Cómo puedo solucionarlo?

Unix Unix
3 feb 2015 19:06:47

Ok, tendré que cambiar mi función custom_titles() para obtener todos los valores en variables. Mi solución era más rápida, pero tu respuesta es la forma correcta y puedo omitir algunas declaraciones condicionales.

Unix Unix
3 feb 2015 19:21:02

the_title(), single_tag_title() y similares son etiquetas de plantilla, es decir, funciones destinadas a usarse en archivos de plantilla, no para obtener información fuera de archivos de plantilla. Por ejemplo, si quieres mostrar el título de una publicación en un archivo de plantilla puedes usar the_title() dentro del loop; si quieres obtener el título de una publicación fuera de un archivo de plantilla podrías usar get_the_tile( $post_ID ) o un objeto post devuelto por get_post, WP_Query, etc. Si necesitas ayuda con esto, por favor, publica otra pregunta.

cybmeta cybmeta
3 feb 2015 19:33:54

Esta respuesta va en la dirección correcta, pero los filtros modernos deberían usar document_title_parts o pre_get_document_title... mira este hilo: https://wordpress.stackexchange.com/questions/305353/cant-change-the-title-tag-with-wp-title-filter

Jesse Nickles Jesse Nickles
23 may 2023 23:30:14
Mostrar los 2 comentarios restantes
0

He encontrado una solución, así que estoy seguro de que será útil para otros.


Primero: títulos personalizados

Explicación: Si mi función custom_titles() está activada, cargar la función en functions.php bajo la prioridad after_theme_setup 2, y mostrar las etiquetas title en el archivo header.php.

En functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) {
    // La función de títulos personalizados
}

En header.php:

<?php if ( ot_get_option( 'enable_custom_titles' ) === 'on' ) : ?>
<title><?php wp_title( '|', true, 'right' ); ?></title>
<?php endif; ?>

<!-- Lo siguiente devolverá la nueva función de títulos de WP si los títulos personalizados están desactivados -->
<?php wp_head(); ?>

Luego: soporte para title-tag

Explicación: Si mi función custom_titles() está desactivada, usar add_theme_support('title-tag'); en functions.php bajo la prioridad after_theme_setup 1.

Entonces, en functions.php:

if ( ot_get_option( 'enable_custom_titles' ) === 'off' ) {
    add_theme_support( 'title-tag' );
}

Sobre la prioridad after_theme_setup, en mi caso solo es necesario cargar el framework Option-Tree antes de usar la función ot_get_option(), por lo que podría ser diferente —o no necesario— si alguien usa un framework de opciones diferente.

Ahora mi tema tiene la nueva función de títulos en la Versión 4.1 y títulos personalizados para SEO usando meta-boxes: ambos disponibles. (Sé que es territorio de plugins, pero es bueno tener algunas funciones esenciales —«esenciales» en mi opinión— integradas en el tema). Gracias a esto, los clientes tendrán más control sobre cómo se muestran los títulos.

3 feb 2015 18:47:18