Mostrare categorie, sottocategorie e post associati
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.

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>

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.

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

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.

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.

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

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

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.

Continuiamo questa discussione nella chat.

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