Cum să creezi un meniu cu toate subcategoriile?

7 mai 2013, 00:26:33
Vizualizări: 34.1K
Voturi: 6

Este posibil să creezi un meniu cu o categorie astfel încât de fiecare dată când adaugi o subcategorie, aceasta să fie afișată automat în meniu?

Din câte știu, dacă am un meniu cu categoria "fructe" și creez subcategoria "banane", trebuie să o adaug manual.

1
Comentarii

Aș recomanda JC Submenu de la James Collings. Adaugă-l nou din pagina de plugin-uri WordPress. Este foarte simplu de utilizat și util. Doar instalează, activează și selectează "JC Submenu" când adaugi o categorie în meniul tău principal din panoul de control.

Jamshaid Ali Jamshaid Ali
4 mai 2017 19:51:54
Toate răspunsurile la întrebare 8
0

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.

13 mai 2013 21:17:30
0

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.

14 mai 2013 09:12:41
0

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();
29 nov. 2016 23:25:39
0

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).

14 mai 2013 09:54:17
2

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>
14 mai 2013 10:15:33
Comentarii

nu crede că ai închis div class menu

Jon Jon
9 feb. 2014 16:26:40

get_all_category_ids() este învechit acum

Harish Kumar Harish Kumar
9 ian. 2023 14:16:18
0

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.

18 mai 2013 16:42:05
2

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>";
1 iun. 2017 15:12:48
Comentarii

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?

Howdy_McGee Howdy_McGee
1 iun. 2017 17:30:40

Acest cod nu compilează și nu funcționează, fiind de asemenea dependent de WooCommerce.

Stephen Saucier Stephen Saucier
16 mar. 2019 21:47:05
0

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;
26 nov. 2020 20:50:31