Come ottenere il nome della categoria primaria nella nuova versione di WordPress
C'è una nuova funzionalità in WordPress che introduce la categoria primaria. Quando selezioni una categoria, può essere specificata una categoria primaria.
La mia domanda è come posso ottenere il nome della categoria primaria utilizzando le funzioni core di WordPress?
Se non esiste una funzione specifica, potete aiutarmi a ottenere la prima categoria figlio della categoria principale?
Per esempio:
- categoria principale
-- categoria figlio 1
-- categoria figlio 2
-- categoria figlio 3
Ho bisogno di ottenere -- categoria figlio 1.
Grazie per il vostro aiuto.

Ho modificato la funzione MMT Designer. Questa versione funziona meglio per me:
if ( ! function_exists( 'get_primary_taxonomy_id' ) ) {
function get_primary_taxonomy_id( $post_id, $taxonomy ) {
$prm_term = '';
if (class_exists('WPSEO_Primary_Term')) {
$wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
$prm_term = $wpseo_primary_term->get_primary_term();
}
if ( !is_object($wpseo_primary_term) || empty( $prm_term ) ) {
$term = wp_get_post_terms( $post_id, $taxonomy );
if (isset( $term ) && !empty( $term ) ) {
return $term[0]->term_id;
} else {
return '';
}
}
return $wpseo_primary_term->get_primary_term();
}
}

Vedo che questa domanda sta ricevendo molta attenzione nell'ultimo anno, ho pensato di rispondere nel modo corretto.
Non esiste una categoria primaria predefinita in WordPress, ma se hai installato il plugin Yoast SEO apparirà una nuova funzionalità nella selezione delle categorie dei Singoli Articoli nell'area di amministrazione, permettendoti di scegliere una categoria primaria.
Per ottenere quella categoria primaria puoi usare la seguente funzione che ho creato:
if ( ! function_exists( 'get_primary_taxonomy_id' ) ) {
function get_primary_taxonomy_id( $post_id, $taxonomy ) {
$prm_term = '';
if (class_exists('WPSEO_Primary_Term')) {
$wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
$prm_term = $wpseo_primary_term->get_primary_term();
}
if ( !is_object($wpseo_primary_term) && empty( $prm_term ) ) {
$term = wp_get_post_terms( $post_id, $taxonomy );
if (isset( $term ) && !empty( $term ) ) {
return wp_get_post_terms( $post_id, $taxonomy )[0]->term_id;
}
return '';
}
return $wpseo_primary_term->get_primary_term();
}
}
Prima controlla se Yoast SEO è installato e attivo, poi tenta di ottenere la categoria primaria. Se Yoast non è installato, recupera tutte le categorie e restituisce la prima.
Nota come questa funzione funzioni anche per i custom post type con tassonomie personalizzate.
Alla fine questa funzione restituisce l'ID della categoria (termine). Se vuoi ottenere l'oggetto della categoria (termine) puoi usare get_term($ID, $taxonomy)
passando l'ID.
Nuova modifica:
Se stai usando Rank Math e vuoi ottenere la tassonomia primaria impostata con questo plugin, il seguente codice potrebbe aiutarti:
if (class_exists('RankMath')) {
$primary_tax = get_post_meta( $post_id, 'rank_math_primary_category', true );
if (!empty($primary_tax)) {
return get_term( $primary_tax, $taxonomy );
}
}
Suggerisco di aggiungerlo dopo l'istruzione if
di Yoast.

Per rispondere alla tua seconda domanda: get_categories()
ti permette di passare una serie di argomenti, uno dei quali riguarda le categorie figlie.
Per prima cosa ottieni la categoria genitore. Ho usato get_category_by_slug
qui, ma potresti usare qualsiasi altro metodo per ottenerla, ad esempio la funzione di Yoast per recuperare la categoria principale.
$category = get_category_by_slug( 'category-name' );
Poi ottieni tutte le categorie figlie:
$args = array(
'type' => 'post',
'child_of' => $category->term_id,
'orderby' => 'name',
'order' => 'ASC', // o qualsiasi ordine preferisci
'hide_empty' => FALSE,
'hierarchical' => 1,
'taxonomy' => 'category',
);
$child_categories = get_categories($args );
Infine seleziona il primo elemento se esiste:
if !empty($child_categories) $first_child = $child_categories[0];

questa funzione non è per WordPress ma per il plugin SEO, puoi utilizzare la seguente funzione
function get_post_primary_category($post_id, $term='category',
$return_all_categories=false){
$return = array();
if (class_exists('WPSEO_Primary_Term')){
// Mostra la categoria primaria di Yoast se è abilitata e impostata
$wpseo_primary_term = new WPSEO_Primary_Term( $term, $post_id );
$primary_term = get_term($wpseo_primary_term->get_primary_term());
if (!is_wp_error($primary_term)){
$return['primary_category'] = $primary_term;
}
}
if (empty($return['primary_category']) || $return_all_categories){
$categories_list = get_the_terms($post_id, $term);
if (empty($return['primary_category']) && !empty($categories_list)){
$return['primary_category'] = $categories_list[0]; //ottieni la prima categoria
}
if ($return_all_categories){
$return['all_categories'] = array();
if (!empty($categories_list)){
foreach($categories_list as &$category){
$return['all_categories'][] = $category->term_id;
}
}
}
}
return $return;
}
questa funzione è stata scritta da lab21.gr

Una soluzione nativa di Wordpress per restituire la categoria genitore corrente.
function primary_categories($arr_excluded_cats) {
if($arr_excluded_cats == null) {
$arr_excluded_cats = array();
}
$post_cats = get_the_category();
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'parent' => 0
);
$primary_categories = get_categories($args);
foreach ($primary_categories as $primary_category) {
foreach ($post_cats as $post_cat) {
if(($primary_category->slug == $post_cat->slug) && (!in_array($primary_category->slug, $arr_excluded_cats))) {
return $primary_category->slug;
}
}
}
}
//se hai più di due categorie genitore associate al post, puoi eliminare quelle che non vuoi qui
$dont_return_these = array(
'receitas','enciclopedico'
);
//usa la funzione in questo modo:
echo primary_categories($dont_return_these);
Commenti:
- se hai solo una categoria genitore per post, passa null invece dell'array
- se desideri un output diverso dallo slug, modifica questo in return $primary_category-> slug;

Ho appena refattorizzato la risposta di Eqhes. Un codice un po' più pulito :)
if (!function_exists('get_primary_taxonomy_id')) {
function get_primary_taxonomy_id($post_id, $taxonomy) {
$prm_term = '';
$wpseo_primary_term = '';
if (class_exists('WPSEO_Primary_Term')) {
$wpseo_primary_term = new WPSEO_Primary_Term($taxonomy, $post_id);
$prm_term = $wpseo_primary_term->get_primary_term();
}
if (is_object($wpseo_primary_term) && !empty($prm_term)) {
return $wpseo_primary_term->get_primary_term();
}
$term = wp_get_post_terms($post_id, $taxonomy);
if (isset($term) && !empty($term)) {
return $term[0]->term_id;
}
return '';
}
}

Utilizzo il plugin sCategory Permalink https://wordpress.org/plugins/scategory-permalink/
// Ottiene l'ID della categoria primaria associata al post
$category_primary_id = get_post_meta(get_the_ID(), '_category_permalink', true);
// Verifica se è presente un ID categoria
if (!empty($category_primary_id)) {
// Recupera i dettagli della categoria
$category = get_category($category_primary_id);
// Stampa il nome della categoria per debug
var_dump($category->name);
}

Cos'è _category_permalink
? Non conosco questa metakey. Dove devo inserire questo codice? Potresti modificare la tua risposta usando il link di modifica sopra e aggiungere alcuni dettagli alla tua risposta, per favore?

> Cos'è category_permalink ? Ogni categoria primaria per il post viene salvata come _category_permalink

> Non conosco questa metakey.
Usa una query SQL per trovare tutte le metakey per il post:
SELECT * FROM postmeta WHERE post_id = ID
