Cum să obții numele categoriei principale în noua versiune WordPress

5 iun. 2016, 11:02:52
Vizualizări: 41.2K
Voturi: 4

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
}
6
Comentarii

Categoria principală? Poți să mă ajuți să găsesc un articol despre acest nou concept de categorie principală?

Sumit Sumit
5 iun. 2016 11:23:33

Instalează cea mai recentă versiune de WordPress, apoi adaugă un articol nou și selectează mai multe categorii - una dintre categorii poate fi selectată drept categorie principală

MMTDesigner MMTDesigner
5 iun. 2016 12:00:37

Sau poate greșesc și un plugin îmi oferă această opțiune?!

MMTDesigner MMTDesigner
5 iun. 2016 12:01:38

Nu văd asta. Te referi la acest link https://yoast.com/yoast-seo-3-1/ ?

Sumit Sumit
5 iun. 2016 12:15:51

@MMTdesigner Este Yoast SEO care oferă funcționalitatea de 'categorie primară'. Ei o folosesc pentru breadcrumb. Nu face parte din nucleul WordPress. :)

Mayeenul Islam Mayeenul Islam
5 iun. 2016 12:18:58

poți răspunde la a doua întrebare?

MMTDesigner MMTDesigner
5 iun. 2016 12:52:34
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 7
0

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();
    }
}
1 oct. 2018 02:38:59
0

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.

21 mai 2018 17:12:38
1

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];
5 iun. 2016 18:13:37
Comentarii

Rezervoare, aceasta este o modalitate frumoasă de a o face, am găsit alte metode, dar presupun că metoda ta este mai eficientă. Mulțumesc mult.

MMTDesigner MMTDesigner
6 iun. 2016 07:42:22
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

13 aug. 2018 16:36:53
0

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;
18 sept. 2019 19:24:04
0

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 '';
    }
}
12 feb. 2022 10:19:39
4
-1

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);
}
31 mar. 2017 16:24:14
Comentarii

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?

Howdy_McGee Howdy_McGee
31 mar. 2017 17:26:07

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

Serge Andreev Serge Andreev
4 apr. 2017 11:26:31

> 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

Serge Andreev Serge Andreev
4 apr. 2017 11:27:19

> Unde introduc acest cod? De exemplu, poți insera acest cod în wp-content/themes/<your-theme>/single.php sau într-un alt fișier PHP, unde afișezi numele categoriei Primare pentru articol

Serge Andreev Serge Andreev
4 apr. 2017 11:27:24