在SAVE_POST函数中使用新的WP_QUERY会更改$POST

时间:2012-08-30 作者:Force Flow

我正在尝试在save\\u post函数中为自定义帖子类型包含WP\\u查询。该查询用于检查自定义字段的所有其他帖子bh_shortcode 确保字段内容不重复。

但是,当我创建并循环通过wp\\U查询时$post 然后,wp\\U查询结果中显示的一个post实体被设置为$post, 结果,所有字段都被保存到错误的帖子(而不是我打开的帖子)。

这个wp_reset_query() 似乎没有任何效果。

如何更正此问题?

function save_bhour_details(){
    global $post;

    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ){
        return;
    }

    if ( get_post_type($post) != \'bhours\'){
        return;
    }

    //validate shortcode
    $bh_shortcode=\'\';
    $error_shortcode_empty=false;
    $error_shortcode_duplicate=false;


    if(isset($_POST[\'bh_shortcode\']) && !empty($_POST[\'bh_shortcode\'])){
        $bh_shortcode=bh_strip_special_chars($_POST[\'bh_shortcode\']);

        if(empty($bh_shortcode)){
            $error_shortcode_empty=true;
        }
        else{

            $query_validate = new WP_Query(array(
                \'post_type\'=>\'bhours\',
            ));

            while($query_validate->have_posts()){
                $query_validate->the_post();
                $bh_post_shortcode=array_shift(get_post_custom_values(\'bh_shortcode\'));

                if($bh_post_shortcode==$bh_shortcode){
                    $error_shortcode_duplicate=true;
                    break;
                }
            }
            wp_reset_query();           
        }

    }
    else{
        $error_shortcode_empty=true;
    }

    if(!$error_shortcode_empty && !$error_shortcode_duplicate){
        update_post_meta($post->ID, \'bh_shortcode\', $bh_shortcode);
    }
    else{
        update_post_meta($post->ID, \'bh_shortcode\', \'\');
    }

}
add_action(\'save_post\', \'save_bhour_details\');

1 个回复
最合适的回答,由SO网友:Force Flow 整理而成

自从wp_reset_query()wp_reset_post() 在这种情况下似乎什么都没做,这里有些东西似乎有用。我不完全确定这是否是公认的方法,但我通过在WP\\u查询之前临时存储$post值,然后在查询完成后将其设置回$post变量来实现它。

$currentpost = $post;

$query = new WP_Query(/* ... */);

while($query->have_posts()){
     $query->the_post();
     //do stuff
}

$post = $currentpost;

结束

相关推荐

Custom loop by url

因此,目前我有一个“搜索”的工作,即:如果我做www.domain。com/search/query,它返回在单词“query”上找到的所有内容。我想利用我在搜索中创建的循环/模板。php,但将其更改为POST。然后尽可能查询特定的帖子类别,例如:www.domain。com/posts/类别1我想这一切都源于改变<?php get_template_part(\'loop\', \'search\'); ?> wordpress是个新手,所以非常感谢您的帮助或建议!