我有一个主题,我把它放在一起,允许用户通过单击一个单选按钮来更改样式。我让这个功能在没有验证回调的情况下工作,但在需要验证的选项页面中添加了文本字段。但是现在样式更改单选按钮不能与验证一起工作(如果我不包含验证代码)。看起来Settings API需要对所有东西进行验证。在谷歌上搜索了两天的解决方案后,我找不到任何答案。我试图找出如何验证单选按钮代码或跳过验证仅对单选按钮。以下是相关代码:
<?php
add_action('admin_init', 'mxs_admin_init');
add_action('admin_menu', 'mxs_admin_add_page');
function mxs_admin_add_page() {
add_theme_page(
'Mixin' Styles Theme Options',
'Mixin' Styles Theme Options',
'manage_options',
'mixinstyles',
'mxs_theme_options_page'
);
}
function mxs_admin_init() {
register_setting(
'mixinstyles_theme_options',
'mixinstyles_theme_options',
'mixinstyles_options_validate'
);
add_settings_section( // Styles section
'mixinstyles_main',
'Mixin' Styles Style Settings',
'mxs_theming_section_text',
'mixinstyles'
);
add_settings_field(
'custom_style_buttons',
'<strong>Color Schemes</strong>',
'mxs_custom_style_buttons',
'mixinstyles',
'mixinstyles_main'
);
...
function mxs_custom_style_buttons() {
$options = get_option('mixinstyles_theme_options');
//var_dump($options); //for debugging
echo "<div class='radiobutton-wrap'> 'n";
echo "<div class='radiobutton-padding'> 'n <input type='radio' id='default_style' value='default_style' name='mixinstyles_theme_options[custom_style_buttons]'" . checked( $options['custom_style_buttons'], 1 ) . " /><img src='" . get_bloginfo('template_directory') . "/images/default_screenshot.png' alt='Default style' /><br /><label for='default_style'>Default Style</label> </div> 'n";
echo "<div class='radiobutton-padding'> 'n <input type='radio' id='blue_orange' value='blue_orange' name='mixinstyles_theme_options[custom_style_buttons]' /><img src='" . get_bloginfo('template_directory') . "/images/blueorange_screenshot.png' alt='Blue/Orange style' /><br /><label for='blue_orange'>Blue/Orange</label> </div> 'n";
echo "<div class='radiobutton-padding'> 'n <input type='radio' id='violet_yellow' value='violet_yellow' name='mixinstyles_theme_options[custom_style_buttons]' /><img src='" . get_bloginfo('template_directory') . "/images/violetyellow_screenshot.png' alt='Violet/Yellow style' /><br /><label for='violet_yellow'>Violet/Yellow</label> </div> 'n";
echo "</div> 'n";
echo "<div class='radiobutton-wrap'> 'n";
echo "<div class='radiobutton-padding'> 'n <input type='radio' id='magenta_green' value='magenta_green' name='mixinstyles_theme_options[custom_style_buttons]' /><img src='" . get_bloginfo('template_directory') . "/images/magentagreen_screenshot.png' alt='Magenta/Green style' /><br /><label for='magenta_green'>Magenta/Green</label></div> 'n";
echo "<div class='radiobutton-padding'> 'n <input type='radio' id='orange_blue' value='orange_blue' name='mixinstyles_theme_options[custom_style_buttons]' /><img src='" . get_bloginfo('template_directory') . "/images/orangeblue_screenshot.png' alt='Orange/Blue style' /><br /><label for='orange_blue'>Orange/Blue</label></div> 'n";
echo "<div class='radiobutton-padding'> 'n <input type='radio' id='yellow_violet' value='yellow_violet' name='mixinstyles_theme_options[custom_style_buttons]' /><img src='" . get_bloginfo('template_directory') . "/images/yellowviolet_screenshot.png' alt='Yellow/Violet style' /><br /><label for='yellow_violet'>Yellow/Violet</label></div> 'n";
echo "</div> 'n";
}
...
function mxs_style_switcher() {
global $mixinstyles_theme_options;
$options = get_option('mixinstyles_theme_options');
switch ( $options['custom_style_buttons'] ) { //opens switch statement
case "blue_orange":
echo '<link rel="stylesheet" href="';
bloginfo('template_directory');
echo '/custom-styles/blue-orange.css" type="text/css" />' . "'n";
break;
case "violet_yellow":
echo '<link rel="stylesheet" href="';
bloginfo('template_directory');
echo '/custom-styles/violet-yellow.css" type="text/css" />' . "'n";
break;
case "magenta_green":
echo '<link rel="stylesheet" href="';
bloginfo('template_directory');
echo '/custom-styles/magenta-green.css" type="text/css" />' . "'n";
break;
case "orange_blue":
echo '<link rel="stylesheet" href="';
bloginfo('template_directory');
echo '/custom-styles/orange-blue.css" type="text/css" />' . "'n";
break;
case "yellow_violet":
echo '<link rel="stylesheet" href="';
bloginfo('template_directory');
echo '/custom-styles/yellow-violet.css" type="text/css" />' . "'n";
break;
default:
echo '';
} //closes switch statement
}
add_action('wp_head', 'mxs_style_switcher');
...
function mixinstyles_options_validate($input) { //opens mixinstyles_options_validate function
$options = get_option('mixinstyles_theme_options');
//for each radio button
//default
$options['default_style'] = $input['default_style'];
if ( !isset( $input['default_style'] ) ) {
}
//blue orange
$options['blue_orange'] = $input['blue_orange'];
if ( !isset( $input['blue_orange'] ) ) {
}
//violet yellow
$options['violet_yellow'] = $input['violet_yellow'];
if ( !isset( $input['violet_yellow'] ) ) {
}
//magenta green
$options['magenta_green'] = $input['magenta_green'];
if ( !isset( $input['magenta_green'] ) ) {
}
//orange blue
$options['orange_blue'] = $input['orange_blue'];
if ( !isset( $input['orange_blue'] ) ) {
}
//yellow violet
$options['yellow_violet'] = $input['yellow_violet'];
if ( !isset( $input['yellow_violet'] ) ) {
}
return $options;
}
?>
我在函数中对一个复选框进行了类似的验证,如下所示:
//check if checkbox has been checked
$options['remove_blogtitle'] = $input['remove_blogtitle'];
if ( !isset( $input['remove_blogtitle'] ) ) {
$input['remove_blogtitle'] = null;
}
我已经尝试了这个与单选按钮,但它不工作
我找到了一种将单选按钮列入白名单以进行验证的方法,尽管我不确定这些单选按钮是否确实得到了验证。我将整个单选按钮组设置为null,如下所示:
$options['custom_style_buttons'] = $input['custom_style_buttons'];
if ( !isset( $input['custom_style_buttons'] ) ) {
$input['custom_style_buttons'] = null;
}
如果有人有更好的方法,我愿意接受建议。