web-dev-qa-db-fra.com

Répertorie uniquement les catégories contenant des publications d'un type de publication personnalisé spécifique

J'ai trois types de messages personnalisés configurés, articles, videos et photos.
J'utilise des catégories standard pour ces types de publication et les partage entre tous les types de publication.

J'essaie de créer un menu de navigation pour chaque type d'article, listant les catégories, qui devrait suivre la structure suivante:

  • Photos

    • Chat 1
    • Cat 3
    • Cat 5
  • Vidéos

    • Cat 2
    • Cat 3
    • Cat 5
  • Des articles

    • Chat 1
    • Cat 2
    • Cat 4

Les catégories qui ne contiennent pas le type de publication personnalisé doivent être masquées.

get_categories() avec hide_empty défini sur 1 est évidemment proche, mais cela ne vous permet pas de spécifier un type de publication.

4
kdev

Mettez ce qui suit dans votre functions.php:

function wp_list_categories_for_post_type($post_type, $args = '') {
    $exclude = array();

    // Check ALL categories for posts of given post type
    foreach (get_categories() as $category) {
        $posts = get_posts(array('post_type' => $post_type, 'category' => $category->cat_ID));

        // If no posts found, ...
        if (empty($posts))
            // ...add category to exclude list
            $exclude[] = $category->cat_ID;
    }

    // Set up args
    if (! empty($exclude)) {
        $args .= ('' === $args) ? '' : '&';
        $args .= 'exclude='.implode(',', $exclude);
    }

    // List categories
    wp_list_categories($args);
}

Vous pouvez maintenant appeler wp_list_categories_for_post_type('photos'); ou wp_list_categories_for_post_type('videos', 'order=DESC&title_li=Cats');, etc.

6
tfrommen

Mise à jour pour être plus flexible. Renvoie les objets de catégorie, en omettant tous les objets vides.

// Gets Categories by Post Type
// returns categories that aren't empty
function get_categories_for_post_type($post_type = 'post', $taxonomy = '') {
  $exclude = array();
  $args = array(
    "taxonomy" => $taxonomy,
  );
  $categories = get_categories($args);

  // Check ALL categories for posts of given post type
  foreach ($categories as $category) {
    $posts = get_posts(array(
      'post_type' => $post_type,
      'tax_query' => array(
        array(
          'taxonomy' => $taxonomy,
          'field' => 'term_id',
          'terms' => $category->term_id
        )
      )
    ));

    // If no posts in category, add to exclude list
    if (empty($posts)) {
      $exclude[] = $category->term_id;
    }
  }

  // If exclude list, add to args
  if (!empty($exclude)) {
    $args['exclude'] = implode(',', $exclude);
  }

  // List categories
  return get_categories($args);
}

ajoutez cela à votre functions.php

Pour utiliser (par exemple, si vous remplissez une select pour le filtrage):

<select>
<?php
$categories = get_categories_for_post_type('projects', 'project_categories');
foreach($categories as $category) { ?>
   <option value="<?php echo $category->slug; ?>">
       <?php echo $category->name; ?>
   </option>
<?php } ?>
</select>
0
Wade Hammes

fonction pour catégorie par poste. copier en function.php

function get_categories_by_post_type($post_type, $args = '') {
    $exclude = array();
    //check all categories and exclude
    foreach (get_categories($args) as $category) {
        $posts = get_posts(array('post_type' => $post_type, 'category' => $category->cat_ID));
        if (empty($posts)) { $exclude[] = $category->cat_ID; }
    }
    //re-evaluate args
    if (!empty($exclude)) {
        if(is_string($args)) {
            $args .= ('' === $args) ? '' : '&';
            $args .= 'exclude='.implode(',', $exclude);
        } else {
            $args['exclude'] = $exclude;
        }
    }
    return get_categories($args);
}
0
technomav