2012-04-04 6 views
0

すべてのエキスパートWPテーマ開発者のために、update_option()を複数使用すると、(接続エラーやバリデーションによって)アップデートがうまくいかなかったかどうかをテストする方法がありますエラーがスローされますか?そして、エラーがあった場合、以前のすべてのupdate_option()コードは無視される可能性がありますか?Wordpressの `update_option()`のエラーをテストしてください

ありがとうございました!

答えて

3

update_option()は何らかの理由で更新が失敗した場合にfalseを返します。ただし、オプションを既に更新しようとしている値に設定されている場合は、falseを返します。

したがって、オプションを更新する必要があるか、get_optionを使用して存在するかどうかを確認してから、更新する必要がある場合は、更新することをお勧めします。

あなたのオプションがあなたの検証テストに合格しなかった場合は、あなたが使っているどのような検証関数からでも抜け出すだけです。あなたはWp_Errorを投げることができますが、それはあまりにも侵略的なようです。私はadd_settings_errorを使い、その方法でユーザーにエラーを表示する傾向があります。

以前のupdate_option呼び出しをロールバックするには、以前の値を配列に格納し、オプションを復元する必要がある場合はそれらの値を繰り返し戻す必要があります。

私は一般に、テーマオプションやプラグインオプションなどのものを処理するために1つのオプションテーブルエントリを使用します。私のオプションテーブルを汚染するというテーマを得ることよりも悪いことは、それぞれの設定ごとに新しいオプションを付けることです。

編集:

次は私が私のテーマオプションとプラグインページのオプションの検証を処理する方法です。そのクラスに基づいているので、手順的なアプローチを使用している場合は、いくつかの変数を交換する必要があります。

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

はい、オプションテーブルは既に存在します。私は、それぞれのテーマオプションのオプションテーブルに新しいエントリを生成するのではなく、1つのオプションエントリにすべてをラップすることを意味しています。これにより、オプションデータの検証も容易になります。

+0

あなたのコメントでとても多くのことを学びました。これは私がテーマオプションページを作成した初めてのことですので、他の関連する情報を公開することができます。オプションテーブルを持っていることについて最後の段落で述べたことをさらに説明してもらえますか?もう一つはないのですか? – enchance

+0

これは、設定を理解するのに役立ちます。api http://codex.wordpress.org/Settings_API – noponies

関連する問題