web-dev-qa-db-ja.com

オプションページでデフォルトでチェックされているようにチェックボックスを設定します

テーマ設定ページを作成しているので、チェックボックスオプションのコーディングを開始するときに、デフォルト値がuncheckedであれば問題なく動作します。これがコードです:

function classy_show_resume_section_callback () {
    $options = get_option( 'classy_general_settings' );
    $html = "<label class='switch'>";

    if ( empty( $options['classy_show_resume'] ) ) $options['classy_show_resume'] = 0;

    $html .= "<input type='checkbox' name='classy_general_settings[classy_show_resume]' value='1' " . checked($options['classy_show_resume'], 1, false) . " >";

    $html .= "<div class='slider round'></div>";
    $html .= "</label>";

    echo $html;
}

しかし、チェックボックスをデフォルトでcheckedにしたいので、前のコードのif条件を変更する必要がありました。空の場合は、$options変数を1に等しくします。そのため、コードは次のようになります。

function classy_show_resume_section_callback () {
    $options = get_option( 'classy_general_settings' );
    $html = "<label class='switch'>";

    if ( empty( $options['classy_show_resume'] ) ) $options['classy_show_resume'] = 1;

   $html .= "<input type='checkbox' name='classy_general_settings[classy_show_resume]' value='1' " . checked($options['classy_show_resume'], 1, false) . " >";

   $html .= "<div class='slider round'></div>";
   $html .= "</label>";

   echo $html;
}

それでうまくいきました。チェックボックスはデフォルトでcheckedを取得しますが、uncheckedをクリックして保存をクリックすると、データベースで問題が発生しました。正常に動作し、値は削除されましたが、フロントエンドでは、if条件の値が空になったため、実際にはDB内にはありませんがcheckedとして画面に表示されます(競合)。

では、どうすればこの競合を解決できますか?

1
hesham shawky

Option-1: オプションをshowからhideに変更します。

最も簡単な方法はoptionの名前と振る舞いを変更することです。 $options['classy_show_resume']の代わりに、あなたはそれを$options['classy_hide_resume']として実装することができます。

そのため、デフォルトではhide option チェックなし です。つまり、デフォルトで表示されます。このhide optionがチェックされたときにそれを隠します。

そのため、単にオプションの名前を変更してから、(hide optionではなく)show optionをテーマに実装するだけで、簡単に修正できます。

だからあなたのコードはのようになります:

function classy_hide_resume_section_callback () {
    $options = get_option( 'classy_general_settings' );
    $html = "<label class='switch'>";

    if ( empty( $options['classy_hide_resume'] ) ) $options['classy_hide_resume'] = 0;

    $html .= "<input type='checkbox' name='classy_general_settings[classy_hide_resume]' value='1' " . checked($options['classy_hide_resume'], 1, false) . " >";

    $html .= "<div class='slider round'></div>";
    $html .= "</label>";

    echo $html;
}

オプション2: classy_show_resumeをデフォルトでチェックします。

デフォルトでcheckedを指定してclassy_show_resumeを使用する必要がある場合は、次のロジックを使用します。

デフォルトではget_option( 'classy_general_settings' )falseを返すべきで、uncheckedとして保存されたときは空文字列か$options['classy_show_resume']が設定されていない配列になります。そのため、これを使用してデフォルト値と保存されたcheckedまたはunchecked値とを比較します。

これによると、あなたの新しいコードは次のようになります。

function classy_hide_resume_section_callback () {
    $options = get_option( 'classy_general_settings' );
    $classy_show_resume = 0;
    if ( $options === false ) {
        // nothing is set, so apply the default here
        $classy_show_resume = 1;
    }
    else if( is_array( $options ) && isset( $options['classy_show_resume'] ) ) {
        // classy_show_resume is checked
        $classy_show_resume = $options['classy_show_resume'];
    }

    $html = "<label class='switch'>";

    $html .= "<input type='checkbox' name='classy_general_settings[classy_show_resume]' value='1' " . checked( $classy_show_resume, 1, false ) . " >";

    $html .= "<div class='slider round'></div>";
    $html .= "</label>";

    echo $html;
}

これで、デフォルトでチェックされ、正しいcheckedが表示されます。保存後のuncheckedステータス。

1
Fayaz