Afisarea categoriilor, subcategoriilor și postărilor în WordPress
Practic, așa cum spune și titlul, vreau să obțin o listă de categorii și subcategorii, apoi postările (cu link-uri către ele) pentru acele categorii/subcategorii.
Aceasta este structura pe care încerc să o obțin:
- Categoria 1
- Subcategoria 1 din categoria 1
- Postarea 1 din subcategoria 1
- Postarea 2 din subcategoria 1
- Postarea 3 din subcategoria 1
- Subcategoria 2 din categoria 1
- Postarea 1 din subcategoria 2
- Postarea 2 din subcategoria 2
- Postarea 3 din subcategoria 2
- Subcategoria 3 din categoria 1
- Postarea 1 din subcategoria 3
- Postarea 2 din subcategoria 3
- Postarea 3 din subcategoria 3
- Postări fără subcategorie
- Postarea 1 fără subcategorie
- Postarea 2 fără subcategorie
- Categoria 2
- Subcategoria 1 din categoria 2
- Postarea 1 din subcategoria 1
- Postarea 2 din subcategoria 1
- Postarea 3 din subcategoria 1
- Subcategoria 2 din categoria 2
- Postarea 1 din subcategoria 2
- Postarea 2 din subcategoria 2
- Postarea 3 din subcategoria 2
- Subcategoria 3 din categoria 2
- Postarea 1 din subcategoria 2
- Postarea 2 din subcategoria 2
- Postarea 3 din subcategoria 2
- Postări fără subcategorie
- Postarea 1 fără subcategorie
- Postarea 2 fără subcategorie
Până acum, după ce am citit tot ce am găsit pe acest subiect, am următorul cod:
<ul>
<?php
$get_parent_cats = array(
'parent' => '0' // obține doar categoriile de nivel superior
);
$all_categories = get_categories( $get_parent_cats ); // obține categoriile părinte
foreach( $all_categories as $single_category ){
// pentru fiecare categorie, obține ID-ul
$catID = $single_category->cat_ID;
echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; // numele și link-ul categoriei
$get_children_cats = array(
'child_of' => $catID // obține subcategoriile acestui părinte folosind variabila catID
);
$child_cats = get_categories( $get_children_cats ); // obține subcategoriile categoriei părinte
echo '<ul class="children">';
foreach( $child_cats as $child_cat ){
// pentru fiecare subcategorie, obține ID-ul
$childID = $child_cat->cat_ID;
// pentru fiecare subcategorie, afișează link-ul și numele
echo '<a href=" ' . get_category_link( $childID ) . ' ">' . $child_cat->name . '</a>';
}
echo '</ul></li>';
} // sfârșitul logicii pentru categorii ?>
</ul>
Acest cod afișează bine categoriile și subcategoriile, dar trebuie să parcurg și postările și să le afișez în cadrul categoriilor/subcategoriilor. Am încercat și următorul cod:
<?php
// obține toate categoriile din baza de date
$cats = get_categories();
// parcurge categoriile
foreach ($cats as $cat) {
// setează ID-ul categoriei
$cat_id= $cat->term_id;
// Creează un header pentru categorie
echo "<h2>".$cat->name."</h2>";
// creează o interogare WordPress personalizată
query_posts("cat=$cat_id&posts_per_page=100");
// începe bucla WordPress!
if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php // creează link-ul acum că postarea este setată ?>
<a href="<?php the_permalink();?>"><?php the_title(); ?></a>
<?php echo '<hr/>'; ?>
<?php endwhile; endif; // încheie bucla WordPress. Va începe din nou pentru fiecare categorie ?>
<?php } // încheie instrucțiunea foreach ?>
</div><!-- #content -->
</div><!-- #container -->
Acest cod afișează toate categoriile și postările din cadrul fiecărei categorii, dar structura nu este cea dorită. Am încercat să combin aceste două fragmente de cod timp de două zile, dar nimic din ce încerc nu îmi dă rezultatul dorit. Sunt inexperimentat cu WordPress și aș avea nevoie de ajutor pentru această problemă.
Actualizare: Cod complet
<ul>
<?php
$get_parent_cats = array(
'parent' => '0' //obține doar categoriile de nivel superior
);
$all_categories = get_categories( $get_parent_cats );//obține categoriile părinte
foreach( $all_categories as $single_category ){
//pentru fiecare categorie, obține ID-ul
$catID = $single_category->cat_ID;
echo '<li><a href=" ' . get_category_link( $catID ) . ' ">' . $single_category->name . '</a>'; //numele categoriei & link
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 //obține copiii acestui părinte folosind variabila catID definită anterior
);
$child_cats = get_categories( $get_children_cats );//obține copiii categoriei părinte
echo '<ul class="children">';
foreach( $child_cats as $child_cat ){
//pentru fiecare categorie copil, obține ID-ul
$childID = $child_cat->cat_ID;
//pentru fiecare categorie copil, afișează link-ul și numele
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>';
} //sfârșitul logicii categoriilor ?>
</ul>

Bună Bikash, mulțumesc pentru ajutor, dar am nevoie ca postările să fie afișate chiar dacă nu există subcategorii și, de asemenea, am nevoie ca postările să aibă legături permanente.

Vrei să spui că nu dorești să afișezi postările din categoriile intermediare, ci doar postările din ultima categorie!!

Nu, nu, vreau să le afișez, dar în cazul în care nu există subcategorii, totuși vreau să afișez postările. Cu codul pe care l-ai dat, dacă am o postare în categoria părinte, aceasta nu este afișată. Uită-te la structura mea și vei înțelege ce vreau să spun.

Am creat o imagine pentru a vă arăta la ce mă refer. link după cum vedeți în "kategorija3" postările nu sunt afișate pentru că nu am subcategorie, dar tot am postări în acea categorie. De asemenea, am postări în "kategorija1" care nu au subcategorie și nici ele nu sunt afișate.

dacă doriți să afișați postările din categoria părinte și din categoria copil într-o formă ierarhică, atunci ar trebui să folosiți aceeași buclă în interiorul buclei părinte foreach
și, de asemenea, să utilizați 'cat'=>$catID
în cazul buclei părinte foreach
dacă doriți categoria nepot și mai multe, va trebui să adăugați mai multe bucle imbricate foreach
și wp_query

folosiți aceeași buclă înainte de $get_children_cats = array(
'child_of' => $catID //obține copiii acestui părinte folosind variabila catID de mai devreme
);
în codul dvs. și folosiți 'cat' => $catID
de data aceasta

Poți să editezi răspunsul și să îmi dai codul complet? Încerc să implementez ceea ce spui, dar fac vreo greșeală și nu reușesc să funcționeze.

Să continuăm această discuție în chat.

Această funcție funcționează imediat, doar asigurați-vă să modificați numele cu propria dvs. taxonomie și tipul de postare. Puteți citi comentariile pentru mai multe clarificări.
function ow_categories_with_subcategories_and_posts( $taxonomy, $post_type ) {
$taxonomy = $taxonomy;
$post_type = $post_type;
// Obține categoriile principale care aparțin taxonomiei furnizate (cele fără părinte)
$categories = get_terms(
array(
'taxonomy' => $taxonomy,
'parent' => 0, // <-- Fără părinte
'orderby' => 'term_id',
'hide_empty' => true // <-- schimbați în false pentru a afișa și cele goale
)
);
?>
<div>
<?php
// Iterează prin toate categoriile pentru a afișa fiecare categorie individual
foreach ( $categories as $category ) {
$cat_name = $category->name;
$cat_id = $category->term_id;
$cat_slug = $category->slug;
// Afișează numele fiecărei categorii individuale
echo '<h3>Categorie: ' . $cat_name . ' - ID: ' . $cat_id . ' - Slug: ' . $cat_slug . '</h3>';
// Obține toate subcategoriile care aparțin categoriei curente
$subcategories = get_terms(
array(
'taxonomy' => $taxonomy,
'parent' => $cat_id, // <-- Părintele este categoria curentă
'orderby' => 'term_id',
'hide_empty' => true
)
);
?>
<div>
<?php
// Iterează prin toate subcategoriile pentru a afișa fiecare subcategorie individuală
foreach ( $subcategories as $subcategory ) {
$subcat_name = $subcategory->name;
$subcat_id = $subcategory->term_id;
$subcat_slug = $subcategory->slug;
// Afișează numele fiecărei subcategorii individuale cu ID și Slug
echo '<h4>Subcategorie: ' . $subcat_name . ' - ID: ' . $subcat_id . ' - Slug: ' . $subcat_slug . '</h4>';
// Obține toate postările care aparțin acestei subcategorii specifice
$posts = new WP_Query(
array(
'post_type' => $post_type,
'posts_per_page' => -1, // <-- Afișează toate postările
'hide_empty' => true,
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'terms' => $subcat_id,
'field' => 'id'
)
)
)
);
// Dacă există postări disponibile în cadrul acestei subcategorii
if ( $posts->have_posts() ):
?>
<div>
<?php
// Atâta timp cât există postări de afișat
while ( $posts->have_posts() ): $posts->the_post();
// Afișează titlul fiecărei postări cu ID-ul Postării
?>
<p>Postare: <?php the_title(); ?> - ID: <?php the_ID(); ?></p>
<?php
endwhile;
?>
</div>
<?php
else:
echo 'Nu s-au găsit postări';
endif;
wp_reset_query();
}
?>
</div>
<?php
}
?>
</div>
<?php
}
ow_categories_with_subcategories_and_posts( 'numele_taxonomiei_dvs', 'numele_tipului_de_postare_dvs' );
