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
Vidéos
Des articles
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.
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.
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>
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);
}