get_categories pentru custom post type cu o taxonomie personalizată atașată

3 mar. 2011, 11:32:14
Vizualizări: 21.6K
Voturi: 8

Practic, am un custom post type 'products' care are două taxonomii atașate... 'category' normală și o taxonomie personalizată numită 'brands'.

Am o pagină specifică pentru 'brand'. Pe această pagină aș dori să listez toate 'categoriile' care au un 'produs' în ele cu un termen din 'brand'-ul a cărui pagină o vizualizez.

De exemplu, să zicem că sunt pe pagina "Nike". Vreau să listeze toate categoriile care au un 'produs' în ele cu 'brand'-ul "Nike" atașat.

Gândirea mea inițială este să folosesc get_categories dar nu există nicio modalitate de a defini o taxonomie specifică sau un 'brand'?

$categories = get_categories('orderby=name&depth=1&hide_empty=0&child_of='.$cat);

A mai făcut cineva acest lucru înainte sau știe o modalitate de a interoga baza de date direct pentru a obține rezultatele necesare?

Orice ajutor este apreciat, Mulțumesc

0
Toate răspunsurile la întrebare 3
2

Dacă dorești să listezi toate categoriile disponibile pentru un tip de postare personalizat (CPT), acest fragment de cod te poate ajuta.

Folosește funcția standard get_categories() și transmite argumentele $args referitoare la taxonomia pe care ai înregistrat-o pentru CPT-ul tău. Deci, dacă ai definit taxonomia astfel:

register_taxonomy( 'the_taxonomy_named_in_your_CPT' );

Atunci poți afișa taxonomia pentru utilizatorii front-end astfel:

$args = array( 
    'taxonomy'     => 'the_taxonomy_named_in_your_CPT',
    'orderby'      => 'name',
    'show_count'   => 1,
    'pad_counts'   => 1, 
    'hierarchical' => 1,
    'echo'         => 0
);

$allthecats = get_categories( $args );
echo ( '<pre>' );
print_r( $allthecats );
echo ( '</pre>' );

Vei vedea un obiect care te va ajuta în continuare.

28 ian. 2016 16:06:44
Comentarii

După ore de muncă și o durere de cap, această soluție a funcționat exact cum aveam nevoie. Mulțumesc!! Nu există o documentație bună pentru afișarea categoriilor de tip post.

Rodrigo Zuluaga Rodrigo Zuluaga
8 iul. 2020 01:08:00

Pentru toți cei care se întreabă de ce categoriile tot nu apar: get_categories() vă returnează doar categoriile care au cel puțin un post atribuit, altfel va returna un array gol.

mfru mfru
3 mai 2022 13:08:16
8

Salut @daveaspi:

Ceea ce vrei să faci este comun dar nu este bine gestionat în nucleul WordPress. Probabil există modalități de a face asta fără SQL personalizat, dar nu cred că ar fi scalabile pentru un număr mare de articole. Mai jos este o funcție pe care am scris-o numită get_cross_referenced_terms() care va obține ceea ce dorești, completată cu un exemplu despre cum să o folosești.

Următorul cod poate fi plasat în rădăcina site-ului tău WordPress într-un fișier test.php pentru a vedea cum funcționează. Apoi poți copia funcția get_cross_referenced_terms() în fișierul functions.php al temei tale sau într-un fișier .php al unui plugin la care lucrezi:

<?php 

  include('wp-load.php');

  $nike = get_term_by('slug','nike','brand'); // Acesta este doar pentru ilustrare

  $terms = get_cross_referenced_terms(array(
    'post_type'        => 'product',
    'related_taxonomy' => 'brand',
    'term_id'          => $nike->term_id,
  ));
  foreach($terms as $term) {
    echo "<p>{$term->name}</p>";
  }

function get_cross_referenced_terms($args) {
  global $wpdb;
  $args = wp_parse_args($args,array(
    'post_type'        => 'post',
    'taxonomy'         => 'category',
    'related_taxonomy' => 'post_tag',
    'term_id'          => 0,
  ));
  extract($args);
  $sql = <<<SQL
SELECT DISTINCT
  {$wpdb->terms}.*,
  COUNT(*) AS post_count
FROM
  {$wpdb->terms}
  INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id={$wpdb->term_taxonomy}.term_id
  INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  INNER JOIN {$wpdb->posts} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
  INNER JOIN {$wpdb->term_relationships} related_relationship ON {$wpdb->posts}.ID=related_relationship.object_id
  INNER JOIN {$wpdb->term_taxonomy} related_term_taxonomy ON related_relationship.term_taxonomy_id=related_term_taxonomy.term_taxonomy_id
  INNER JOIN {$wpdb->terms} related_terms ON related_term_taxonomy.term_id=related_terms.term_id
WHERE 1=1
  AND (related_term_taxonomy.taxonomy<>{$wpdb->term_taxonomy}.taxonomy OR related_terms.term_id<>{$wpdb->terms}.term_id)
  AND {$wpdb->posts}.post_type='%s'
  AND {$wpdb->term_taxonomy}.taxonomy='%s'
  AND related_term_taxonomy.taxonomy='%s'
  AND related_terms.term_id=%d
GROUP BY
  {$wpdb->terms}.term_id
SQL;
  $sql = $wpdb->prepare($sql,$post_type,$taxonomy,$related_taxonomy,$term_id);
  $terms = $wpdb->get_results($sql);
  return $terms;
}
3 mar. 2011 12:51:28
Comentarii

da, asta este interogarea SQL despre care vorbeam :)

Bainternet Bainternet
3 mar. 2011 12:59:19

Salut @MikeSchinkel, exact ce aveam nevoie! Funcționează perfect. Mulțumesc mult de tot!

daveaspinall daveaspinall
3 mar. 2011 13:22:59

@Bainternet mulțumesc foarte mult și pentru contribuția ta :-)

daveaspinall daveaspinall
3 mar. 2011 13:23:31

O mică întrebare, există vreo metodă de a limita 'adâncimea' la 1? Ca să obțin doar categoriile de nivel superior? :-) Mulțumesc, băieți!

daveaspinall daveaspinall
3 mar. 2011 13:29:36

@daveaspi: Adaugă AND {$wpdb->term_taxonomy}.parent=0 la clauza where.

MikeSchinkel MikeSchinkel
3 mar. 2011 13:38:20

@MikeSchinkel, @Bainternet salut băieți, există vreo metodă de a adăuga o variabilă în $args pentru a defini atât categoria cât și brandul? de ex. 'post_type' => 'post', 'taxonomy' => 'category', 'related_taxonomy' => 'post_tag', 'term_id' => 0, 'category_id' => $cat

daveaspinall daveaspinall
7 mar. 2011 16:25:01

@davesapi - Sună ca și cum ar trebui să fie o întrebare nouă.

MikeSchinkel MikeSchinkel
8 mar. 2011 01:52:13

@MikeSchinkel cum ar trebui să modificăm interogarea SQL personalizată astfel încât să afișeze link-uri către categorii în loc de doar numele acestora? Mulțumesc!

Ioannis Baltzakis Ioannis Baltzakis
28 sept. 2011 01:56:23
Arată celelalte 3 comentarii
4

Puteți să scrieți o interogare SQL personalizată sau să interogați tipul de postare pentru acel "brand" și să colectați categoriile, apoi să le afișați, ceva de genul:

//obține toate postările de acel tip pentru brandul specific
$my_query = new WP_Query();
$my_query->query(array(
    'post_type' => 'products',
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'brand',
            'field' => 'slug',
            'terms' => $wp_query->query_vars['brand']
        )
    )
    ));
$my_cats = array(); 
if ($my_query->have_posts()){
//parcurge toate postările și colectează categoriile într-un array
    while ($my_query->have_posts()){
        $my_query->the_post();
        foreach((get_the_category($post->ID)) as $category) {
            if (!in_array($category->cat_ID ,$my_cats)){
                $my_cats[] = $category->cat_ID;
            }
        } 
    }
}

și aici aveți lista tuturor ID-urilor de categorii într-un array $my_cats. din care puteți obține toate informațiile de care aveți nevoie.

3 mar. 2011 12:58:21
Comentarii

Da, mult mai curat și excelent pentru un site mic, dar pentru un număr mare de articole ar putea fi foarte lent.

MikeSchinkel MikeSchinkel
3 mar. 2011 13:09:04

@MikeSchinkel - da, asta ar dura ceva timp pe un site unde fiecare marcă are o mulțime de produse, dar cred că "mea putere SQL fu" nu e la fel de puternică ca a ta, maestre!

Bainternet Bainternet
3 mar. 2011 13:11:41

Ha! Nu de parcă am învățat peste noapte! Au fost peste 20 de ani de lucrat cu SQL ca să ajung aici. :)

MikeSchinkel MikeSchinkel
3 mar. 2011 13:13:27

Spui 20+, deci mai am doar 15 până acolo.

Bainternet Bainternet
3 mar. 2011 13:19:31