I'm a little stuck here. I have a menu in Wordpress with some posts in it. What I would like is to retrieve all the posts as objects.

I think I'm pretty close, but the SQL query doesn't seem to work as I want.

This is wat I have so far:

$querystr = "
SELECT wposts.* FROM wp_posts wposts
LEFT JOIN wp_postmeta wmeta ON wposts.ID = wmeta.post_id
LEFT JOIN wp_term_relationships wrel ON wrel.object_id = wmeta.meta_value
LEFT JOIN wp_terms wterms ON wrel.term_taxonomy_id = wterms.term_id
WHERE wterms.term_id= $menu_id

$posts = $wpdb->get_results($querystr, OBJECT);

I'm pretty sure it's a stupid little SQL logic error, but I realy can't find it..

  • Please be more specific about your usecase. Maybe there're easier alternatives.
    – kaiser
    Commented Jun 17, 2011 at 1:09

2 Answers 2


I recently needed the same thing, I had menu of categories and I needed to get the categories that in the menu. After a several hours digging in the WP core, I found the wp_get_nav_menu_items() function that helped me.

I finnally came with this, 220 was my menu_id

$navcat = wp_get_nav_menu_items('220');
    foreach ($navcat as $obj) {
        $catid = $obj->object_id;
        $category = get_category($catid);

So, if you have a nav menu of posts, I assume you can do the same, something like this should work -

$nav_items = wp_get_nav_menu_items('220');  
    foreach ($nav_items as $obj) {
        $objid = $obj->object_id;
        $postobj = get_post($objid);

        //do stuff with the post..

I think it can save you some complexed mySQL query...

  • thanks, not realy what i wanted, because you get a menu_item object back instead of the full post object. But for what I was trying to do it was sufficient. Especially since you can get the original post-id by getting $obj->object_id, allowing me to also get the posts meta whitout to much overhead.
    – Jules
    Commented Jun 17, 2011 at 12:43
  • Oh, I read over this line $postobj = get_post($objid);. That would indeed give me the post, but that doesn't look very efficient, because there will be an extra query to the database fot each post, no? What I was trying is to get the posts in the most efficient way (= only one query)
    – Jules
    Commented Jun 17, 2011 at 12:58
  • @Jules, you are right that in that way there will be a db query for each post. You can make it more efficient by something like this: foreach ($nav_items as $obj) { $objid = $obj->object_id; $postobjArr[] = $obj->object_id; //save array of post ids } $postobj = get_posts(array('post__in' => $postobjArr)); //get all posts in one time and do stuff with them.. Commented Jun 19, 2011 at 14:46

There's a function to get a nav menu as object: wp_get_nav_menu_object() - the items (posts) are inside the object and accessible.

  • Thanks, that would probably have worked a bit like the wp_get_nav_menu_items() method Maor Barazany suggested. I haven't tried it because wp_get_nav_menu_items() is a bit more direct for what i need.
    – Jules
    Commented Jun 17, 2011 at 12:46

Not the answer you're looking for? Browse other questions tagged or ask your own question.