Populate metabox dropdown with post title from another Custom Post Type (issues with wp_reset / global $post)

I have a custom post type, and in there I have a metabox with a dropdown. The dropdown is populated with the titles of posts from another custom post type.

My metabox system works. I tried hardcoding the options and they save correctly. I can also pull the data from the custom post type to populate the dropdown.

The issue lies within the save/loading of data.

I've tried wp_query and get_posts, with their corresponding resets, but whenever I try to pull in the data, the dropdown isn't updated and the permalink is changed to the last pulled custom post type.

I just need to know how to pull in the data correctly, or reset the loop properly.

    /*  Create role metabox */
    function create_roles_metabox() {
        global $post;

        add_meta_box(
            'roles_metabox',
            'Role Area  Level',
            'show_roles_metabox',
            'role',
            'side',
            'high'
        );
    }

    /*  Show roles metabox  */
    function show_roles_metabox() {
        global $post;

        wp_nonce_field(basename(__FILE__), 'role_nonce');

        $pro_areas = array(
            'One',
            'Two',
            'Three'
        );

    /*
    $args = array(
        'post_type' = 'proarea',
        'publish_status' = 'publish',
        'posts_per_page' = -1,
        'order' = 'ASC'
    );
    $the_query = new WP_Query($args);
    if($the_query-have_posts()) {
        echo 'ul';
        while ( $the_query-have_posts()) {
            $the_query-the_post();
            echo 'li' . get_the_title() . '/li';
        }
        echo '/ul';
    } else {
    }
    */

    /*
    $mcpt_query = array();
    $the_query = get_posts('post_type=proarea');
    foreach ( $the_query as $post ) : setup_postdata( $post );
    $mcpt_query[] = array(
        'title' = get_the_title($post-ID)
    );
    endforeach;
    wp_reset_postdata();
    print_r($mcpt_query);
    */

        echo 'spanlabel for="pro_area"Professional Area: /label/span';
        echo 'select name="pro_area"';

        foreach($pro_areas as $pro_area) {
            if($pro_area == get_post_meta($post-ID, 'pro_area', true))
                echo 'option selected'. $pro_area .'/option';
            else
                echo 'option'. $pro_area .'/option';
        }

        echo '/select';
    }

    /*  Save roles metabox  */
    function save_roles_metabox($post_id, $post) {
        if(!isset($_POST['role_nonce']) || !wp_verify_nonce($_POST['role_nonce'], basename(__FILE__)))
            return $post-ID;
        if(!current_user_can('edit_post', $post-ID))
            return $post-ID;
        if(defined('DOING_AUTOSAVE')  DOING_AUTOSAVE)
            return $post-ID;

        if(isset($_POST['pro_area']))
            update_post_meta($post_id, 'pro_area', $_POST['pro_area']);
    }

    add_action('add_meta_boxes', 'create_roles_metabox');
    add_action('save_post', 'save_roles_metabox', 1, 2);

Topic wp-reset-query wp-reset-postdata metabox plugins custom-post-types Wordpress

Category Web


Okay, I've got it sorted.

I found a post on here with something similar; WordPress wasn't resetting back into the main loop.

So my code is now:

    /*  Show roles metabox  */
    function show_roles_metabox() {
        global $post;
        $tempPost = $post;

        wp_nonce_field(basename(__FILE__), 'role_nonce');

        $pro_areas = array(
            'One',
            'Two',
            'Three'
        );

    $args = array(
        'post_type' => 'proarea',
        'publish_status' => 'publish',
        'posts_per_page' => -1,
        'order' => 'ASC'
    );
    $the_query = new WP_Query($args);
    if($the_query->have_posts()) {
        echo '<ul>';
        while ( $the_query->have_posts()) {
            $the_query->the_post();
            echo '<li>' . get_the_title() . '</li>';
        }
        echo '</ul>';
    } else {
    }
    wp_reset_postdata();

    /*
    $mcpt_query = array();
    $the_query = get_posts('post_type=proarea');
    foreach ( $the_query as $post ) : setup_postdata( $post );
    $mcpt_query[] = array(
        'title' => get_the_title($post->ID)
    );
    endforeach;
    wp_reset_query();
    print_r($mcpt_query);
    */

    $post = $tempPost;

        echo '<span><label for="pro_area">Professional Area: </label></span>';
        echo '<select name="pro_area">';

        foreach($pro_areas as $pro_area) {
            if($pro_area == get_post_meta($post->ID, 'pro_area', true))
                echo '<option selected>'. $pro_area .'</option>';
            else
                echo '<option>'. $pro_area .'</option>';
        }

        echo '</select>';
    }

What I did was set global $post, and also $tempPost the same. After the "reset", I updated $post with what was stored in $tempPost. The permalink stays the same, I an change the options, and all the areas are displayed.

Hopefully this should allow the areas to be loading in and saved.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.