Cum să creezi un meniu cu toate subcategoriile?
Aceasta depinde de ce fel de meniu vorbim:
1)
Dacă vorbim despre "meniuri personalizate" (găsite în Backend sub Design -> Meniuri) puteți face următoarele:
Creați o nouă funcție cu action hook-ul
add_category
în interiorul acestei funcții, puteți crea un nou post de tipul elementului de meniu, care este adăugat corect în meniul dumneavoastră
de fiecare dată când o nouă categorie este publicată, elementul de meniu va fi adăugat acum
ar trebui să folosiți și un hook pentru ștergerea categoriilor, pentru a menține meniul actualizat
2)
Ați putea face mult mai simplu fără un meniu WordPress:
- doar scrieți o funcție care listează categoriile (sau folosiți funcția predefinită
wp_list_categories
) - dacă acest lucru nu este suficient, scrieți una personalizată care (eventual recursiv) citește categoriile din baza de date
Pentru opțiunea 1, aveți nevoie de câteva cunoștințe despre WordPress.

Prefer să utilizez wp_list_categories
. Iată codul pe care l-am folosit în ultimul meu proiect:
<?php wp_list_categories('orderby=ID&exclude=3,10,1,16,38&title_li=<span class="sidebar_heading d_shadow">' . __('Categories') . '</span>'); ?>
Vei obține o listă cu toate categoriile și subcategoriile tale.

După multă cercetare am găsit o soluție de încredere și utilă, această clasă funcționează bine:
class EntexAutoSubmenu {
/**
* Constructor
*/
function __construct(){
add_action('created_category', array($this, 'on_publish_category'));
}
/**
* La publicarea unei noi categorii copil, o adaugă în meniul personalizat corespunzător.
*/
function on_publish_category($cat_id){
// Tema suportă meniuri personalizate?
if (!current_theme_supports('menus')) return;
// Taxonomia publicată are părinte?
$cat = get_category($cat_id);
if (!$cat->category_parent) return;
$all_menus = get_terms('nav_menu', array('hide_empty' => true));
// Iterează prin meniuri pentru a găsi părintele paginii
foreach ($all_menus as $menu) {
$menu_parent = NULL;
$menu_items = wp_get_nav_menu_items($menu->term_id, array('post_status' => 'publish,draft'));
if (!is_array($menu_items)) continue;
foreach ($menu_items as $menu_item){
// Elementul există deja în meniu?
if ($menu_item->object_id == $cat_id) continue 2;
if ($menu_item->object_id == $cat->category_parent) $menu_parent = $menu_item;
}
// Adaugă element nou
if ($menu_parent) {
wp_update_nav_menu_item($menu->term_id, 0, array(
'menu-item-object-id' => $cat_id,
'menu-item-object' => $cat->taxonomy,
'menu-item-parent-id' => $menu_parent->ID,
'menu-item-type' => 'taxonomy',
'menu-item-status' => 'publish'
));
}
}
}
}
$auto_submenu = new EntexAutoSubmenu();

O altă alternativă ar fi să folosești List Custom Taxonomy Widget, ar putea funcționa în cazul tău (dacă nu intenționezi să folosești WP nav_menu).

Am codat eu personal pentru unul dintre clienții mei
<div class="menu">
<ul id="MenuBar1" class="MenuBarHorizontal">
<li><a <?PHP if( count($_GET) == 0 ){ echo 'class="-current"';} ?> href="<?php echo esc_url( home_url( '/' ) ); ?>">acasă</a></li>
<?php
$category_ids = get_all_category_ids();
sort($category_ids);
foreach($category_ids as $cat_id) {
$cat_name = get_cat_name($cat_id);
echo '<li><a href="' . get_category_link( $cat_id ) . '">' . $cat_name . '</a>';
$args = array( 'numberposts' => -1, 'offset'=> 0, 'cat' => $cat_id, 'orderby' => 'ID', 'order' => 'ASCE' );
echo '<ul>';
/* A doua interogare (fără variabilă globală) */
$query2 = new WP_Query( $args );
// A doua buclă
while( $query2->have_posts() ):
$query2->next_post();
echo '<li><a href="' . get_permalink( $query2->post->ID ) . '">' . get_the_title( $query2->post->ID ) . '</a></li>';
endwhile;
// Restaurarea interogării originale și a datelor postului
wp_reset_query();
wp_reset_postdata();
echo '</ul>';
echo '</li>';
}
?>
</ul>
</div>

Pentru a rezolva această problemă, am încercat să creez un plugin care să genereze automat un element de meniu pentru categoria publicată sub categoria părinte, dacă aceasta se află în meniu.
Ideea pentru plugin:
1.În cod, am folosit acțiunea "created_$taxonomy".
2.Am colectat toate elementele de meniu (folosind wp_get_nav_menu_items)
3.Și am adăugat condiția ca dacă părintele categoriei publicate se află în elementul de meniu, atunci un element de meniu este creat ca submeniu al categoriei părinte. (folosind wp_update_nav_menu_item)
<?php
/*
Plugin Name: Auto Category Submenu
Plugin URI:
Description: Creează un element de meniu atunci când o categorie este publicată/creată, dacă categoria părinte este un element de meniu.
Version: 0.1
Author: Mayank Gupta/Ravinder Kumar
Author URI:
License: GPL2
*/
class AutoSubmenu {
/**
* Constructor
*/
function __construct() {
add_action( 'created_category', array( &$this, 'on_publish_cat' ) );
}
/**
* La publicarea unei noi pagini copil, o adaugă în meniul personalizat corespunzător.
*/
function on_publish_cat( $cat_id ) {
$cat = get_category( $cat_id );
//ID-ul meniurilor în care categoria părinte a subcategoriei este element de meniu
$menu_ids = array(101,100);
//preia toate elementele de meniu din meniu
foreach($menu_ids as $menu_id){
$menu_items[] = wp_get_nav_menu_items( $menu_id, array('post_status' => 'publish','post_type' => 'nav_menu_item','output' => ARRAY_A, ) );
}
foreach($menu_items as $menu_item){
$counter = 0 ;
echo'<!--';
print_r($menu_item);
echo'-->';
foreach($menu_item as $menu_term){
$menu_terms_id[] = $menu_term->object_id; //toate ID-urile elementelor de meniu
}
}
//print_r($menu_terms_id); //test pentru elementele din meniu
foreach( $menu_terms_id as $menu_term ){
if( $cat->category_parent == $menu_term){
wp_update_nav_menu_item( $cat_id, 0, array(
'menu-item-object-id' => $cat_id,
'menu-item-object' => $cat->taxonomy,
'menu-item-parent-id' => $menu_term,
'menu-item-type' => 'category',
'menu-item-status' => 'publish'
) );
}else{
return;
}
}
}
}
$auto_submenu = new AutoSubmenu();
Notă: plugin-ul afișează o eroare (header deja trimis) și elementul de meniu nu este creat la publicarea categoriei. Aceasta poate fi o altă problemă, dar am adăugat-o aici pentru că poate exista o soluție dacă cineva îmi poate indica unde greșesc. Îmi cer scuze dacă am greșit prin a o include aici.

Folosesc acest cod pentru a afișa toate categoriile și subcategoriile ca un meniu în proiectul meu.
$all_categories = get_categories( $args );
echo "<div class='container'>";
echo "<div class='productsubmenu'>";
echo "<ul>";
foreach ($all_categories as $cat)
{
if($cat->category_parent == 0)
{
$category_id = $cat->term_id;
$thumbnail_id = get_woocommerce_term_meta( $cat->term_id, 'thumbnail_id', true );
$image = wp_get_attachment_url( $thumbnail_id );
echo '<li class="parent '.$my.' "><a href="'.get_term_link( $cat ) . '">'.$cat->name.'</a>';
$args2 = array(
'taxonomy' => $taxonomy,
'child_of' => 0,
'parent' => $category_id,
'orderby' => $orderby,
'show_count' => $show_count,
'pad_counts' => $pad_counts,
'hierarchical' => $hierarchical,
'title_li' => $title,
'hide_empty' => $empty
);
$args = array(
'hierarchical' => 1,
'show_option_none' => '',
'hide_empty' => 0,
'parent' => $parent_cat_ID,
'taxonomy' => 'product_cat'
);
$subcats = get_categories($args2);
echo '<ul class="wooc_sclist">';
foreach ($subcats as $sc) {
}
$link = get_term_link( $sc->slug, $sc->taxonomy );
echo '<li class="'.$my.'" ><a href="'. $link .'">'.$sc->name.'</a></li>';
}
echo '</ul>';
echo "</li>";
}
else
{
}
}
echo "</ul>";
echo "</div>";
echo "</div>";

Răspunsurile sunt de obicei mai mult decât simple blocuri de cod. Te rog să editezi răspunsul tău și să explici ce faci și de ce?

Aceasta este abordarea mea, funcționează pentru categoriile de produse.
$cat_args = array( 'orderby' => 'name', 'order' => 'asc', 'hide_empty' => true,);
$cats = get_terms( 'product_cat', $cat_args );
foreach ($cats as $key => $cat):
if ($cat->parent == 0):
echo $cat->name;
foreach ($cats as $key => $cat2):
if ($cat2->parent == $cat->term_id):
echo $cat2->name;
foreach ($cats as $key => $cat3):
if ($cat3->parent == $cat2->term_id):
echo $cat3->name;
endif;
endforeach;
endif;
endforeach;
endif;
endforeach;
