Mostrare categorie, sottocategorie e post associati

15 giu 2017, 03:57:05
Visualizzazioni: 18.9K
Voti: 0

Come dice il titolo, voglio ottenere un elenco di categorie e sottocategorie e poi i post (con i relativi link) per quelle categorie/sottocategorie.

Questa è la struttura che sto cercando di ottenere:

  • Categoria 1
    • Sottocategoria 1 nella categoria 1
      • Post 1 nella sottocategoria 1
      • Post 2 nella sottocategoria 1
      • Post 3 nella sottocategoria 1
    • Sottocategoria 2 nella categoria 1
      • Post 1 nella sottocategoria 2
      • Post 2 nella sottocategoria 2
      • Post 3 nella sottocategoria 2
    • Sottocategoria 3 nella categoria 1
      • Post 1 nella sottocategoria 3
      • Post 2 nella sottocategoria 3
      • Post 3 nella sottocategoria 3
    • Post senza sottocategoria
      • Post 1 senza sottocategoria
      • Post 1 senza sottocategoria
  • Categoria 2
    • Sottocategoria 1 nella categoria 2
      • Post 1 nella sottocategoria 1
      • Post 2 nella sottocategoria 1
      • Post 3 nella sottocategoria 1
    • Sottocategoria 2 nella categoria 2
      • Post 1 nella sottocategoria 2
      • Post 2 nella sottocategoria 2
      • Post 3 nella sottocategoria 2
    • Sottocategoria 3 nella categoria 2
      • Post 1 nella sottocategoria 2
      • Post 2 nella sottocategoria 2
      • Post 3 nella sottocategoria 2
    • Post senza sottocategoria
      • Post 1 senza sottocategoria
      • Post 1 senza sottocategoria

Finora, dopo aver letto tutto quello che ho trovato sull'argomento, ho il seguente codice:

<ul>   
    <?php 
        $get_parent_cats = array(
            'parent' => '0' //ottieni solo le categorie di livello superiore
        ); 

        $all_categories = get_categories( $get_parent_cats ); //ottieni le categorie principali

        foreach( $all_categories as $single_category ){
            //per ogni categoria, ottieni l'ID
            $catID = $single_category->cat_ID;

            echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; //nome e link della categoria
            $get_children_cats = array(
                'child_of' => $catID //ottieni le sottocategorie di questa categoria principale usando la variabile catID
            );

            $child_cats = get_categories( $get_children_cats ); //ottieni le sottocategorie della categoria principale
            echo '<ul class="children">';
                foreach( $child_cats as $child_cat ){
                    //per ogni sottocategoria, ottieni l'ID
                    $childID = $child_cat->cat_ID;

                    //per ogni sottocategoria, mostra il link e il nome
                    echo '<a href=" ' . get_category_link( $childID ) . ' ">' . $child_cat->name . '</a>';

                }
            echo '</ul></li>';
        } //fine della logica delle categorie ?>
</ul>

Questo codice mostra bene le categorie e le sottocategorie, ma ho bisogno di ciclare attraverso i miei post e mostrarli all'interno delle categorie/sottocategorie. Ho anche provato a usare il seguente codice:

    <?php
        // ottieni tutte le categorie dal database
        $cats = get_categories(); 

            // cicla attraverso le categorie
            foreach ($cats as $cat) {
                // imposta l'ID della categoria
                $cat_id= $cat->term_id;
                // Crea un'intestazione per la categoria
                echo "<h2>".$cat->name."</h2>";
                // crea una query personalizzata di WordPress
                query_posts("cat=$cat_id&posts_per_page=100");
                // inizia il loop di WordPress!
                if (have_posts()) : while (have_posts()) : the_post(); ?>

                    <?php // crea il nostro link ora che il post è impostato ?>
                    <a href="<?php the_permalink();?>"><?php the_title(); ?></a>
                    <?php echo '<hr/>'; ?>

                <?php endwhile; endif; // fine del nostro loop di WordPress. Ricomincerà per ogni categoria ?>
            <?php } // fine dell'istruzione foreach ?>

        </div><!-- #content -->
    </div><!-- #container -->

Questo codice mostra tutte le categorie e i post all'interno di una categoria specifica, ma la struttura non è quella che desidero. Ho provato a combinare questi due frammenti di codice per due giorni, ma nulla di quello che provo mi dà il risultato che voglio. Sono inesperto con WordPress e potrei davvero usare un aiuto per questo.

0
Tutte le risposte alla domanda 2
8

Aggiornamento: Codice completo

<ul>   
        <?php 
            $get_parent_cats = array(
                'parent' => '0' //ottiene solo le categorie di livello superiore
            ); 

            $all_categories = get_categories( $get_parent_cats ); //ottiene le categorie genitore 

            foreach( $all_categories as $single_category ){
                //per ogni categoria, ottiene l'ID
                $catID = $single_category->cat_ID;

                echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; //nome e link della categoria
                 echo '<ul class="post-title">';

                $query = new WP_Query( array( 'cat'=> $catID, 'posts_per_page'=>10 ) );
                while( $query->have_posts() ):$query->the_post();
                 echo '<li><a href="'.get_the_permalink().'">'.get_the_title().'</a></li>';
                endwhile;
                wp_reset_postdata();

                echo '</ul>';
                $get_children_cats = array(
                    'child_of' => $catID //ottiene le categorie figlie di questo genitore usando la variabile catID di prima
                );

                $child_cats = get_categories( $get_children_cats ); //ottiene le categorie figlie della categoria genitore
                echo '<ul class="children">';
                    foreach( $child_cats as $child_cat ){
                        //per ogni categoria figlia, ottiene l'ID
                        $childID = $child_cat->cat_ID;

                        //per ogni categoria figlia, mostra il link e il nome
                        echo '<a href=" ' . get_category_link( $childID ) . ' ">' . $child_cat->name . '</a>';

                         echo '<ul class="post-title">';

                        $query = new WP_Query( array( 'cat'=> $childID, 'posts_per_page'=>10 ) );
                        while( $query->have_posts() ):$query->the_post();
                         echo '<li><a href="'.get_the_permalink().'">'.get_the_title().'</a></li>';
                        endwhile;
                        wp_reset_postdata();

                        echo '</ul>';

                    }
                echo '</ul></li>';
            } //fine della logica delle categorie ?>
    </ul>
15 giu 2017 10:21:10
Commenti

Ciao Bikash, grazie per il tuo aiuto, ma ho bisogno che i post vengano mostrati anche se non ci sono sottocategorie e inoltre ho bisogno che i post abbiano permalink.

Karadjordje Karadjordje
15 giu 2017 10:33:03

Intendevi dire che non vuoi mostrare i post delle categorie intermedie e solo i post dell'ultima categoria!!

Bikash Waiba Bikash Waiba
15 giu 2017 10:35:52

No no, voglio mostrarli ma nel caso non ci siano sottocategorie voglio comunque mostrare i post. Con il codice che mi hai dato, se ho un post nella categoria genitore non viene mostrato. Guarda la mia struttura e capirai cosa intendo.

Karadjordje Karadjordje
15 giu 2017 10:43:05

Ho creato un'immagine per mostrarti cosa intendo. link come vedi in "kategorija3" i post non vengono visualizzati perché non ho sottocategorie ma ho comunque post in quella categoria. Ho anche post in "kategorija1" che non hanno sottocategorie e non vengono visualizzati.

Karadjordje Karadjordje
15 giu 2017 10:49:53

se vuoi mostrare i post della categoria genitore e della categoria figlia in forma gerarchica, dovresti usare lo stesso loop all'interno del loop foreach genitore e usare 'cat'=>$catID nel caso del loop foreach genitore. Se vuoi includere categorie nipoti e oltre, devi aggiungere più loop foreach annidati e wp_query

Bikash Waiba Bikash Waiba
15 giu 2017 10:52:45

usa lo stesso loop prima di $get_children_cats = array( 'child_of' => $catID //ottieni i figli di questo genitore usando la variabile catID definita precedentemente ); nel tuo codice e questa volta usa 'cat' => $catID

Bikash Waiba Bikash Waiba
15 giu 2017 10:57:16

Puoi modificare la tua risposta e fornirmi il codice completo? Sto cercando di implementare ciò che dici, ma sto facendo qualche errore e non riesco a farlo funzionare.

Karadjordje Karadjordje
15 giu 2017 10:59:58

Continuiamo questa discussione nella chat.

Bikash Waiba Bikash Waiba
15 giu 2017 11:06:22
Mostra i restanti 3 commenti
0

Questa funzione funziona immediatamente, assicurati solo di cambiare i nomi con la tua tassonomia e il tuo tipo di post. Sentiti libero di leggere i commenti per maggiori chiarimenti.

function ow_categories_with_subcategories_and_posts( $taxonomy, $post_type ) {
    $taxonomy   = $taxonomy;
    $post_type  = $post_type;

    // Ottieni le categorie principali che appartengono alla tassonomia fornita (quelle senza genitore)
    $categories = get_terms( 
        array(
            'taxonomy'   => $taxonomy,
            'parent'     => 0, // <-- Nessun Genitore
            'orderby'    => 'term_id',
            'hide_empty' => true // <-- cambia in false per mostrare anche quelle vuote
        )
    );
    ?>
    <div>
        <?php
        // Itera attraverso tutte le categorie per visualizzare ogni singola categoria
        foreach ( $categories as $category ) {

            $cat_name = $category->name;
            $cat_id   = $category->term_id;
            $cat_slug = $category->slug;

            // Visualizza il nome di ogni singola categoria
            echo '<h3>Categoria: ' . $cat_name . ' - ID: ' . $cat_id . ' - Slug: ' . $cat_slug  . '</h3>'; 


            // Ottieni tutte le sottocategorie che appartengono alla categoria corrente
            $subcategories = get_terms(
                array(
                    'taxonomy'   => $taxonomy,
                    'parent'     => $cat_id, // <-- Il genitore è la categoria corrente
                    'orderby'    => 'term_id',
                    'hide_empty' => true
                )
            );
            ?>
            <div>
                <?php
                // Itera attraverso tutte le sottocategorie per visualizzare ogni singola sottocategoria
                foreach ( $subcategories as $subcategory ) {

                    $subcat_name = $subcategory->name;
                    $subcat_id   = $subcategory->term_id;
                    $subcat_slug = $subcategory->slug;

                    // Visualizza il nome di ogni singola sottocategoria con ID e Slug
                    echo '<h4>Sottocategoria: ' . $subcat_name . ' - ID: ' . $subcat_id . ' - Slug: ' . $subcat_slug  . '</h4>';

                    // Ottieni tutti i post che appartengono a questa specifica sottocategoria
                    $posts = new WP_Query(
                        array(
                            'post_type'      => $post_type,
                            'posts_per_page' => -1, // <-- Mostra tutti i post
                            'hide_empty'     => true,
                            'order'          => 'ASC',
                            'tax_query'      => array(
                                array(
                                    'taxonomy' => $taxonomy,
                                    'terms'    => $subcat_id,
                                    'field'    => 'id'
                                )
                            )
                        )
                    );

                    // Se ci sono post disponibili all'interno di questa sottocategoria
                    if ( $posts->have_posts() ):
                        ?>
                        <div>
                            <?php

                            // Finché ci sono post da mostrare
                            while ( $posts->have_posts() ): $posts->the_post();

                                // Mostra il titolo di ogni post con l'ID del Post
                                ?>
                                <p>Post: <?php the_title(); ?> - ID: <?php the_ID(); ?></p>
                                <?php

                            endwhile;
                            ?>
                        </div>
                        <?php
                    else:
                        echo 'Nessun post trovato';
                    endif;

                    wp_reset_query();
                }
                ?>
            </div>
            <?php
        }
        ?>
    </div>
    <?php
}
ow_categories_with_subcategories_and_posts( 'il_nome_della_tua_tassonomia', 'il_nome_del_tuo_post_type' );
3 gen 2019 04:18:07