articles
、videos
、photos
の3つのカスタム投稿タイプを設定しました。
これらの投稿タイプには標準のカテゴリを使用し、すべての投稿タイプでカテゴリを共有しています。
各投稿タイプのナビゲーションメニューを作成してカテゴリを一覧表示しようとしています。次のような構造になります。
写真
動画
記事
カスタム投稿タイプを含まないカテゴリは非表示にする必要があります。
hide_empty
を1
に設定したget_categories()
は明らかに近いですが、投稿タイプを指定することはできません。
以下を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);
}
これでwp_list_categories_for_post_type('photos');
やwp_list_categories_for_post_type('videos', 'order=DESC&title_li=Cats');
などを呼び出すことができます。
より柔軟になるようにこれを更新しました。空を省略して、カテゴリオブジェクトを返します。
// 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);
}
それをあなたのfunctions.php
に追加してください
使用するには(たとえば、フィルタリング用にselect
を設定する場合)
<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>
投稿によるカテゴリの機能。 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);
}