无法在wp-admin的自定义构建元数据中保存自定义分类术语

时间:2012-02-02 作者:Anthony

我创建了两个自定义分类法,即州和省,但无法将数据保存在wp admin的自定义构建元框中:

<?php function custom_meta_box() {

    remove_meta_box( \'tagsdiv-states\', \'post\', \'side\' );
    remove_meta_box( \'tagsdiv-provinces\', \'post\', \'side\' );

    add_meta_box( \'tagsdiv-states\', \'US States\', \'states_meta_box\', \'post\', \'side\' );
    add_meta_box( \'tagsdiv-provinces\', \'Canada Provinces\', \'provinces_meta_box\', \'post\', \'side\' );

}
add_action(\'add_meta_boxes\', \'custom_meta_box\');

/* Prints the taxonomy box content */
function states_meta_box($post) {

    $tax_name = \'states\';
    $taxonomy = get_taxonomy($tax_name);
?>
<div class="tagsdiv" id="<?php echo $tax_name; ?>">
    <div class="jaxtag">
    <?php 
    // Use nonce for verification
    wp_nonce_field( plugin_basename( __FILE__ ), \'states_noncename\' );
    $states_IDs = wp_get_object_terms( $post_id, \'states\', array(\'fields\' => \'ids\') );
    wp_dropdown_categories(\'taxonomy=states&hide_empty=0&orderby=name&name=states&show_option_none=Select US State&selected=\'.$states_IDs[0]); ?>
    <p class="howto">Select US State</p>
    </div>
</div>
<?php
}

/* When the post is saved, saves our custom taxonomy */
function states_save_postdata( $post_id ) {
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) || wp_is_post_revision( $post_id ) ) 
      return;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST[\'states_noncename\'], plugin_basename( __FILE__ ) ) )
      return;


  // Check permissions
  if ( \'post\' == $_POST[\'post_type\'] ) 
  {
    if ( !current_user_can( \'edit_page\', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( \'edit_post\', $post_id ) )
        return;
  }

  // OK, we\'re authenticated: we need to find and save the data

  $states_ID = $_POST[\'states\'];

  $states = ( $states_ID > 0 ) ? get_term( $states_ID, \'states\' )->slug : NULL;

  wp_set_object_terms(  $post_id , $states, \'states\' );

}
/* Do something with the data entered */
add_action( \'save_post\', \'states_save_postdata\' );


/* Prints the taxonomy box content */
function provinces_meta_box($post) {

    $tax_name = \'provinces\';
    $taxonomy = get_taxonomy($tax_name);
?>
<div class="tagsdiv" id="<?php echo $tax_name; ?>">
    <div class="jaxtag">
    <?php 
    // Use nonce for verification
    wp_nonce_field( plugin_basename( __FILE__ ), \'provinces_noncename\' );
    $provinces_IDs = wp_get_object_terms( $post_id, \'provinces\', array(\'fields\' => \'ids\') );
    wp_dropdown_categories(\'taxonomy=provinces&hide_empty=0&orderby=name&name=provinces&show_option_none=Select Province&selected=\'.$provinces_IDs[0]); ?>
    <p class="howto">Select Canadian Province</p>
    </div>
</div>
<?php
}

/* When the post is saved, saves our custom taxonomy */
function provinces_save_postdata( $post_id ) {
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) || wp_is_post_revision( $post_id ) ) 
      return;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST[\'provinces_noncename\'], plugin_basename( __FILE__ ) ) )
      return;


  // Check permissions
  if ( \'post\' == $_POST[\'post_type\'] ) 
  {
    if ( !current_user_can( \'edit_page\', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( \'edit_post\', $post_id ) )
        return;
  }

  // OK, we\'re authenticated: we need to find and save the data

  $provinces_ID = $_POST[\'provinces\'];

  $provinces = ( $provinces_ID > 0 ) ? get_term( $provinces_ID, \'provinces\' )->slug : NULL;

   wp_set_post_terms(  $post_id , $provinces, \'provinces\' );

}
/* Do something with the data entered */
add_action( \'save_post\', \'provinces_save_postdata\' );?>

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

与其在身份验证检查失败时“返回”,不如使用适当的消息:

例如:

  if ( !wp_verify_nonce( $_POST[\'states_noncename\'], plugin_basename( __FILE__ ) ) )
      wp_die("Nonce-check failure");
这将指示您未通过的检查(如果有)。在大多数情况下,我会建议doing this rather than returning as it gives the user feedback. 显然,您不应该为“自动保存”检查执行此操作,但是,如果很明显希望执行某些操作,但不允许执行,则错误消息比无声失败更可取。

我认为,尽管错误在于权限检查:

  // Check permissions
  if ( \'post\' == $_POST[\'post_type\'] ) 
  {
    if ( !current_user_can( \'edit_page\', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( \'edit_post\', $post_id ) )
        return;
  }
您可以检查该帖子是否为帖子(而不是CPT/页面),然后检查当前用户是否可以编辑该帖子page. 这很可能返回false,因为$post_id 指的是帖子而不是页面。

尝试交换!current_user_cans在附近。正如我上面提到的,“die”消息应该可以帮助您调试它。

最后,虽然与您的问题无关,但您应该make sure your functions do not have generatic names: custom_meta_box - 你应该总是给它们加上一些独特的前缀。如果这不是一般发布的内容,您可能可以,但这只是一个很好的练习。

结束

相关推荐

在短代码中获取Metabox值?

是否可以在该页上执行的短代码中获取该页的元盒值?场景:我每个页面都有一个侧边栏元数据库</我有一些自定义的Gallery快捷码我的gallery快捷码输出600x200幅图像(我在这里使用timthumb)。但如果没有侧栏,我希望它显示900x300。通常我会使用:$sidebar = get_post_meta($post->ID, \'metabox_sidebar\', true); if($sidebar == \"true\") { do something }