我现在花了几个小时来寻找来回移动的错误。我有一个自定义的帖子类型。在添加自定义元框之前,一切都正常。现在,这位鼻涕虫突然获得了$post->ID == \'21\'
创建新的自定义帖子时,子页面将改为自己的标题。它始终是最低的页面标题$post->ID
. 但当我再次移除自定义元框时。一切正常。我可能查到了foreach
但我看不出有什么问题。
除此之外%postname%
出错一切都很好。正确保存自定义字段。我甚至可以手动编辑slug。但事实并非如此。请帮忙!
在没有<form>
立即标记。问题仍然存在。
使命感wp_reset_postdata()
效果不太好。但我意识到,slug总是在我填写标题文本输入后立即创建的。另外,当我稍后编辑自定义帖子并更改一些内容时,slug再次出错。
add_action( \'init\', \'cpt_init_cases\' );
function cpt_init_cases() {
register_post_type( \'case\', array(
\'labels\' => array(
\'name\' => __( \'Cases\' ),
\'singular_name\' => __( \'Case\' )),
\'description\' => \'Create cases to be displayed on single customer child pages\',
\'public\' => true,
\'menu_position\' => 6,
\'rewrite\' => array(\'slug\' => \'case\'),
\'supports\' => array(\'title\', \'editor\', \'thumbnail\', \'custom-fields\')
));
}
/*** when I delete everything below this line slugging works as expected ***/
add_action(\'admin_init\', \'admin_init\');
function admin_init(){
add_meta_box(\'refInfo-meta\', \'Reference\', \'reference_meta_callback\', \'case\', \'side\', \'high\');
}
function reference_meta_callback( $post ){
global $post;
$custom = get_post_custom($post->ID);
if( isset($custom[\'reference_id\'][0]) ) {
$reference_id = $custom[\'reference_id\'][0];
} else {
$reference_id = \'0\';
}
wp_nonce_field( \'my_meta_box_nonce\', \'meta_box_nonce\' );
?>
<form action="<?php bloginfo(\'url\'); ?>" method="get">
<select name="ref_id" id="ref_id">
<option value="0" <?php selected($reference_id, \'0\'); ?>>- choose client -</option>
<?php
$args = array( \'numberposts\' => -1, \'post_type\' => \'page\', \'post_parent\' => 21);
$posts = get_posts( $args );
foreach( $posts as $post ) : setup_postdata( $post ); ?>
<option value="<?php echo $post->ID; ?>" <?php selected($reference_id, $post->ID); ?>><?php the_title(); ?></option>
<?php endforeach; ?>
</select>
</form>
<?php
}
add_action( \'save_post\', \'save_reference_id\' );
function save_reference_id( $post_id ) {
global $post;
if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'my_meta_box_nonce\' ) ) return;
if( isset($_POST[\'ref_id\']) ) {
update_post_meta($post->ID, \'reference_id\', $_POST[\'ref_id\']);
}
}
最合适的回答,由SO网友:engelen 整理而成
这种奇怪的行为很可能是由于form
正在添加的标记。元框已经由form
, 因此,在元框回调中自己添加一个是不必要的。正在删除<form action="<?php bloginfo(\'url\'); ?>" method="get">
和</form>
应该能解决你的问题。
EDIT: 鉴于这并没有解决你的问题:我现在看到了你问题的原因。您正在循环子帖子,然后通过setup_postdata
. 之后应该重置帖子数据,以确保其他元框中没有使用来自子帖子的数据。这些其他元框可能包括slug框,这就是为什么使用子slug。
使命感wp_reset_postdata
在你的元框的末尾应该可以做到这一点。
EDIT 2:
我不知道为什么
wp_reset_postdata()
不起作用,但可能是由于编辑页面上的某些原因,post数据不在主查询对象中。
无论如何,问题确实存在于您自己通过setup_postdata
. 对子帖子执行此操作后,slug或title字段似乎通过使用全局$post
对象,因此用子段塞或标题填充。
要解决此问题,可以在调用之前存储旧的post对象setup_postdata
, 和使用setup_postdata
之后,要恢复旧的post对象,请执行以下操作:
function reference_meta_callback( $post ){
global $post;
// Store global post object
$post_old = $post;
$custom = get_post_custom($post->ID);
if( isset($custom[\'reference_id\'][0]) ) {
$reference_id = $custom[\'reference_id\'][0];
} else {
$reference_id = \'0\';
}
wp_nonce_field( \'my_meta_box_nonce\', \'meta_box_nonce\' );
?>
<select name="ref_id" id="ref_id">
<option value="0" <?php selected($reference_id, \'0\'); ?>>- choose client -</option>
<?php
$args = array( \'numberposts\' => -1, \'post_type\' => \'page\', \'post_parent\' => 21);
$posts = get_posts( $args );
foreach( $posts as $post ) : setup_postdata( $post ); ?>
<option value="<?php echo $post->ID; ?>" <?php selected($reference_id, $post->ID); ?>><?php the_title(); ?></option>
<?php endforeach; ?>
</select>
<?php
// Restore global post object
$post = $post_old;
setup_postdata( $post );
}