When I use the following code in a (wpalchemy) custom meta box, everything works fine. That is until I pressed 'add new'. At this point, the title, slug, featured image, etc.. are being pre-populated with the content from my 'products' post type.

The code builds a drop down within my 'case studies' post-type, and populates it with post titles/ids from my 'projects' post type.

How can I use the loop in the backend like this without messing stuff up. I tried with get_posts as well as WP_Query.

global $post;
$args = array( 'post_type' => 'projects', 'posts_per_page' => 200 );
$custom_posts = get_posts($args);

foreach($custom_posts as $post) : setup_postdata($post);
  echo '<option value="' . get_the_id() . '"';
  echo '>' . get_the_title() . '</option>' . "\n";

Edit: A little more background:

I'm using the wpalchemy class for custom meta boxes. The following code is included in my functions.php file, after /wpalchemy/MetaBox.php https://github.com/farinspace/wpalchemy/blob/dev/wp-content/wpalchemy/MetaBox.php

$assoc_project = new WPAlchemy_MetaBox(array(
    'id' => '_assoc_project',
    'title' => 'Associated Project',
    'template' => get_stylesheet_directory() . '/metaboxes/case-studies-assoc_proj-meta.php',
    'types'=> array('case-studies')

Edit 2: Update

I've tried and replicated this problem accross multiple browsers on my PC, but I just had a co-worker try on Ffox/mac and they don't have the problem. I don't understand why this would be platform specific - but there it is...

  • what hook are you using to run that code?
    – mrwweb
    Jun 4, 2012 at 21:01
  • @mrwweb not really sure, as I'm using the wpalchemy class. I've updated my question with some more info. Jun 4, 2012 at 21:26

2 Answers 2


After you create a custom loop, you need to restore the global post variables with wp_reset_query().

  • I'm giving you the check, since this is the right answer. I was using wp_reset_query() but somehow must've been doing something else wrong... Jun 26, 2012 at 13:31

Ok, I sorted this out myself. Instead of get_posts or WP_Query I used a custom select query as explained here

My revised code:

<select name="<?php $mb->the_name(); ?>">
    global $wpdb;
    $selected = ' selected="selected"';
    $querystr = "
       SELECT $wpdb->posts.post_title,  $wpdb->posts.ID
       FROM $wpdb->posts
       WHERE $wpdb->posts.post_type = 'projects' 
       AND $wpdb->posts.post_status = 'publish' 
       ORDER BY $wpdb->posts.post_name DESC
    $assocProjQuery = $wpdb->get_results($querystr, OBJECT);
    foreach($assocProjQuery as $ap):
        echo '<option value="' . $ap->ID . '"';
            if ($mb->get_the_value() == $ap->ID ) echo $selected;
        echo '>' . $ap->post_title . '</option>' . "\n";

Your Answer

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

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