2

I have a custom walker set up designed to add content into the nav menu. The problem being that it is not pulling the content. The post object returned by the get_post/get_page has an empty post_content attribute. What is causing this?

Walker:

class mobile_walker_nav_menu extends Walker_Nav_Menu {



function start_lvl( &$output, $depth ) {
// depth dependent classes
$indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
$display_depth = ( $depth + 1); // because it counts the first submenu as 0
$classes = array(
    'sub-menu',
    ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
    ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
    'menu-depth-' . $display_depth
    );
$class_names = implode( ' ', $classes );

// build html
$output .= "\n" . $indent . '<ul class="' . $class_names . '">' . "\n";
}


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

// depth dependent classes
$depth_classes = array(
    ( $depth == 0 ? 'main-menu-item' : 'sub-menu-item' ),
    ( $depth >=2 ? 'sub-sub-menu-item' : '' ),
    ( $depth % 2 ? 'menu-item-odd' : 'menu-item-even' ),
    'menu-item-depth-' . $depth
);


$depth_class_names = esc_attr( implode( ' ', $depth_classes ) );

// passed classes
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = esc_attr( implode( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ) );
// build html
$output .= $indent . '<li id="nav-menu-item-'. $item->ID . '" class="' . $depth_class_names . ' ' . $class_names . ' ' . $theBack . '">';

// link attributes
$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        ) .'"' : '';
$attributes .= ' class="menu-link ' . ( $depth > 0 ? 'sub-menu-link' : 'main-menu-link' ) . ' ' . $class_names . '"';

$item_output = sprintf( '%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s',
    $args->before,
    $attributes,
    $args->link_before,
    apply_filters( 'the_title', $item->title, $item->ID ),
    $args->link_after,
    $args->after
);

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

$output .= '<div class="slidedown">';
var_dump(get_page($item->ID));
if(is_page($item->ID)){
        $the_page = get_page($item->ID);
        var_dump($the_page);
        $output .= apply_filters('the_content', $the_page->post_content);
} elseif (is_single($item->ID)){
        $the_post = get_post($item->ID); 
        $output .= apply_filters('the_content', $the_post->post_content);
}
}

function end_el( &$output, $item, $depth = 0, $args = array() ) {
    $output .= "</div></li>\n";
}
}
4
  • Does $item->ID match your page ID?
    – s_ha_dum
    Apr 17, 2014 at 17:01
  • I think you want $item->object_id - $item->ID is the ID of the menu object. Apr 17, 2014 at 17:05
  • I thought is was $item->object_id as well but object_id doesn't match the actual page/post id and also returns false on is_page() and is_single();
    – jppower175
    Apr 17, 2014 at 17:14
  • Just FYI, TheDeadMedic was correct in his comment. The answer is $item->object_id.
    – Kelderic
    Jan 2, 2017 at 21:28

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.