添加自定义元框时,自定义帖子类型的slug出错

时间:2014-06-25 作者:leymannx

我现在花了几个小时来寻找来回移动的错误。我有一个自定义的帖子类型。在添加自定义元框之前,一切都正常。现在,这位鼻涕虫突然获得了$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\']);
  }
}

1 个回复
最合适的回答,由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 );
} 

结束

相关推荐

post type slug vs page slug

我对我的永久链接有疑问,我想知道是否有人解决了这个问题。基本上我有一个名为videos 还有一个帖子类型名称videos, 因此,我尝试访问/视频,但我没有显示正确的内容。我可以保留视频作为我的页面slug,还可以保留视频/视频帖子类型链接吗???提前感谢。