我正在尝试在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\');
最合适的回答,由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;