Apenas listar categorias que contenham postagens de um tipo de postagem personalizado específico

4

Eu tenho três tipos de postagem personalizados configurados, articles , videos e photos .
Estou usando categorias padrão para esses tipos de postagens e compartilhando as categorias em todos os tipos de postagens.

Estou tentando criar um menu de navegação para cada tipo de postagem, listando as categorias, que devem seguir a seguinte estrutura:

  • Fotos

    • Cat 1
    • Cat 3
    • Cat 5
  • Vídeos

    • Cat 2
    • Cat 3
    • Cat 5
  • Artigos

    • Cat 1
    • Cat 2
    • Cat 4

As categorias que não contêm o tipo de postagem personalizado devem estar ocultas.

get_categories() com hide_empty definido como 1 está obviamente próximo, mas não permite especificar um tipo de postagem.

    
por kdev 19.04.2013 / 14:44

2 respostas

6

Coloque o seguinte no seu 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);
}

Agora você pode ligar para wp_list_categories_for_post_type('photos'); ou wp_list_categories_for_post_type('videos', 'order=DESC&title_li=Cats'); e afins.

    
por tfrommen 19.04.2013 / 15:34
0

função para categoria por postagem. copie em 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);
}
    
por technomav 04.11.2017 / 08:26