add_theme_support( 'title-tag' ) en conflicto con función de títulos personalizados
'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!

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.

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 :)

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?

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.

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.

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

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.
