使用来自另一个自定义帖子类型的帖子标题填充metabox下拉列表(wp_Reset/global$POST问题)

时间:2017-02-01 作者:Quin

我有一个自定义的帖子类型,其中有一个带有下拉列表的元框。下拉列表中填充了来自其他自定义帖子类型的帖子标题。

我的metabox系统工作正常。我尝试对选项进行硬编码,它们保存正确。我还可以从自定义帖子类型中提取数据来填充下拉列表。

问题在于数据的保存/加载。

我尝试了wp\\u query和get\\u post,以及相应的重置,但每当我尝试拉入数据时,下拉列表不会更新,永久链接将更改为最后拉入的自定义post类型。

我只需要知道如何正确地拉入数据,或者正确地重置循环。

    /*  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 \'<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>\';
    }

    /*  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);

1 个回复
SO网友:Quin

好的,我已经整理好了。

我在这里找到了一个类似的帖子;WordPress没有重置回主循环。

所以我现在的代码是:

    /*  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>\';
    }
我所做的是设置global$post,也设置了相同的$tempPost。在“重置”之后,我用存储在$tempPost中的内容更新了$post。永久对齐保持不变,可以更改选项,并显示所有区域。

希望这样可以加载和保存区域。

相关推荐

仅为主页显示Metabox

我将尝试使用设置字段将metabox添加到主页,但出现问题,请帮助我。删除时,metabox不会显示在页面编辑器中if statement 它显示在所有页面上。add_action(\'add_meta_boxes\', \'metabox_homepage_videos\'); function metabox_homepage_videos($post) { if (is_front_page()): add_meta_box(\'metabox