1

我正在尝试做一个由类别和子类别组成的菜单。对于每个子类别,我想显示该类别中的最新帖子。我试图用到处找到的代码创建一个walker,但现在它为每个项目显示相同的最新帖子,并且它位于父类别及其子类别之间。我如何获取好的类别,并仅显示子类别的最新帖子?这是我的代码:

 class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {

 function start_el(&$output, $item, $depth, $args)
  {
       global $wp_query;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

       $class_names = $value = '';

       $classes = empty( $item->classes ) ? array() : (array) $item->classes;

       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '" ' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
       $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

       $prepend = '<strong>';
       $append = '</strong>';
       $description  =  '<div id="querySort"></div>';

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
        $item_output .= $description.$args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        //ajout du nb de posts

        $submenus = $depth == 0 ? get_posts( array( 'post_type' => 'nav_menu_item', 'numberposts' => -1, 'orderby' => 'menu_order', 'order' => 'ASC', 'meta_query' => array( array( 'key' => '_menu_item_menu_item_parent', 'value' => $item->ID ) ) ) ) : false;

        $item_output .= $submenus ? ' <span class="submenus-count">(' . count( $submenus ) . ')</span>' : '';
        $item_output .= $args->after;

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


        //add last post for each subcategories

         $cat_name = esc_attr( $category->name); 
         $cat_name = apply_filters( 'list_cats', $cat_name, $category ); 

         $list_recent_cat_post = '<ul class="show-hide">';
         $args = array( 'numberposts' => 4, 'category_name' => $category->name );
         $myposts = get_posts( $args );
         foreach( $myposts as $mypost ) :  
            $list_recent_cat_post .= '<li><a href="' . get_permalink($mypost->ID) . '">' . $mypost->post_title . '</a></li>';
         endforeach; 
         $list_recent_cat_post .= '</ul>';



         $link = '<a href="' . get_category_link( $category->term_id ) . '" '; 
         if ( $use_desc_for_title == 0 || empty($category->description) ) 
             $link .= 'title="' . sprintf(__( 'View all posts filed under %s' ), $cat_name) . '"'; 
         else 
             $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"'; 
         $link .= '>'; 
         $link .= $cat_name . '</a>'; 

         if ( (! empty($feed_image)) || (! empty($feed)) ) { 
             $link .= ' '; 

             if ( empty($feed_image) ) 
                 $link .= '('; 

             $link .= '<a href="' . get_category_feed_link($category->term_id, $feed_type) . '"'; 

             if ( empty($feed) ) 
                 $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"'; 
             else { 
                 $title = ' title="' . $feed . '"'; 
                 $alt = ' alt="' . $feed . '"'; 
                 $name = $feed; 
                 $link .= $title; 
             } 

             $link .= '>'; 

             if ( empty($feed_image) ) 
                 $link .= $name; 
             else 
                 $link .= "<img src='$feed_image'$alt$title" . ' />'; 
             $link .= '</a>'; 
             if ( empty($feed_image) ) 
                 $link .= ')'; 
         } 

         if ( isset($show_count) && $show_count ) 
             $link .= ' (' . intval($category->count) . ')'; 

         if ( isset($show_date) && $show_date ) { 
             $link .= ' ' . gmdate('Y-m-d', $category->last_update_timestamp); 
         } 


         $link .= $list_recent_cat_post;


         if ( isset($current_category) && $current_category ) 
             $_current_category = get_category( $current_category ); 

         if ( 'list' == $args['style'] ) { 
             $output .= "\t<li"; 
            $class = 'cat-item cat-item-'.$category->term_id; 
             if ( isset($current_category) && $current_category && ($category->term_id == $current_category) ) 
                 $class .=  ' current-cat'; 
             elseif ( isset($_current_category) && $_current_category && ($category->term_id == $_current_category->parent) ) 
                 $class .=  ' current-cat-parent'; 
             $output .=  ' class="'.$class.'"'; 
             $output .= ">$link\n"; 
         } else { 
             $output .= "\t$link\n"; 
         } 

        }
        }
4

1 回答 1

1

这是你的功能人:

class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {

 function start_el(&$output, $item, $depth, $args)
  {
       global $wp_query;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

       $class_names = $value = '';

       $classes = empty( $item->classes ) ? array() : (array) $item->classes;

       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '" ' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
       $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

       $prepend = '<strong>';
       $append = '</strong>';
       $description  =  '<div id="querySort"></div>';

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
        $item_output .= $description.$args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        //ajout du nb de posts

        $submenus = $depth == 0 ? get_posts( array( 'post_type' => 'nav_menu_item', 'numberposts' => -1, 'orderby' => 'menu_order', 'order' => 'ASC', 'meta_query' => array( array( 'key' => '_menu_item_menu_item_parent', 'value' => $item->ID ) ) ) ) : false;

        $item_output .= $submenus ? ' <span class="submenus-count">(' . count( $submenus ) . ')</span>' : '';
        $item_output .= $args->after;

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


        //add last post for each subcategories

        if( $item->type == 'taxonomy' && $item->post_parent != 0 ){

             $list_recent_cat_post = '<ul class="show-hide">';
             $args = array( 'numberposts' => 4, 'category__in' => $item->object_id );
             $myposts = get_posts( $args );
             foreach( $myposts as $mypost ) :  
                $list_recent_cat_post .= '<li><a href="' . get_permalink($mypost->ID) . '">' . $mypost->post_title . '</a></li>';
             endforeach; 
             $list_recent_cat_post .= '</ul>';
            }else{
                $list_recent_cat_post = ''; 
            }


         $link = '<a href="' . get_category_link( $category->term_id ) . '" '; 
         if ( $use_desc_for_title == 0 || empty($category->description) ) 
             $link .= 'title="' . sprintf(__( 'View all posts filed under %s' ), $cat_name) . '"'; 
         else 
             $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"'; 
         $link .= '>'; 
         $link .= $cat_name . '</a>'; 

         if ( (! empty($feed_image)) || (! empty($feed)) ) { 
             $link .= ' '; 

             if ( empty($feed_image) ) 
                 $link .= '('; 

             $link .= '<a href="' . get_category_feed_link($category->term_id, $feed_type) . '"'; 

             if ( empty($feed) ) 
                 $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"'; 
             else { 
                 $title = ' title="' . $feed . '"'; 
                 $alt = ' alt="' . $feed . '"'; 
                 $name = $feed; 
                 $link .= $title; 
             } 

             $link .= '>'; 

             if ( empty($feed_image) ) 
                 $link .= $name; 
             else 
                 $link .= "<img src='$feed_image'$alt$title" . ' />'; 
             $link .= '</a>'; 
             if ( empty($feed_image) ) 
                 $link .= ')'; 
         } 

         if ( isset($show_count) && $show_count ) 
             $link .= ' (' . intval($category->count) . ')'; 

         if ( isset($show_date) && $show_date ) { 
             $link .= ' ' . gmdate('Y-m-d', $category->last_update_timestamp); 
         } 


         $link .= $list_recent_cat_post;


         if ( isset($current_category) && $current_category ) 
             $_current_category = get_category( $current_category ); 

         if ( 'list' == $args->style ) { 
             $output .= "\t<li"; 
            $class = 'cat-item cat-item-'.$category->term_id; 
             if ( isset($current_category) && $current_category && ($category->term_id == $current_category) ) 
                 $class .=  ' current-cat'; 
             elseif ( isset($_current_category) && $_current_category && ($category->term_id == $_current_category->parent) ) 
                 $class .=  ' current-cat-parent'; 
             $output .=  ' class="'.$class.'"'; 
             $output .= ">$link\n"; 
         } else { 
             $output .= "\t$link\n"; 
         } 

    }
}

您的函数的问题是您希望设置变量 $category。这是一个错误。另一个是您没有检查菜单项类型。您只想将子菜单应用于分类类型的菜单项。并且要从该分类中获取帖子,您必须获取带有 category__in arg 的帖子,其中包含类别 ID,您可以从 $item->object_id 获得。

于 2013-01-28T11:42:19.827 回答