テーマ設定ページを作成しているので、チェックボックスオプションのコーディングを開始するときに、デフォルト値が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
として画面に表示されます(競合)。
では、どうすればこの競合を解決できますか?
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;
}
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
ステータス。