Afișarea titlului SEO Yoast WordPress în șablonul de arhivă
Plugin-ul WordPress SEO de la Yoast permite utilizatorilor să adauge titluri SEO și meta descrieri pentru paginile de arhivă ale termenilor de taxonomie. Acestea sunt apoi folosite în header-ul documentului.
Încerc să afișez titlul SEO al termenilor de taxonomie ca H1 în șablonul meu de arhivă taxonomie.
Pentru a face acest lucru într-o postare, tip de postare sau pagină este simplu:
echo get_post_meta($post->ID, '_yoast_wpseo_title', true);
Pe șabloanele de arhivă acest lucru nu funcționează.
Știe cineva cum să fac acest lucru să funcționeze?
Exemplu screenshot
Acesta este titlul unui termen specific de etichetă. Încerc să afișez acest titlu - dar pentru un termen de taxonomie personalizat - în șabloanele mele de arhivă.
Codul final
Acesta este codul pe care am ajuns să-l folosesc în șablonul meu archive.php
. Funcționează dacă folosiți o taxonomie personalizată. Pentru etichete sau categorii, consultați răspunsul lui Mike Madern de mai jos.
<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'];
//afișăm opțiunile taxonomiei pentru debug
//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>

Obțineți titlurile SEO pentru arhive
Dacă ați definit un titlu personalizat pentru arhiva unui Custom Post Type, îl puteți obține astfel:
$titles = get_option( 'wpseo_titles' );
$title = $titles['title-ptarchive-POST_TYPE'];
echo apply_filters( 'the_title', $title );
Nu uitați să înlocuiți POST_TYPE
cu propriul vostru Custom Post Type.
Pentru a afișa toate variabilele wpseo_title
, puteți folosi:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_titles' ), 1 ) );
Astfel puteți selecta cu ușurință pe cea de care aveți nevoie.
Obțineți titlurile SEO pentru termeni
Categorii
Folosind acest cod puteți obține titlul SEO definit:
$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 );
Etichete
Folosind acest cod puteți obține titlul SEO definit:
$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 );
Pentru a afișa toate variabilele wpseo_taxonomy_meta
, puteți folosi:
printf( '<pre>%s</pre>', print_r( get_option( 'wpseo_taxonomy_meta' ), 1 ) );
În acest fel puteți vedea structura și variabilele disponibile.

Presupun că ai ratat ultima mea editare a postării :-P Am adăugat o versiune cu $tag_id
.

Mulțumesc mult pentru cod, nu aș fi reușit niciodată să îmi dau seama de asta. Am făcut câteva mici modificări pentru a-l face să funcționeze cu taxonomii personalizate.

Aceasta este minunat. A trebuit să folosesc get_queried_object()->term_id
, în loc de get_query_var()
, deoarece primul returnează ID-ul, iar celălalt returnează slug-ul, făcând ca codul să arunce notificări de "index nedefinit". De asemenea, aveți grijă să verificați dacă există ceva setat la $meta['post_tag|category']
, deoarece veți primi și notificări de index nedefinit. (WP 4.2.2, apropo)

Din păcate, asta nu a funcționat. Afișează titlul SEO al primului post din arhivă. Probabil va trebui să mă uit în baza de date să văd unde sunt stocate aceste date.

Am adăugat codul meu. Nu sunt sigur dacă am explicat că voiam să afișez titlul paginii, nu titlurile fiecărui post din buclă.

Exact asta căutam. Afișează titlul SEO în buclă. De asemenea, am înlocuit get_the_ID() cu $post->ID

Din anumite motive, asta afișează descrierea meta pentru mine, ca și cum aș fi folosit _yoast_wpseo_metadesc

Obținerea cuvântului cheie principal pentru categorii și etichete
Pentru a obține cuvântul cheie principal al unei Categorii sau Etichete programatic, puteți utiliza oricare dintre aceste două metode:
/** Metoda 1. Acces direct la opțiuni. **/
$meta = get_option( 'wpseo_taxonomy_meta' ); // necesar doar o dată, deci păstrați acest lucru în afara/înainte de bucla foreach.
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo $meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
}
}
Aceasta este practic abordarea folosită de Mike la sfârșitul postării sale.
sau
/** Metoda 2. Utilizarea funcției Yoast. **/
$posttags = get_the_tags();
if ($posttags) {
foreach( $posttags as $tag ) {
echo WPSEO_Taxonomy_Meta::get_term_meta( $tag->term_id, 'post_tag', 'focuskw' );
}
}
Tind să prefer a doua abordare deoarece în acest fel nu trebuie să obțin sau să mă preocup de obținerea opțiunii meta eu însumi.
În fișierul dvs. functions.php
, ați putea dori să testați if class_exists( 'WPSEO_Taxonomy_Meta' )
și apoi poate să înfășurați funcția Yoast într-o funcție proprie, pentru a fi sigur în cazul în care ați înceta să mai utilizați Yoast SEO în viitor.
O scurtă explicație
Așa cum s-a menționat în întrebarea originală, ceva de genul get_post_meta( $tag->term_id, '_yoast_wpseo_focuskw', true);
nu va funcționa pentru categorii și pagini (va returna nimic.)
De ce se întâmplă acest lucru?
Asta se întâmplă deoarece, pentru categorii și etichete, cuvântul cheie principal este salvat în altă parte în baza de date. În loc să fie salvat în tabelul wp_postmeta
ca de obicei, este îngropat adânc în interiorul tabelului wp_options
, ca un obiect JSON.
Metodele de mai sus ne permit să accesăm aceste valori.
În final, dacă sunteți ca mine și nu vă puteți aminti numele taxonomiilor (de exemplu: nu este evident de ce etichetele folosesc taxonomia post_tag
și nu doar tag
), verificați pur și simplu URL-urile când editați o categorie sau o etichetă: va afișa …taxonomy=category…
sau similar.

Răspuns Obținerea cuvântului cheie pentru categorii și etichete
// funcționează, mulțumesc
// cu REST API
obține /wp-json/wp/v2/categories?slug=slug_name
plugin.in utilizează Metoda 1
schimbă linia
$meta['post_tag'][$tag->term_id]['wpseo_focuskw'];
$meta['category'][$param_post_id]['wpseo_focuskw'];
