web-dev-qa-db-fra.com

get_categories pour un type d'article personnalisé avec une taxonomie personnalisée spécifique attachée

Fondamentalement, j'ai un type de poste personnalisé de "produits" auquel sont rattachées deux taxonomies ... la "catégorie" normale et une taxonomie personnalisée appelée "marques".

J'ai une page qui est spécifique à la marque. Sur cette page, j'aimerais énumérer toutes les "catégories" qui contiennent un "produit" avec un terme de la "marque" dont la page est la page attachée.

Par exemple. dis que je suis sur la page "Nike". Je veux qu'il liste toutes les catégories qui ont un "produit" avec la "marque" de "Nike" qui leur est attachée.

Mes idées initiales sont d’utiliser get_categories mais y at-il maintenant moyen de définir une taxonomie ou une "marque" spécifique?

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

Quelqu'un a déjà fait cela ou connaît un moyen d'interroger directement la base de données pour obtenir les résultats requis?

Toute aide est beaucoup appréciée, merci

6
daveaspinall

Bonjour @daveaspi:

Ce que vous voulez faire est commun mais pas bien géré dans le noyau WordPress. Il existe probablement des moyens de le faire sans SQL personnalisé, mais je ne pense pas qu'ils pourraient évoluer pour un grand nombre de messages. Ci-dessous, une fonction que j’ai écrite et nommée get_cross_referenced_terms() qui vous donnera ce que vous voulez, avec un exemple d’utilisation.

Ce code suivant peut être placé à la racine de votre site WordPress dans un fichier test.php pour le voir fonctionner. Vous pouvez ensuite copier la fonction get_cross_referenced_terms() dans le fichier functions.php de votre thème ou dans le fichier .php d'un plug-in sur lequel vous travaillez peut-être:

<?php 

  include('wp-load.php');

  $nike = get_term_by('slug','nike','brand'); // This here just to illustrate

  $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
MikeSchinkel

Si vous souhaitez répertorier toutes les catégories disponibles pour un type de publication personnalisé, cet extrait de code peut vous aider.

Utilisez simplement la fonction standard get_categories() et transmettez le $args relatif à la taxonomie que vous avez enregistrée pour votre CPT. Donc, si vous avez défini votre taxonomie comme ceci:

register_taxonomy( 'the_taxonomy_named_in_your_CPT' );

Ensuite, vous montriez la taxonomie aux utilisateurs finaux via:

$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>' );

Vous verrez un objet qui vous aidera sur votre chemin.

2
Steve Pheriche

Vous pouvez coder une requête SQL personnalisée ou interroger votre type de publication pour cette "marque" et collecter les catégories, puis les afficher, comme suit:

//get all your post of that type fo that spesific brand
$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()){
//loop over all post and collect the categories in to an 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;
            }
        } 
    }
}

et ici vous avez la liste de toutes les catégories ID dans un tableau $ my_cats. que vous pouvez obtenir toutes les informations dont vous avez besoin

1
Bainternet