get_categories pentru custom post type cu o taxonomie personalizată atașată
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

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.

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.

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;
}

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

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!

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

@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

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

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.

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

@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!

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