webentwicklung-frage-antwort-db.com.de

Nur Rubriken auflisten, die Posts eines bestimmten verfügbaren Beitrag-Typs beinhalten

Ich habe drei benutzerdefinierte Beitragstypen eingerichtet, articles, videos und photos.
Ich verwende Standardkategorien für diese Beitragstypen und teile die Kategorien für alle Beitragstypen.

Ich versuche, ein Navigationsmenü für jeden Beitragstyp zu erstellen, in dem die Kategorien aufgelistet sind, die der folgenden Struktur entsprechen sollten:

  • Fotos

    • Katze 1
    • Katze 3
    • Katze 5
  • Videos

    • Katze 2
    • Katze 3
    • Katze 5
  • Artikel

    • Katze 1
    • Katze 2
    • Katze 4

Kategorien, die den benutzerdefinierten Beitragstyp nicht enthalten, sollten ausgeblendet werden.

get_categories() mit hide_empty auf 1 ist offensichtlich in der Nähe, aber Sie können keinen Beitragstyp angeben.

4
kdev

Tragen Sie folgendes in Ihren functions.php ein:

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);
}

Jetzt können Sie wp_list_categories_for_post_type('photos'); oder wp_list_categories_for_post_type('videos', 'order=DESC&title_li=Cats'); und dergleichen aufrufen.

6
tfrommen

Aktualisiert, um flexibler zu sein. Gibt Kategorieobjekte zurück, wobei alle leer bleiben.

// 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);
}

füge das deinem functions.php hinzu

So verwenden Sie (zum Beispiel, wenn Sie eine select zum Filtern ausfüllen):

<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

funktion für Kategorie per Post. in function.php kopieren

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