更新自定义帖子类型的帖子元数据

时间:2011-01-13 作者:Zack

我正在为work(still)编写一个插件,还有一个问题。

我已经根据需要添加了我的元框。然而,我遇到的问题发生在保存帖子时。我的节俭片段来自this post. 我也得到了类似的答案here, 但它只是因为某种原因不起作用/

  protected function __update_post_meta( $post_id, $field_name, $value = \'\' )
  {
   if ( empty( $value ) OR ! $value )
   {
    delete_post_meta( $post_id, $field_name );
   }
   elseif ( ! get_post_meta( $post_id, $field_name ) )
   {
    add_post_meta( $post_id, $field_name, $value );
   }
   else
   {
    update_post_meta( $post_id, $field_name, $value );
   }
  }
使用以下函数调用上述函数。然而,我现在想起来,我不确定我的问题在于实际储蓄。我想可能是nonce 这可能会把它扔掉。

  public function _wp_save_post( $post_id, $post )
  {
   if ( empty($_POST)
     OR !isset($_POST[\'argus_edit_visitor\'])
     OR !wp_verify_nonce( $_POST[\'argus_edit_visitor\'], \'argus_edit_visitor\' ) )
   {
    return $post->ID;
   }

   if ( ! current_user_can( \'edit_post\', $post->ID ) ) return $post->ID;

   // v_f_name | v_l_name | v_workstation | v_id
   // Argh!

   $this->__update_post_meta( $post->ID, \'v_f_name\', $_POST[\'v_f_name\'] );
   $this->__update_post_meta( $post->ID, \'v_l_name\', $_POST[\'v_l_name\'] );
   $this->__update_post_meta( $post->ID, \'v_workstation\', $_POST[\'v_workstation\'] );
   $this->__update_post_meta( $post->ID, \'v_id\', $_POST[\'v_id\'] );
  }
nonce的用法如下所示:<input type="hidden" name="argus_edit_visitor" id="argus_edit_visitor" value="{$nonce}" /> 并使用$nonce = wp_create_nonce( plugin_basename( __FILE__ ) );. 输入字段位于存储在变量$html中的html块内部。Stackexchange正在解析我的html,否则我会将其粘贴到这里。

-扎克

EDIT: 刚刚测试了一下is 临时官员的过错
EDIT2: 我的拼写错误,但仍然不起作用。

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

我真的很喜欢你干净的类结构:-),但我有一个建议可以解决问题(基于我上周末构建的插件中的nonce和meta-box的经验):

Don\'t try to create the nonce field manually. 您当前拥有:

$nonce = wp_create_nonce( plugin_basename( __FILE__ ) );

...

<input type="hidden" name="argus_edit_visitor" id="argus_edit_visitor" value="{$nonce}" />
创建此字段的标准方法是使用WordPress\'wp_nonce_field() 作用它将为您添加隐藏字段:

wp_nonce_field( __FILE__, \'argus_edit_visitor\' );

Verifying the nonce

您正在根据错误的字符串进行验证。在代码中,您使用__FILE__ 但你用字符串验证argus_edit_vistor. 您有:

if ( empty($_POST)
    OR !isset($_POST[\'argus_edit_visitor\'])
    OR !wp_verify_nonce( $_POST[\'argus_edit_visitor\'], \'argus_edit_visitor\' ) )
    {
        echo "Erm. Why?";
        return $post->ID;
    }
您应该具备:

if ( empty($_POST)
    OR !isset($_POST[\'argus_edit_visitor\'])
    OR !wp_verify_nonce( $_POST[\'argus_edit_visitor\'], __FILE__ ) )
    {
        echo "Erm. Why?";
        return $post->ID;
    }
我通常使用plugin_basename(__FILE__) 创建nonce时。但是,只要nonce创建和nonce验证发生在同一个文件中,您就不应该以自己的方式遇到问题。

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?