web-dev-qa-db-ja.com

特定のカスタム投稿タイプの投稿を含むカテゴリのみを一覧表示する

articlesvideosphotosの3つのカスタム投稿タイプを設定しました。
これらの投稿タイプには標準のカテゴリを使用し、すべての投稿タイプでカテゴリを共有しています。

各投稿タイプのナビゲーションメニューを作成してカテゴリを一覧表示しようとしています。次のような構造になります。

  • 写真

    • 猫1
    • 猫3
    • 猫5
  • 動画

    • 猫2
    • 猫3
    • 猫5
  • 記事

    • 猫1
    • 猫2
    • 猫4

カスタム投稿タイプを含まないカテゴリは非表示にする必要があります。

hide_empty1に設定したget_categories()は明らかに近いですが、投稿タイプを指定することはできません。

4
kdev

以下を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');などを呼び出すことができます。

6
tfrommen

より柔軟になるようにこれを更新しました。空を省略して、カテゴリオブジェクトを返します。

// 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>
0
Wade Hammes

投稿によるカテゴリの機能。 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