对于所有专家WP主题开发人员,当使用多个update_option()
时,有没有办法测试任何更新是否无效(无论是通过连接错误还是通过验证),因此会抛出错误?如果出现错误,是否可以忽略所有以前的update_option()
代码?
谢谢你们!
答案 0 :(得分:3)
update_option()将返回false。但是,当选项已设置为您尝试将其更新为的值时,它也会返回false。
因此,您最好首先检查选项是否需要更新或使用get_option存在,然后如果需要更新,请更新它。
如果您的选项未通过验证测试,那么请忽略您正在使用的任何验证功能。你可以抛出一个Wp_Error,但这似乎太侵入了。我倾向于使用add_settings_error并以这种方式向我的用户显示错误。
要回滚以前的任何update_option调用,都需要将以前的值存储在数组中,如果需要还原选项,则需要重新遍历它们。
通常我使用一个选项表条目来处理主题选项或插件选项之类的东西。没有比使用每个设置的新选项污染我的选项表的主题更糟糕了。
编辑:
以下是我如何处理主题选项和插件页面的选项验证。它基于类,所以如果你使用程序方法,你将不得不换掉一些变量。
public function theme_options_validate( $input ) {
if ($_POST['option_page'] != $this->themename.'_options') {
add_settings_error($this->themename.'_theme_options', 'badadmin', __('<h3><strong>Smack your hands!</strong></h3> - You don\'t appear to be an admin! Nothing was saved.', $this->textDom), 'error');
return $input;
}
if ( empty($_POST) && !wp_verify_nonce($_POST[$this->themename.'_options'],'theme_options_validate') ) {
add_settings_error($this->themename.'_theme_options', 'badadmin', __('<h3><strong>Smack your hands!</strong></h3> - You don\'t appear to be an admin! Nothing was saved.', $this->textDom), 'error');
return $input;
}
//begin validation - first get existing options - if any
$init_themeoptions = get_option( $this->themename.'_theme_options' );
//create an array to store new options in
$newInput = array();
//check to see if the author param has been set
if($input[$this->shortname.'_meta-author'] !== '') {
$newInput[$this->shortname.'_meta-author'] = wp_filter_nohtml_kses( $input[$this->shortname.'_meta-author] );
}else{
add_settings_error($this->themename.'_theme_options', 'emptydata', __('Oops - Author cant be empty'.', $this->textDom), 'error');
}
//finally we see if any errors have been generated
if(get_settings_errors($this->themename.'_theme_options')){
//if there are errors, we return our original theme options if they exist, otherwise we return the input data
//this clause handles the situation where you have no theme options because its your themes first run
if($init_themeoptions != false) {
return $init_themeoptions;
}else{
return $input;
}
}
//if there were no errors we return the sanitized $newInput array and indicate successful save of data using settings error class, but
//we don't use the error attribute, which isnt all that intuitiive
add_settings_error($this->themename.'_theme_options', 'updated', __('<em>Success! </em> '.ucfirst($this->themename).' Theme Options updated!', $this->textDom), 'updated');
return $newInput;
}
要在主题选项中显示设置错误,请在生成选项表单的位置添加以下行;
settings_errors( $this->themename.'_theme_options' );
是的,选项表已经存在。我的意思是,不是为每个主题选项在选项表中生成新条目,而是将它们全部包装在一个选项条目中。这也使得更容易验证选项数据。