Cum să obții numele categoriei principale în noua versiune WordPress
Există o nouă funcționalitate în WordPress care introduce categoria principală. Când selectezi o categorie, poate fi specificată categoria principală.
Întrebarea mea este cum pot obține numele acelei categorii principale folosind funcțiile de bază WordPress?
Dacă nu există o funcție dedicată, mă puteți ajuta să obțin prima subcategorie a categoriei principale?
de exemplu:
- categoria principală
-- subcategoria 1
-- subcategoria 2
-- subcategoria 3
Am nevoie să obțin -- subcategoria 1.
Mulțumesc pentru ajutor.
Pentru a obține prima subcategorie, poți folosi următorul cod:
$args = array(
'child_of' => $parent_category_id,
'orderby' => 'term_id',
'order' => 'ASC',
'hide_empty' => false,
'number' => 1
);
$categories = get_categories($args);
if(!empty($categories)) {
$first_child = $categories[0];
echo $first_child->name; // Afișează numele primei subcategorii
}
Pentru categoria principală Yoast SEO, poți folosi:
$primary_cat_id = get_post_meta(get_the_ID(), '_yoast_wpseo_primary_category', true);
if($primary_cat_id) {
$category = get_category($primary_cat_id);
echo $category->name; // Afișează numele categoriei principale
}

Am modificat funcția MMT Designer. Această versiune funcționează mai bine pentru mine:
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();
}
}

Observ că această întrebare a primit multă atenție în ultimul an, așa că am decis să răspund în mod corect.
Nu există o categorie principală în WordPress dacă nu aveți instalat plugin-ul Yoast SEO. Dacă îl aveți instalat, o nouă funcționalitate va apărea în zona de administrare la selecția categoriei pentru Postări individuale, permițându-vă să alegeți categoria principală.
Pentru a obține această categorie principală, puteți utiliza următoarea funcție pe care am creat-o:
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();
}
}
Mai întâi, va verifica dacă Yoast SEO este instalat și activat, apoi va încerca să obțină categoria principală. Dacă Yoast nu este instalat, va prelua toate categoriile și va returna prima.
Observați cum această funcție funcționează și pentru tipuri personalizate de postări (custom post types) cu taxonomii personalizate.
La final, această funcție returnează ID-ul categoriei (term). Dacă doriți să obțineți obiectul categoriei (term), puteți folosi get_term($ID, $taxonomy)
și să treceți ID-ul.
Editare nouă:
Dacă utilizați Rank Math și doriți să obțineți taxonomia principală setată cu acest plugin, următorul fragment de cod vă poate ajuta:
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 );
}
}
Sugerez să adăugați acest cod după instrucțiunea if
pentru Yoast.

Pentru a răspunde la a doua întrebare: get_categories()
vă permite să transmiteți o serie de argumente, dintre care unul se referă la categoriile copil.
Mai întâi obțineți categoria părinte. Am folosit get_category_by_slug
aici, dar puteți utiliza orice altă metodă pentru a o obține, de exemplu funcția Yoast pentru a prelua categoria principală.
$category = get_category_by_slug( 'category-name' );
Apoi obțineți toate categoriile copil:
$args = array(
'type' => 'post',
'child_of' => $category->term_id,
'orderby' => 'name',
'order' => 'ASC', // sau orice altă ordine doriți
'hide_empty' => FALSE,
'hierarchical' => 1,
'taxonomy' => 'category',
);
$child_categories = get_categories($args );
În final selectați primul element dacă există:
if !empty($child_categories) $first_child = $child_categories[0];

acest lucru nu este pentru WordPress ci pentru un plugin SEO, puteți utiliza următoarea funcție
function get_post_primary_category($post_id, $term='category',
$return_all_categories=false){
$return = array();
if (class_exists('WPSEO_Primary_Term')){
// Afișează categoria principală din Yoast dacă este activată și setată
$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]; //obține prima categorie
}
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;
}
această funcție este scrisă de lab21.gr

O soluție nativă WordPress pentru a returna categoria părinte curentă.
function categorii_principale($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
);
$categorii_principale = get_categories($args);
foreach ($categorii_principale as $categorie_principala) {
foreach ($post_cats as $post_cat) {
if(($categorie_principala->slug == $post_cat->slug) && (!in_array($categorie_principala->slug, $arr_excluded_cats))) {
return $categorie_principala->slug;
}
}
}
}
//dacă aveți mai mult de două categorii părinte asociate articolului, puteți șterge cele pe care nu le doriți aici
$exclude_acestea = array(
'retete','enciclopedic'
);
//utilizați funcția astfel:
echo categorii_principale($exclude_acestea);
Comentarii:
- dacă aveți o singură categorie părinte per articol, transmiteți null în loc de array
- dacă doriți alt output în loc de slug, modificați această linie: return $categorie_principala->slug;

Tocmai am refactorizat răspunsul lui Eqhes. Un cod puțin mai curat :)
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 '';
}
}

Folosesc pluginul sCategory Permalink https://wordpress.org/plugins/scategory-permalink/
$category_primary_id = get_post_meta(get_the_ID(), '_category_permalink', true);
if (!empty($category_primary_id)) {
$category = get_category($category_primary_id);
var_dump($category->name);
}

Ce este _category_permalink
? Nu sunt familiarizat cu acest metakey. Unde ar trebui să pun acest cod? Poți să editezi răspunsul tău folosind link-ul de editare de mai sus și să adaugi mai multe detalii în răspunsul tău, te rog?

> Ce este category_permalink ? Fiecare categorie principală pentru postare este salvată ca _category_permalink

> Nu sunt familiarizat cu acest metakey.
Folosește o interogare SQL pentru a găsi toate metakeys pentru postare:
SELECT * FROM postmeta WHERE post_id = ID
