Visualizzare il titolo SEO di Yoast WordPress nel template di archivio
Il plugin WordPress SEO di Yoast permette agli utenti di aggiungere titoli SEO e meta descrizioni alle pagine di archivio dei termini di tassonomia. Questi vengono poi utilizzati nell'head del documento.
Sto cercando di visualizzare il titolo SEO dei termini di tassonomia come H1 nel mio template di archivio tassonomia.
Per farlo in un post, tipo di post o pagina è semplice:
echo get_post_meta($post->ID, '_yoast_wpseo_title', true);
Nei template di archivio questo non funziona.
Qualcuno sa come farlo funzionare?
Esempio screenshot
Questo è il titolo di uno specifico termine tag. Sto cercando di visualizzare questo titolo - ma per un termine di tassonomia personalizzata - nei miei template di archivio.
Codice finale
Questo è quello che ho finito per utilizzare nel mio template archive.php
. Funziona se stai utilizzando una tassonomia personalizzata. Per i tag o le categorie dai un'occhiata alla risposta di Mike Madern qui sotto.
<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'];
//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>

Ottenere i titoli SEO degli archivi
Se hai definito un titolo personalizzato per l'archivio di un Custom Post Type, puoi ottenerlo con:
$titles = get_option( 'wpseo_titles' );
$title = $titles['title-ptarchive-POST_TYPE'];
echo apply_filters( 'the_title', $title );
Ricordati di sostituire POST_TYPE
con il tuo Custom Post Type.
Per visualizzare tutte le variabili wpseo_title
, puoi usare:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_titles' ), 1 ) );
In questo modo puoi facilmente selezionare quella che ti serve.
Ottenere i titoli SEO dei termini
Categorie
Usando questo codice puoi ottenere il titolo SEO che hai definito:
$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 );
Tag
Usando questo codice puoi ottenere il titolo SEO che hai definito:
$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 );
Per visualizzare tutte le variabili wpseo_taxonomy_meta
, puoi usare:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_taxonomy_meta' ), 1 ) );
In questo modo puoi vedere la struttura e le variabili disponibili.

Immagino tu abbia perso la mia ultima modifica al post :-P Ho aggiunto una versione con $tag_id
.

Grazie mille per il codice, non sarei mai riuscito a capirlo da solo. Ho apportato alcune piccole modifiche per farlo funzionare con tassonomie personalizzate.

Fantastico. Ho dovuto usare get_queried_object()->term_id
invece di get_query_var()
però, poiché il primo restituisce l'ID mentre il secondo restituisce lo slug, facendo sì che il codice generi avvisi di "indice non definito". Inoltre, assicurati di verificare se c'è qualcosa impostato in $meta['post_tag|category']
, altrimenti riceverai anche qui avvisi di indice non definito. (WP 4.2.2, tra l'altro)

Purtroppo non ha funzionato. Mostra il titolo SEO del primo post nell'archivio. Probabilmente dovrò esaminare il database per vedere dove sono memorizzati questi dati.

Ho aggiunto il mio codice. Non sono sicuro di aver spiegato che volevo visualizzare il titolo della pagina, non i titoli di ogni post nel loop.

Questo è esattamente quello che stavo cercando. Restituisce il titolo SEO nel loop. Inoltre, ho sostituito get_the_ID() con $post->ID

Per qualche motivo questo mi restituisce la meta descrizione, come se avessi usato _yoast_wpseo_metadesc

Ottenere la parola chiave focus per categorie e tag
Per ottenere la parola chiave focus di una Categoria o Tag programmaticamente, puoi utilizzare uno di questi due metodi:
/** Metodo 1. Accedere direttamente alle opzioni. **/
$meta = get_option( 'wpseo_taxonomy_meta' ); // necessario solo una volta, quindi mantieni questo al di fuori/prima del tuo ciclo foreach.
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo $meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
}
}
Questo è fondamentalmente l'approccio utilizzato da Mike alla fine del suo post.
oppure
/** Metodo 2. Utilizzare la funzione di Yoast. **/
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo WPSEO_Taxonomy_Meta::get_term_meta( $tag->term_id, 'post_tag', 'focuskw' );
}
}
Tendo a preferire il secondo approccio perché in questo modo non devo recuperare o preoccuparmi di ottenere l'opzione meta da solo.
Nel tuo functions.php
, potresti voler testare if class_exists( 'WPSEO_Taxonomy_Meta' )
e poi magari avvolgere la funzione di Yoast in una tua funzione, per essere al sicuro nel caso in cui un giorno decidessi di smettere di usare Yoast SEO.
Alcuni dettagli tecnici
Come menzionato nella domanda originale, qualcosa come get_post_meta( $tag->term_id, '_yoast_wpseo_focuskw', true);
non funzionerà per categorie e pagine (restituirà nulla.)
Ma perché?
Questo perché, per categorie e tag, la parola chiave focus è salvata altrove nel database. Invece di essere salvata nella tabella wp_postmeta
come al solito, è sepolta in profondità nella tabella wp_options
, come un oggetto JSON.
I metodi sopra ci permettono di accedere a questi valori.
Infine, se sei come me e non riesci a ricordare il nome delle tassonomie (es: non è ovvio perché i tag usano la tassonomia post_tag
e non semplicemente tag
), basta controllare gli URL quando modifichi una categoria o un tag: mostrerà …taxonomy=category…
o simili.

Risposta Ottenere la parola chiave principale per categorie e tag
// funziona, grazie
// con l'API REST
get /wp-json/wp/v2/categories?slug=slug_name
plugin.in usa il Metodo 1
modificare la riga
$meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
$meta['category'][$param_post_id]['wpseo_focuskw'];
