我创建了一个小插件,用户可以通过单击Add New
从元框链接并删除它们。用户可以使用Set featured image
链接以从媒体库中选择特色图像。这个Add New
链接克隆(使用javascript)以前的元框(使用适当的过滤器)以创建新的元框,而“删除”按钮将删除元框。
Problem and Questions
<对于生成的每个元框,我当前只使用单个nonce字段。许多以前的线程建议应该为每个元框添加新的nonce字段。如果使用javascript克隆框,如何创建不同的nonce字段?我应该使用AJAX吗?或者,在这种情况下,是否有必要使用nonce字段,因为用户只能从媒体库中选择图像?
元框中的隐藏输入字段用作数组(请参见元框的html),并使用update_post_meta
. 如果为每个动态添加的元框添加了nonce字段,那么在保存帖子时如何检查它?
if ( !wp_verify_nonce( noncefields..., plugin_basename(__FILE__) ) ) {
return;
}
元框的html如下所示。
<?php wp_nonce_field( plugin_basename(__FILE__), \'dfi_fimageplug\'); //this is generated only once for all meta box ?>
<a href="javascript:void(0)" class=\'dfiFeaturedImage\'><?php _e(\'Set featured image\', \'ap_dfi_dynamic-featured-image\') ?></a><br/>
<img src="<?php if( !empty($featuredImgTrimmed) ) echo site_url() . $featuredImgTrimmed ?>" class=\'dfiImg <?php if( is_null($featuredImgTrimmed) ) echo \'dfiImgEmpty\' ?>\'/>
<div class=\'dfiLinks\'>
<a href="javascript:void(0)" data-id=\'<?php echo $featuredId ?>\' class=\'dfiAddNew\'><?php _e(\'Add New\', \'ap_dfi_dynamic-featured-image\') ?></a>
<a href="javascript:void(0)" class=\'dfiRemove\'><?php _e(\'Remove\', \'ap_dfi_dynamic-featured-image\') ?></a>
</div>
<div class=\'dfiClearFloat\'></div>
<input type=\'hidden\' name="dfiFeatured[]" value="<?php echo $featuredImg ?>" />
我在插件开发方面不是很有经验,在这件事上我真的很困惑。请提出建议。
最合适的回答,由SO网友:Twifty 整理而成
nonce是一次性使用寿命有限的唯一数字。您可以克隆它们,但您将看到的问题是,一旦发送回服务器并进行验证,其他克隆将变得无效。
你有几种方法来处理这个问题。
在服务器上生成所有框并丢弃Javascript使用Ajax为每个克隆的框请求一个新的nonce我的首选是使用Ajax请求服务器创建克隆无论哪种方式,您的临时邮件都需要来自服务器。WP处理此问题的方法(例如,对于其类别元盒)是从taxonomy
名称您可以为此使用post值或图像名称。
<?php wp_nonce_field(\'add-\' . $name, \'add-\' . $name . \'_nonce\', false); ?>
执行此操作还需要存储
$name
在页面上的隐藏字段中。
<input id="<?php echo $name; ?>" type="hidden" value="add-<?php echo $name; ?>" />
在Ajax中,将唯一名称和nonce都发送回服务器,验证并返回您想要的任何内容。
至于你的另一个问题“现在有必要吗?”。那要看情况了。我建议,任何时候您都可以从表单数据更改数据库,那么是的,它们是必需的。如果您只是在检索数据,那么不,它们不是。但它们在使可能已被书签或缓存在某处的请求无效时仍然有用。我记不清了,我想他们的寿命大约是12个小时。