Obține categorii de produse copil din categoria părinte în WooCommerce

19 mar. 2020, 19:46:37
Vizualizări: 14.4K
Voturi: 1

În WooCommerce, încerc să obțin toți termenii de categorii de produse copil din ID-ul termenului părinte al categoriei curente de produs, folosind codul de mai jos:

$category = get_queried_object();
$category_parent_id = $category->parent;
$category_test = get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

Variabila $category_parent_id returnează ID-ul categoriei părinte de produs, iar $category_test returnează toți termenii de categorii de produse.

Încerc să returnez toate categoriile de produse copil folosind ID-ul termenului categoriei părinte obținut din $category->parent.

Logic am încercat:

$category_test = $category_parent_id->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

și

$category_test = $category->parent->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

Dar acestea nu mi-au returnat toate categoriile copil ale categoriei părinte curente. Are cineva vreo idee dacă și cum se poate realiza acest lucru?

0
Toate răspunsurile la întrebare 1
9

Editat (1)

Va trebui să utilizați argumentul 'child_of' din argumentele disponibile ale WP_Term_Query, care vă va permite să obțineți toți termenii copii pentru termenul părinte al categoriei curente de produse:

// Doar pe paginile de arhivă ale categoriilor de produse
if( is_product_category() ) {
    $main_term = get_queried_object();

    $args_query = array(
        'taxonomy' => 'product_cat', 
        'hide_empty' => false, 
        'child_of' => $main_term->parent
    );

    if ( $main_term->parent != 0 ) {
        // Buclă prin obiectele WP_Term
        foreach ( get_terms( $args_query ) as $term ) {
            if( $term->term_id != $main_term->term_id ) {
                // $term->slug; // Slug

                // Afișează fiecare nume de termen (cu link)…
                echo sprintf( '<a href="%s">%s</a></br>', get_term_link( $term->term_id, 'product_cat' ), $term->name );
            }
        }
    }
}

Sau puteți folosi și get_term_children() astfel:

// Doar pe paginile de arhivă ale categoriilor de produse
if( is_product_category() ) {
    $main_term  = get_queried_object();
    $taxonomy   = 'product_cat';

    if ( $main_term->parent != 0 ) {
        $child_ids = get_term_children( $main_term->parent, $taxonomy );

        echo '<ul>';

        foreach ( $child_ids as $child_id ) {
            if( $child_id != $main_term->term_id ) {
                $term = get_term_by( 'id', $child_id, $taxonomy );
                echo '<li><a href="' . get_term_link( $child_id, $taxonomy ) . '">' . $term->name . '</a></li>';
            }
        }
        echo '</ul>';
    }
}

Aceasta este valabilă doar pentru paginile de arhivă ale categoriilor de produse, deoarece pentru paginile de produse puteți avea mai multe categorii de produse setate pentru un produs, iar codul va fi complicat și destul de diferit…

19 mar. 2020 20:10:13
Comentarii

Aceasta oferă într-adevăr toate datele brute dorite. Ai vreo idee cum să afișezi doar numele și/sau slug-ul, de exemplu?

Jeroen_L Jeroen_L
19 mar. 2020 22:42:37

Tocmai am acceptat, dacă ai putea găsi timp să explici cum să afișez doar numele și/sau slug-ul în loc de date brute, mi-ar economisi ore de căutare. Dacă nu, oricum mulțumesc :)

Jeroen_L Jeroen_L
19 mar. 2020 22:49:33

@Jeroen_L Am actualizat codul meu pentru a afișa numele și/sau slug-ul...

LoicTheAztec LoicTheAztec
19 mar. 2020 23:01:18

Tocmai am observat că nu ia părintele dacă sunt pe o pagină de produs. Și de asemenea preia părinții părinților și copiii acestor părinți... Idei? Voi împărtăși noul meu cod în următorul post dacă ești interesat.

Jeroen_L Jeroen_L
20 mar. 2020 00:11:30

@Jeroen_L Am editat răspunsul meu cu alt cod... Acum pe pagina de produs acest lucru este complet diferit deoarece un produs poate avea multiple categorii de produse...

LoicTheAztec LoicTheAztec
20 mar. 2020 00:37:44

Va trebui să verific dar se face târziu, dacă sunt pe pagina de produs (is_product) va funcționa și atunci? O să verific mâine, mulțumesc până acum totuși.

Jeroen_L Jeroen_L
20 mar. 2020 00:55:41

@Jeroen_L Codul gestionează doar paginile de arhivă pentru categoriile de produse, deoarece un produs poate avea asociate mai multe categorii... Așadar, pentru a gestiona paginile de produse ar fi ceva cu totul diferit și mult mai complicat, așa că ar trebui să pui o nouă întrebare pentru gestionarea paginilor de produse...

LoicTheAztec LoicTheAztec
20 mar. 2020 07:44:35

Aproape....

Primele teste arată că acum se urcă doar cu 1 nivel, dar dacă oricare dintre frații sau surorile din acel nivel au subcategorii, atunci acele subcategorii sunt afișate de asemenea.

De fapt, acum face următoarele: urcă 1 nivel (categoria părinte), preia toate categoriile de acolo (ceea ce am nevoie), dar dacă oricare dintre acele categorii au subcategorii, acestea vor fi incluse și ele.

Deci acum merge +1 pentru a ajunge la părinte și va continua să meargă -1 atât cât este posibil, cum putem împiedica acest lucru?

Pentru paginile de Produs, este mai ușor dacă produsele sunt restricționate la o singură categorie asociată?

Jeroen_L Jeroen_L
20 mar. 2020 12:13:07

Am reușit să rezolv problema preluării subcategoriilor (verișori) prin transmiterea ID-ului categoriei părinte și combinând alte soluții. Voi actualiza propria mea întrebare cu noul cod. Tot ce rămâne acum este să aflăm cum să preluăm lista pe pagina de produs dacă știm ID-ul categoriei părinte.

Jeroen_L Jeroen_L
20 mar. 2020 16:08:15
Arată celelalte 4 comentarii