Verifică dacă categoria curentă are subcategorii

28 ian. 2015, 16:50:43
Vizualizări: 33.4K
Voturi: 5

Am găsit următorul fragment de cod în tema WP Knowledge Base pentru a afișa subcategoriile unei categorii părinte. Problema este că acesta funcționează doar pentru primul nivel ierarhic, așa că am vrut să modific condiția if pentru a verifica dacă categoria curentă are copii, dar nu știu cum să fac asta. Aveți vreo idee? Mulțumesc

global $term_meta, $cat, $cat_id, $wp_query;

// Verifică dacă categoria curentă nu este o categorie de primul nivel
// Acest lucru se va întâmpla dacă categoria curentă nu are niciun copil
// În acest caz, pur și simplu afișăm toate postările sale
// În loc de elementele frumoase de tip knowledge base
if ( $cat->parent != '0' ) {
0
Toate răspunsurile la întrebare 5
3

Există deja o funcție încorporată pentru aceasta, nu este nevoie să creați o funcție personalizată. Funcția se numește get_term_children() și va returna fie:

  • Un array cu termenii copil dacă termenul dat are copii

  • Un array gol dacă nu sunt găsiți termeni copil

  • Un obiect WP_Error dacă taxonomia nu există

Ținând cont de acestea, înfășurați get_term_children() într-o funcție și returnați true sau false în funcție de valoarea returnată, dacă aveți nevoie doar de o valoare booleană (ca un tag condițional).

function has_term_have_children( $term_id = '', $taxonomy = 'category' )
{
    // Verificăm dacă avem o valoare pentru termen, dacă nu, returnăm false
    if ( !$term_id ) 
        return false;

    // Obținem copiii termenului
    $term_children = get_term_children( filter_var( $term_id, FILTER_VALIDATE_INT ), filter_var( $taxonomy, FILTER_SANITIZE_STRING ) );

    // Returnăm false dacă avem un array gol sau un obiect WP_Error
    if ( empty( $term_children ) || is_wp_error( $term_children ) )
    return false;

    return true;
}

Acum puteți pur și simplu să transmiteți ID-ul termenului funcției și numele corect al taxonomiei, dacă taxonomia este altceva decât category, și veți primi înapoi o valoare booleană la fel ca tag-urile condiționale încorporate, true în caz de succes dacă termenul are copii, false dacă nu are.

if ( has_term_have_children( 21 ) ) {
    // Faceți ceva dacă termenul 21 are copii
}
24 iun. 2015 10:35:28
Comentarii

De asemenea, ai putea folosi if ( has_term_have_children( get_cat_ID() ) ) pe pagina de categorie

Andrew Lazarus Andrew Lazarus
30 oct. 2015 15:03:02

@AndrewLazarus corect, utilizarea exactă depinde de configurația ta și de ceea ce ai nevoie exact. Din păcate, când răspund la întrebări, nu pot acoperi toate aspectele și uneori omit un lucru sau două. Comentarii precum cel pe care l-ai postat sunt întotdeauna apreciate și încurajate ;-). Distracție

Pieter Goosen Pieter Goosen
30 oct. 2015 17:08:37

@AndrewLazarus poți folosi și get_queried_object_id() în loc de get_cat_ID() pe o pagină de categorie ;-)

Pieter Goosen Pieter Goosen
30 oct. 2015 17:09:39
3

Puteți utiliza acest simplu apel de funcție care returnează TRUE sau FALSE în funcție de faptul dacă $children este un array gol sau nu.

/**
 * Verifică dacă un termen dat are termeni copil
 *
 * @param Integer $term_id
 * @param String $taxonomy
 *
 * @return Boolean
 */
function category_has_children( $term_id = 0, $taxonomy = 'category' ) {
    $children = get_categories( array( 
        'child_of'      => $term_id,
        'taxonomy'      => $taxonomy,
        'hide_empty'    => false,
        'fields'        => 'ids',
    ) );
    return ( $children );
}

Deci, dacă utilizați doar categoriile implicite post, puteți apela funcția astfel: category_has_children( 17 );

Dacă trebuie să testați o taxonomie personalizată, va funcționa aproape la fel, dar va trebui să transmiteți un parametru suplimentar 'taxonomy-slug': category_has_children( 7, 'my_taxonomy' );'

Pentru a o apela în instrucțiunea IF:

if( $cat->parent != 0 && ! category_has_children( $cat->term_id ) )
28 ian. 2015 17:09:26
Comentarii

get_term_children() face deja ceea ce dorește OP. Este doar o chestiune de a crea o condiție booleană :-)

Pieter Goosen Pieter Goosen
24 iun. 2015 10:39:59

Doar o notă, parametrul type nu este destinat pentru post_type, ci mai degrabă pentru a indica dacă categoria provine din taxonomia încorporată category sau din taxonomia încorporată link_category. Acest parametru a fost folosit înainte de introducerea taxonomiilor personalizate în versiunea 3.0. Parametrul type a fost înlocuit de noul parametru taxonomy care a fost introdus în versiunea 3.0. Codul sursă actual

Pieter Goosen Pieter Goosen
24 iun. 2015 11:21:16

Notă: Pe Woocommerce, $taxonomy trebuie schimbat în 'product_cat' în loc de 'category'

luissimo luissimo
20 aug. 2020 22:25:23
2

Pentru a obține numele categoriilor copil. Am folosit funcția lui @Howdy_McGee pentru un proces mai rapid și iterativ.

function category_has_children( $term_id = 0, $post_type = 'post', $taxonomy = 'category' ) {

    $children = get_categories( array( 'child_of' => $term_id, 'type' => $post_type, 'taxonomy' => $taxonomy, 'order' => 'ASC', 'orderby' => 'name' ) );
    if($children){
    echo '<ul>';
    foreach ($children as $value) {
        echo '<li>';
            echo '<a href="'.get_bloginfo("siteurl").'/category/'.$value->slug.'" >'.$value->name.'</a>';
        echo '</li>';
        }
    echo '</ul>';
    }
}

$cId = get_cat_id('cms'); /* cms este categoria părinte */
category_has_children($cId, 'post', 'category');

Aceasta va lista toate subcategoriile (copil) ale unei categorii părinte.

28 ian. 2015 18:35:46
Comentarii

WordPress are deja o funcție încorporată care face asta: wp_list_categories()

Howdy_McGee Howdy_McGee
29 ian. 2015 17:00:45

Da, dar personalizarea/structurarea este un pic mai strictă cu aceasta. :)

Shreyo Gi Shreyo Gi
30 ian. 2015 04:45:04
0

Aceasta este funcția pe care o folosesc. Variabila $cat reprezintă ID-ul categoriei pe care o verifici:

$categories = get_categories($cat);

if (!empty($categories)) {
    // Această categorie are subcategorii
    }
else {
    // Această categorie nu are subcategorii
    }
24 iun. 2015 09:40:45
1

Folosește această funcție cat_has_subcat('introdu id-ul categoriei') pentru a verifica dacă o categorie are subcategorii sau nu

//adaugă acest cod în fișierul functions.php

//start


function cat_has_subcat($catId){
    $args = array(
        'taxonomy' => 'product_cat',
        'orderby' => 'name',
        'parent' => $catId,
        'show_count' => 0,
        'pad_counts' => 0,
        'hierarchical' => 1,
        'title_li' => '',
        'hide_empty' => false
    );

    $cats = get_categories($args);
    if(!empty($cats)){
        return $catId;
    }
}

//end
9 nov. 2017 08:53:34
Comentarii

O explicație despre de ce această soluție ar rezolva întrebarea OP ar fi binevenită.

cjbj cjbj
9 nov. 2017 09:54:53