Mostrar el título SEO de Yoast WordPress en la plantilla de archivo
El plugin WordPress SEO de Yoast permite a los usuarios agregar títulos SEO y metadescripciones a las páginas de archivo de términos de taxonomía. Estos luego se utilizan en el encabezado del documento.
Estoy tratando de mostrar el título SEO de los términos de taxonomía como un H1 en mi plantilla de archivo de taxonomía.
Hacer esto en una entrada, tipo de entrada o página es fácil:
echo get_post_meta($post->ID, '_yoast_wpseo_title', true);
En las plantillas de archivo esto no funciona.
¿Alguien sabe cómo hacer que esto funcione?
Ejemplo de captura de pantalla
Este es el título de un término de etiqueta específico. Estoy tratando de mostrar este título - pero para un término de taxonomía personalizada - en mis plantillas de archivo.
Código final
Esto es lo que terminé usando en mi plantilla archive.php
. Funciona si estás usando una taxonomía personalizada. Para etiquetas o categorías, consulta la respuesta de Mike Madern más abajo.
<h1 class="archive-title">
<?php
if ( is_tax() ) :
$taxonomy = get_queried_object()->taxonomy;
$term_id = get_queried_object()->term_id;
$meta = get_option( 'wpseo_taxonomy_meta' );
$title = $meta[$taxonomy][$term_id]['wpseo_title'];
//Imprimir para depuración
//printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_taxonomy_meta' ), 1 ) );
if ( isset($meta) && !empty($title) ) :
echo apply_filters( 'the_title', $title );
else :
single_term_title();
endif;
endif;
?>
</h1>

Obtener títulos SEO de archivos
Si definiste un título de archivo para un Custom Post Type, puedes obtenerlo con:
$titles = get_option( 'wpseo_titles' );
$title = $titles['title-ptarchive-POST_TYPE'];
echo apply_filters( 'the_title', $title );
Recuerda reemplazar POST_TYPE
por tu propio Custom Post Type.
Para mostrar todas las variables de wpseo_title
, puedes usar:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_titles' ), 1 ) );
Así podrás seleccionar fácilmente la que necesites.
Obtener títulos SEO de términos
Categorías
Con este código puedes obtener el título SEO que definiste:
$cat_id = get_query_var( 'cat' );
$meta = get_option( 'wpseo_taxonomy_meta' );
$title = $meta['category'][$cat_id]['wpseo_title'];
echo apply_filters( 'the_title', $title );
Etiquetas
Con este código puedes obtener el título SEO que definiste:
$tag_id = get_query_var( 'tag' );
$meta = get_option( 'wpseo_taxonomy_meta' );
$title = $meta['post_tag'][$tag_id]['wpseo_title'];
echo apply_filters( 'the_title', $title );
Para mostrar todas las variables de wpseo_taxonomy_meta
, puedes usar:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_taxonomy_meta' ), 1 ) );
De esta manera podrás ver la estructura y las variables disponibles.

¿Agregaste el título en SEO > títulos y metadatos > Tipos de entrada?

Supongo que te perdiste mi última edición :-P Añadí una versión con $tag_id
.

Muchas gracias por el código, nunca hubiera podido resolver esto. Hice algunos cambios menores para que funcione con taxonomías personalizadas.

Esto es genial. Tuve que usar get_queried_object()->term_id
en lugar de get_query_var()
, ya que el primero devuelve el ID, mientras que el segundo devuelve el slug, lo que hacía que el código mostrara avisos de "índice indefinido". También, asegúrate de verificar si hay algo configurado en $meta['post_tag|category']
, ya que también obtendrás avisos de índice indefinido. (Por cierto, WP 4.2.2)

Desafortunadamente eso no funcionó. Muestra el título SEO del primer post en el archivo. Probablemente tendré que revisar la base de datos para ver dónde se almacenan estos datos.

He añadido mi código. No estoy seguro si expliqué que quería mostrar el título de la página, no los títulos de cada post dentro del loop.

Esto es exactamente lo que estaba buscando. Muestra el título SEO en el bucle. Además, reemplacé get_the_ID() con $post->ID

Por alguna razón, esto me muestra la meta descripción como si hubiera usado _yoast_wpseo_metadesc

Obteniendo la palabra clave principal para categorías y etiquetas
Para obtener la palabra clave principal de una Categoría o Etiqueta programáticamente, puedes usar cualquiera de estos dos métodos:
/** Método 1. Acceder directamente a las opciones. **/
$meta = get_option( 'wpseo_taxonomy_meta' ); // solo se necesita una vez, así que mantén esto fuera/antes de tu bucle foreach.
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo $meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
}
}
Este es básicamente el enfoque que usa Mike al final de su publicación.
o
/** Método 2. Usar la función de Yoast. **/
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo WPSEO_Taxonomy_Meta::get_term_meta( $tag->term_id, 'post_tag', 'focuskw' );
}
}
Tiendo a preferir el segundo enfoque porque así no tengo que obtener o preocuparme por conseguir la opción meta yo mismo.
En tu archivo functions.php
, quizás quieras verificar if class_exists( 'WPSEO_Taxonomy_Meta' )
y luego quizás envolver la función de Yoast en una función propia, para estar seguro en caso de que dejes de usar Yoast SEO en el futuro.
Algo de contexto
Como se mencionó en la pregunta original, algo como get_post_meta( $tag->term_id, '_yoast_wpseo_focuskw', true);
no funcionará para categorías y páginas (devolverá nada).
¿Por qué pasa eso?
Esto se debe a que, para categorías y etiquetas, la palabra clave principal se guarda en otro lugar de la base de datos. En lugar de guardarse en la tabla wp_postmeta
como es habitual, está enterrada profundamente en la tabla wp_options
, como un objeto JSON.
Los métodos anteriores nos permiten acceder a estos valores.
Finalmente, si eres como yo y no puedes recordar los nombres de las taxonomías (ej.: no es obvio por qué las etiquetas usan la taxonomía post_tag
y no simplemente tag
), solo revisa las URLs cuando editas una categoría o etiqueta: mostrará …taxonomy=category…
o similar.

Respuesta Obteniendo la palabra clave principal para categorías y etiquetas
// funciona, gracias
// con la API REST
obtener /wp-json/wp/v2/categories?slug=slug_name
plugin.in usa el Método 1
cambiar la línea
$meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
$meta['category'][$param_post_id]['wpseo_focuskw'];
