测试Wordpress`update_option()中的错误

时间:2012-04-04 20:02:03

标签: wordpress wordpress-theming

对于所有专家WP主题开发人员,当使用多个update_option()时,有没有办法测试任何更新是否无效(无论是通过连接错误还是通过验证),因此会抛出错误?如果出现错误,是否可以忽略所有以前的update_option()代码?

谢谢你们!

1 个答案:

答案 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' );

是的,选项表已经存在。我的意思是,不是为每个主题选项在选项表中生成新条目,而是将它们全部包装在一个选项条目中。这也使得更容易验证选项数据。