WordPress

kategorie — Jak usunąć element z niestandardowego menu Walker_Nav_Menu

  • 9 kwietnia, 2020
  • 5 min read
kategorie — Jak usunąć element z niestandardowego menu Walker_Nav_Menu


Mam niestandardowe menu w witrynie wordpress + woocommerce przy użyciu klasy Walker_Nav_Menu. Podczas ukrywania postów (produktów) w witrynie te posty i kategorie są nadal zawarte w niestandardowym menu. Chciałbym wiedzieć, jak usunąć z tego menu określone posty produktowe, np. ID postu = 6927 – lub usunąć kategorię (i produkty w niej zawarte) z tego menu, np. ID kategorii = 41. Kategoria, którą chcę do ukrycia to „Koniec zakresu” na tym obrazie:

zrzut ekranu niestandardowego menu

Próbowałem wielu rozwiązań w ciągu ostatnich 2 dni bez powodzenia:

1)

function wpse31748_exclude_menu_items( $items, $menu, $args ) {
    // Iterate over the items to search and destroy
    foreach ( $items as $key => $item ) {
        if ( $item->object_id == 6927 ) unset( $items[$key] );
    }

    return $items;
}

add_filter( 'wp_get_nav_menu_items', 'wpse31748_exclude_menu_items', null, 3 ); 

i różne odmiany powyższego.

Nie jestem pewien, czy jestem całkowicie zboczony, ale pomyślałem, że aktualizacja pliku template-parts/modules/module-category-menu.php w celu wykluczenia kategorii może zadziałać, oto zawartość tego pliku:

<?php
$orderby = 'date';
$order="desc";
$hide_empty = true ;
$cat_args = array(
  'orderby'    => $orderby,
  'order'      => $order,
  'hide_empty' => $hide_empty,

);

$product_categories = get_terms( 'product_cat', $cat_args );
if( !empty($product_categories)) : 
  ?>
  <div class="row">
    <div class="col-12 sec-menu">
      <ul class=" nav nav-justified" id="sec-menu">
        <?php
        foreach ($product_categories as $key => $category):
          ?>
          <li class="nav-item">
            <h2>
            <a class="nav-link collapsed top-menu" href="#cat<?php echo $category->term_id; ?>" data-toggle="collapse" data-target="#cat<?php echo $category->term_id; ?>">  
             <?php echo $category->name; ?>

           </a>
            </h2>     
           <?php
           $args = array(
            'posts_per_page' => '-1',
            'post_type' => 'product',
            'post_status' => 'publish',
            'orderby'    => 'date',
            'order'      => 'asc',
            'tax_query' => array(
              array(
                'taxonomy'  => 'product_cat',
                'terms'     => array($category->term_id),
                'operator'   => 'IN'
              ),
            )
          );
           $products = new WP_Query($args);
           if($products->have_posts()):
             ?>
             <div class="collapse sub-menu" id="cat<?php echo $category->term_id; ?>" aria-expanded="false" data-parent="#sec-menu">
              <ul class="flex-column nav">
                <?php
                while($products->have_posts()):
                  $products->the_post();
                  ?>
                  <li class="nav-item">
                    <a class="nav-link sub-link" href="<?php the_permalink();?>" title="<?php the_title(); ?>">
                      <span><?php the_title(); ?></span>                      
                    </a>
                  </li>
                  <?php
                endwhile;
                wp_reset_query();
                ?>
              </ul>
            </div>
            <?php
          endif;
          ?>
        </li>
        <?php
      endforeach;
      ?>
    </ul>
  </div>
</div>
<?php
endif; 
?>

Każda pomoc jest bardzo mile widziana.

Warto przeczytać!  wtyczki - wordpress admin-ajax złe żądanie 400

EDYTOWAĆ
Oto klasa Walker_Nav_Menu z pliku functions.php:

class Custom_Foundation_Nav_Menu extends Walker_Nav_Menu

 {


    private $curItem;

    function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output)
    {

        $element->hasChildren = isset($children_elements[$element->ID]) && !empty($children_elements[$element->ID]);
        return parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);

    }

    function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
    {

        global $wp_query;

        $new_class = array();

        $this->curItem = $item;

        $indent = ($depth) ? str_repeat("\t", $depth) : '';

        $class_names = $value="";

        $classes = empty($item->classes) ? array() : (array) $item->classes;
        $new_class[] = 'nav-item';
        if (in_array('current-menu-item', $classes) || in_array('current-menu-ancestor', $classes)) {
            $new_class[] = 'active';
        }
        if ($item->hasChildren) {
            $add_sub_class="nav-link collapsed";
        } else {
            $add_sub_class="nav-link";
        }

        if ($depth > 0) {
            $add_sub_class .= ' sub-link ';
        }



        $new_class = implode(' ', $new_class);
        // echo $new_class;
        $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item));
        $class_names=" class="" . $new_class . ' ' . $class_names . '"';
        $class_names = trim($class_names);


        $output .= $indent . '<li id="menu-item-' . $item->ID . '" ' . $value . $class_names . '>';
        $attributes = !empty($item->attr_title) ? ' title="' . esc_attr($item->attr_title) . '" ' : '';
        if ($item->hasChildren && !is_page(6927)) {
            $attributes .= ' href="#submenu' . $item->ID . '" ';
            $attributes .= ' data-toggle="collapse" ';
            $attributes .= ' data-target="#submenu' . $item->ID . '" ';
        } else {
            $attributes .= !empty($item->url) ? ' href="' . esc_attr($item->url) . '" ' : '';
        }
        $attributes .= !empty($add_sub_class) ? ' class="' . $add_sub_class . '" ' : '';

        $item_output = $args->before;
        $item_output .= '<a' . $attributes . ' ><span data-hover="' . $args->link_before . apply_filters('the_title', $item->title, $item->ID) . '">';

        $item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID);
        $item_output .= '</span></a>';
        $item_output .= $args->after;

        $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
    }

    function start_lvl(&$output, $depth = 0, $args = array())

    {
        global $wp_query;

        $thisItem = $this->curItem;
        $indent = str_repeat("\t", $depth);
        $output .= "\n$indent<div class="collapse" id='submenu$thisItem->ID' aria-expanded='false'><ul id='submenu-$thisItem->ID' class="flex-column nav sub-nav">\n";
    }

}


Źródło

Warto przeczytać!  Jak dodać stronę postu z przycisku bez ponownego ładowania