Solo lista categorías que contienen publicaciones de un tipo de publicación personalizada específica

4

Tengo tres tipos de publicaciones personalizadas configuradas, articles , videos y photos .
Estoy usando categorías estándar para estos tipos de publicaciones y comparto las categorías en todos los tipos de publicaciones.

Estoy intentando crear un menú de navegación para cada tipo de publicación, enumerando las categorías, que deben seguir la siguiente estructura:

  • Fotos

    • Gato 1
    • Gato 3
    • Gato 5
  • Videos

    • Gato 2
    • Gato 3
    • Gato 5
  • Artículos

    • Gato 1
    • Gato 2
    • Gato 4

Las categorías que no contienen el tipo de publicación personalizada deben estar ocultas.

get_categories() con hide_empty establecido en 1 está obviamente cerca, pero no te permite especificar un tipo de publicación.

    
pregunta kdev 19.04.2013 - 14:44

2 respuestas

6

Coloque lo siguiente en su 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);
}

Ahora puedes llamar a wp_list_categories_for_post_type('photos'); o wp_list_categories_for_post_type('videos', 'order=DESC&title_li=Cats'); y similares.

    
respondido por el tfrommen 19.04.2013 - 15:34
0
Función

para la categoría por correo. copia 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);
}
    
respondido por el technomav 04.11.2017 - 08:26

Lea otras preguntas en las etiquetas