问题描述

我正在处理我的自定义帖子类型的管理页面,而我决定是否再次为第二个 metabox 添加一个 nonce 字段。我对于自定义帖子类型非常新鲜,并且在线搜索这一点并不能真正产生很多结果。

有什么想法吗?谢谢。

最佳解决方案

我会推荐的。

您 (并且应该) 拥有自己的随机数,用于检查数据的来源和用户的意图。如果您只有一个代替结构的随机数,那么如果该元组元被删除,则遇到问题 (与隐藏的相同) 。如果删除了第二个 metabox 将 (或至少应该) 永远不会保存,因为随机存取被发送。

当然从安全的角度来看,没有任何东西被第二个随机数添加 – 除非你只希望只更新一个 metabox 而不是另一个:对于动作来说,nonces 应该是唯一的。


Edit

正如所指出的那样,只有一个表单用于后编辑屏幕。因此,理论上,您只需要一个随机数字段来验证数据的动作和起源。然而,因为 metaboxes 可以被删除 – 通过在一个 metabox 中有一个 nonce 字段,不能保证随机数将在那里。通过在每个 metabox 中放置一个 nonce 字段,您可以在处理任何数据之前检查来自该代表变体的数据是否已被发送 (实际上是您认为的) 。例如:

save_post_call_back($post_id){

  //Check this is not an auto-save route

  if(nonce of metabox1 present and valid){
     //Process data from metabox1
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

  if(nonce of metabox2 present and valid){
     //Process data from metabox2
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

}

nonce 字段的名称应该对于 metabox 是唯一的 (而不是与其他 plug-ins 的表单中存在的任何其他随机数冲突) 。

该动作值应该对该动作是唯一的 (这通常应包括数据的来源 (例如 edit-post 而不是 quick-edit)) 。我通常也包括帖子 ID 。

次佳解决方案

你也可以勾选提交框,从不会将 nonce 字段添加到其中

add_action( 'post_submitbox_start', 'theme_submitdiv_extra' );
function theme_submitdiv_extra()
{
  wp_nonce_field( 'theme_meta_box_nonce', 'meta_box_nonce' );
}

然后,在您的 save_post 操作中:

if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'theme_meta_box_nonce' ) ) return;

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。