我主要基於Twenty Eleven主題創建了一個自定義主題。我試圖添加主題選項。在主題選項頁面上,我爲「標題字體系列」和「常規字體系列」創建了一個文本字段,用戶應該能夠用任何字體系列替換默認字體,以便更改其字體主題。默認值工作(向站點添加CSS代碼),但如果我嘗試更改文本框中的文本,則新的設置將不會保存,並且默認選項將重新加載到選項頁面的文本框中。其他非文本框選項將在更改後正確更新。WordPress的主題選項不會保存
下面是theme-options.php的代碼。任何幫助非常感謝,如果有必要,我可以提供更多的代碼(options.php?functions.php?)。
<?php
/**
* Somewhere In Between Theme Options
*
* @package WordPress
* @subpackage Somewhere_In_Between
* @since Somewhere In Between 1.0
*/
/**
* Properly enqueue styles and scripts for our theme options page.
*
* This function is attached to the admin_enqueue_scripts action hook.
*
* @since Somewhere In Between 1.0
*
*/
function somewhereinbetween_admin_enqueue_scripts($hook_suffix) {
wp_enqueue_style('somewhereinbetween-theme-options', get_template_directory_uri() . '/inc/theme-options.css', false, '2011-04-28');
wp_enqueue_script('somewhereinbetween-theme-options', get_template_directory_uri() . '/inc/theme-options.js', array('farbtastic'), '2011-06-10');
wp_enqueue_style('farbtastic');
}
add_action('admin_print_styles-appearance_page_theme_options', 'somewhereinbetween_admin_enqueue_scripts');
/**
* Register the form setting for our somewhereinbetween_options array.
*
* This function is attached to the admin_init action hook.
*
* This call to register_setting() registers a validation callback, somewhereinbetween_theme_options_validate(),
* which is used when the option is saved, to ensure that our option values are complete, properly
* formatted, and safe.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_theme_options_init() {
register_setting(
'somewhereinbetween_options', // Options group, see settings_fields() call in somewhereinbetween_theme_options_render_page()
'somewhereinbetween_theme_options', // Database option, see somewhereinbetween_get_theme_options()
'somewhereinbetween_theme_options_validate' // The sanitization callback, see somewhereinbetween_theme_options_validate()
);
// Register our settings field group
add_settings_section(
'general', // Unique identifier for the settings section
'', // Section title (we don't want one)
'__return_false', // Section callback (we don't want anything)
'theme_options' // Menu slug, used to uniquely identify the page; see somewhereinbetween_theme_options_add_page()
);
// Register our individual settings fields
add_settings_field('header_font_family', __('Header Font Family', 'somewhereinbetween'), 'somewhereinbetween_settings_field_header_font_family', 'theme_options', 'general');
add_settings_field('general_font_family', __('General Font Family', 'somewhereinbetween'), 'somewhereinbetween_settings_field_general_font_family', 'theme_options', 'general');
add_settings_field('link_color', __('Link Color', 'somewhereinbetween'), 'somewhereinbetween_settings_field_link_color', 'theme_options', 'general');
add_settings_field('layout', __('Default Layout', 'somewhereinbetween'), 'somewhereinbetween_settings_field_layout', 'theme_options', 'general');
}
add_action('admin_init', 'somewhereinbetween_theme_options_init');
/**
* Change the capability required to save the 'somewhereinbetween_options' options group.
*
* @see somewhereinbetween_theme_options_init() First parameter to register_setting() is the name of the options group.
* @see somewhereinbetween_theme_options_add_page() The edit_theme_options capability is used for viewing the page.
*
* By default, the options groups for all registered settings require the manage_options capability.
* This filter is required to change our theme options page to edit_theme_options instead.
* By default, only administrators have either of these capabilities, but the desire here is
* to allow for finer-grained control for roles and users.
*
* @param string $capability The capability used for the page, which is manage_options by default.
* @return string The capability to actually use.
*/
function somewhereinbetween_option_page_capability($capability) {
return 'edit_theme_options';
}
add_filter('option_page_capability_somewhereinbetween_options', 'somewhereinbetween_option_page_capability');
/**
* Add our theme options page to the admin menu, including some help documentation.
*
* This function is attached to the admin_menu action hook.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_theme_options_add_page() {
$theme_page = add_theme_page(
__('Theme Options', 'somewhereinbetween'), // Name of page
__('Theme Options', 'somewhereinbetween'), // Label in menu
'edit_theme_options', // Capability required
'theme_options', // Menu slug, used to uniquely identify the page
'somewhereinbetween_theme_options_render_page' // Function that renders the options page
);
if (! $theme_page)
return;
add_action("load-$theme_page", 'somewhereinbetween_theme_options_help');
}
add_action('admin_menu', 'somewhereinbetween_theme_options_add_page');
function somewhereinbetween_theme_options_help() {
$help = '<p>' . __('Some themes provide customization options that are grouped together on a Theme Options screen. If you change themes, options may change or disappear, as they are theme-specific. Your current theme, Somewhere In Between, provides the following Theme Options:', 'somewhereinbetween') . '</p>' .
'<ol>' .
'<li>' . __('<strong>Link Color</strong>: You can choose the color used for text links on your site. You can enter the HTML color or hex code, or you can choose visually by clicking the "Select a Color" button to pick from a color wheel.', 'somewhereinbetween') . '</li>' .
'<li>' . __('<strong>Default Layout</strong>: You can choose if you want your site’s default layout to have a sidebar on the left or the right.', 'somewhereinbetween') . '</li>' .
'</ol>' .
'<p>' . __('Remember to click "Save Changes" to save any changes you have made to the theme options.', 'somewhereinbetween') . '</p>';
$sidebar = '<p><strong>' . __('For more information:', 'somewhereinbetween') . '</strong></p>' .
'<p>' . __('<a href="http://codex.wordpress.org/Appearance_Theme_Options_Screen" target="_blank">Documentation on Theme Options</a>', 'somewhereinbetween') . '</p>' .
'<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>', 'somewhereinbetween') . '</p>';
$screen = get_current_screen();
if (method_exists($screen, 'add_help_tab')) {
// WordPress 3.3
$screen->add_help_tab(array(
'title' => __('Overview', 'somewhereinbetween'),
'id' => 'theme-options-help',
'content' => $help,
)
);
$screen->set_help_sidebar($sidebar);
} else {
// WordPress 3.2
add_contextual_help($screen, $help . $sidebar);
}
}
/**
* Returns an array of color schemes registered for Somewhere In Between.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_color_schemes() {
$color_scheme_options = array(
'light' => array(
'value' => 'light',
'label' => __('Light', 'somewhereinbetween'),
'thumbnail' => get_template_directory_uri() . '/inc/images/light.png',
'default_link_color' => '#1b8be0',
'default_header_font_family' => 'Futura, "Trebuchet MS", Arial, sans-serif',
'default_general_font_family' => 'Verdana, Arial, Helvetica, sans-serif',
),
'dark' => array(
'value' => 'dark',
'label' => __('Dark', 'somewhereinbetween'),
'thumbnail' => get_template_directory_uri() . '/inc/images/dark.png',
'default_link_color' => '#e4741f',
'default_header_font_family' => 'Futura, "Trebuchet MS", Arial, sans-serif',
'default_general_font_family' => 'Verdana, Arial, Helvetica, sans-serif',
),
);
return apply_filters('somewhereinbetween_color_schemes', $color_scheme_options);
}
/**
* Returns an array of layout options registered for Somewhere In Between.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_layouts() {
$layout_options = array(
'content-sidebar' => array(
'value' => 'content-sidebar',
'label' => __('Content on left', 'somewhereinbetween'),
'thumbnail' => get_template_directory_uri() . '/inc/images/content-sidebar.png',
),
'sidebar-content' => array(
'value' => 'sidebar-content',
'label' => __('Content on right', 'somewhereinbetween'),
'thumbnail' => get_template_directory_uri() . '/inc/images/sidebar-content.png',
),
);
return apply_filters('somewhereinbetween_layouts', $layout_options);
}
/**
* Returns the default options for Somewhere In Between.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_get_default_theme_options() {
$default_theme_options = array(
'color_scheme' => 'light',
'link_color' => somewhereinbetween_get_default_link_color('light'),
'header_font_family' => somewhereinbetween_get_default_header_font_family('light'),
'general_font_family' => somewhereinbetween_get_default_general_font_family('light'),
'theme_layout' => 'content-sidebar',
);
if (is_rtl())
$default_theme_options['theme_layout'] = 'sidebar-content';
return apply_filters('somewhereinbetween_default_theme_options', $default_theme_options);
}
/**
* Returns the default link color for Somewhere In Between, based on color scheme.
*
* @since Somewhere In Between 1.0
*
* @param $string $color_scheme Color scheme. Defaults to the active color scheme.
* @return $string Color.
*/
function somewhereinbetween_get_default_link_color($color_scheme = null) {
if (null === $color_scheme) {
$options = somewhereinbetween_get_theme_options();
$color_scheme = $options['color_scheme'];
}
$color_schemes = somewhereinbetween_color_schemes();
if (! isset($color_schemes[ $color_scheme ]))
return false;
return $color_schemes[ $color_scheme ]['default_link_color'];
}
/**
* Returns the default header font family for Somewhere In Between, based on color scheme.
*
* @since Somewhere In Between 1.0
*
* @param $string $color_scheme Color scheme. Defaults to the active color scheme.
* @return $string Color.
*/
function somewhereinbetween_get_default_header_font_family($color_scheme = null) {
if (null === $color_scheme) {
$options = somewhereinbetween_get_theme_options();
$color_scheme = $options['color_scheme'];
}
$color_schemes = somewhereinbetween_color_schemes();
if (! isset($color_schemes[ $color_scheme ]))
return false;
return $color_schemes[ $color_scheme ]['default_header_font_family'];
}
/**
* Returns the default general font family for Somewhere In Between, based on color scheme.
*
* @since Somewhere In Between 1.0
*
* @param $string $color_scheme Color scheme. Defaults to the active color scheme.
* @return $string Color.
*/
function somewhereinbetween_get_default_general_font_family($color_scheme = null) {
if (null === $color_scheme) {
$options = somewhereinbetween_get_theme_options();
$color_scheme = $options['color_scheme'];
}
$color_schemes = somewhereinbetween_color_schemes();
if (! isset($color_schemes[ $color_scheme ]))
return false;
return $color_schemes[ $color_scheme ]['default_general_font_family'];
}
/**
* Returns the options array for Somewhere In Between.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_get_theme_options() {
return get_option('somewhereinbetween_theme_options', somewhereinbetween_get_default_theme_options());
}
/**
* Renders the Color Scheme setting field.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_settings_field_color_scheme() {
$options = somewhereinbetween_get_theme_options();
foreach (somewhereinbetween_color_schemes() as $scheme) {
?>
<div class="layout image-radio-option color-scheme">
<label class="description">
<input type="radio" name="somewhereinbetween_theme_options[color_scheme]" value="<?php echo esc_attr($scheme['value']); ?>" <?php checked($options['color_scheme'], $scheme['value']); ?> />
<input type="hidden" id="default-color-<?php echo esc_attr($scheme['value']); ?>" value="<?php echo esc_attr($scheme['default_link_color']); ?>" />
<input type="hidden" id="default-header-font-family-<?php echo esc_attr($scheme['value']); ?>" value="<?php echo esc_attr($scheme['default_header_font_family']); ?>" />
<input type="hidden" id="default-general-font-family-<?php echo esc_attr($scheme['value']); ?>" value="<?php echo esc_attr($scheme['default_general_font_family']); ?>" />
<span>
<img src="<?php echo esc_url($scheme['thumbnail']); ?>" width="136" height="122" alt="" />
<?php echo $scheme['label']; ?>
</span>
</label>
</div>
<?php
}
}
/**
* Renders the Link Color setting field.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_settings_field_link_color() {
$options = somewhereinbetween_get_theme_options();
?>
<input type="text" name="somewhereinbetween_theme_options[link_color]" id="link-color" value="<?php echo esc_attr($options['link_color']); ?>" />
<a href="#" class="pickcolor hide-if-no-js" id="link-color-example"></a>
<input type="button" class="pickcolor button hide-if-no-js" value="<?php esc_attr_e('Select a Color', 'somewhereinbetween'); ?>" />
<div id="colorPickerDiv" style="z-index: 100; background:#eee; border:1px solid #ccc; position:absolute; display:none;"></div>
<br />
<span><?php printf(__('Default color: %s', 'somewhereinbetween'), '<span id="default-color">' . somewhereinbetween_get_default_link_color($options['color_scheme']) . '</span>'); ?></span>
<?php
}
/**
* Renders the Header Font Family setting field.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_settings_field_header_font_family() {
$options = somewhereinbetween_get_theme_options();
?>
<input type="text" name="somewhereinbetween_theme_options[header_font_family]" id="header-font-family" value="<?php echo esc_attr($options['header_font_family']); ?>" />
<br />
<span><?php printf(__('Default header font family: %s', 'somewhereinbetween'), '<span id="default-header-font-family">' . somewhereinbetween_get_default_header_font_family ($options['color_scheme']) . '</span>'); ?></span>
<?php
}
/**
* Renders the General Font Family setting field.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_settings_field_general_font_family() {
$options = somewhereinbetween_get_theme_options();
?>
<input type="text" name="somewhereinbetween_theme_options[general_font_family]" id="general-font-family" value="<?php echo esc_attr($options['general_font_family']); ?>" />
<br />
<span><?php printf(__('Default general font family: %s', 'somewhereinbetween'), '<span id="default-general-font-family">' . somewhereinbetween_get_default_general_font_family ($options['color_scheme']) . '</span>'); ?></span>
<?php
}
/**
* Renders the Layout setting field.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_settings_field_layout() {
$options = somewhereinbetween_get_theme_options();
foreach (somewhereinbetween_layouts() as $layout) {
?>
<div class="layout image-radio-option theme-layout">
<label class="description">
<input type="radio" name="somewhereinbetween_theme_options[theme_layout]" value="<?php echo esc_attr($layout['value']); ?>" <?php checked($options['theme_layout'], $layout['value']); ?> />
<span>
<img src="<?php echo esc_url($layout['thumbnail']); ?>" width="136" height="122" alt="" />
<?php echo $layout['label']; ?>
</span>
</label>
</div>
<?php
}
}
/**
* Returns the options array for Somewhere In Between.
*
* @since Somewhere In Between 1.2
*/
function somewhereinbetween_theme_options_render_page() {
?>
<div class="wrap">
<?php screen_icon(); ?>
<?php $theme_name = function_exists('wp_get_theme') ? wp_get_theme() : get_current_theme(); ?>
<h2><?php printf(__('%s Theme Options', 'somewhereinbetween'), $theme_name); ?></h2>
<?php settings_errors(); ?>
<form method="post" action="options.php">
<?php
settings_fields('somewhereinbetween_options');
do_settings_sections('theme_options');
submit_button();
?>
</form>
</div>
<?php
}
/**
* Sanitize and validate form input. Accepts an array, return a sanitized array.
*
* @see somewhereinbetween_theme_options_init()
* @todo set up Reset Options action
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_theme_options_validate($input) {
$output = $defaults = somewhereinbetween_get_default_theme_options();
// Color scheme must be in our array of color scheme options
if (isset($input['color_scheme']) && array_key_exists($input['color_scheme'], somewhereinbetween_color_schemes()))
$output['color_scheme'] = $input['color_scheme'];
// Our defaults for the header/general font families andlink color may have changed, based on the color scheme.
$output['link_color'] = $defaults['link_color'] = somewhereinbetween_get_default_link_color($output['color_scheme']);
// Link color must be 3 or 6 hexadecimal characters
if (isset($input['link_color']) && preg_match('/^#?([a-f0-9]{3}){1,2}$/i', $input['link_color']))
$output['link_color'] = '#' . strtolower(ltrim($input['link_color'], '#'));
// Theme layout must be in our array of theme layout options
if (isset($input['theme_layout']) && array_key_exists($input['theme_layout'], somewhereinbetween_layouts()))
$output['theme_layout'] = $input['theme_layout'];
return apply_filters('somewhereinbetween_theme_options_validate', $output, $input, $defaults);
}
/**
* Enqueue the styles for the current color scheme.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_enqueue_color_scheme() {
$options = somewhereinbetween_get_theme_options();
$color_scheme = $options['color_scheme'];
if ('dark' == $color_scheme)
wp_enqueue_style('dark', get_template_directory_uri() . '/colors/dark.css', array(), null);
do_action('somewhereinbetween_enqueue_color_scheme', $color_scheme);
}
add_action('wp_enqueue_scripts', 'somewhereinbetween_enqueue_color_scheme');
/**
* Add a style block to the theme for the current link color.
*
* This function is attached to the wp_head action hook.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_print_link_color_style() {
$options = somewhereinbetween_get_theme_options();
$link_color = $options['link_color'];
$default_options = somewhereinbetween_get_default_theme_options();
// Don't do anything if the current link color is the default.
if ($default_options['link_color'] == $link_color)
return;
?>
<style>
/* Link color */
a,
#site-title a:focus,
#site-title a:hover,
#site-title a:active,
.entry-title a:hover,
.entry-title a:focus,
.entry-title a:active,
.widget_somewhereinbetween_ephemera .comments-link a:hover,
section.recent-posts .other-recent-posts a[rel="bookmark"]:hover,
section.recent-posts .other-recent-posts .comments-link a:hover,
.format-image footer.entry-meta a:hover,
#site-generator a:hover, #access ul a:hover
{ color: <?php echo $link_color; ?>; }
section.recent-posts .other-recent-posts .comments-link a:hover {
border-color: <?php echo $link_color; ?>;
}
article.feature-image.small .entry-summary p a:hover,
.entry-header .comments-link a:hover,
.entry-header .comments-link a:focus,
.entry-header .comments-link a:active,
.feature-slider a.active {
background-color: <?php echo $link_color; ?>;
}
</style>
<?php
}
add_action('wp_head', 'somewhereinbetween_print_link_color_style');
/**
* Add a style block to the theme for the current header font family.
*
* This function is attached to the wp_head action hook.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_print_header_font_family() {
$options = somewhereinbetween_get_theme_options();
$header_font_family = $options['header_font_family'];
$default_options = somewhereinbetween_get_default_theme_options();
?>
<style>
/* Header font family */
h1,h2,h3,h4,h5,h6, #access,
#site-title,
.entry-title,
{ font-family: <?php echo $header_font_family; ?>; }
</style>
<?php
}
add_action('wp_head', 'somewhereinbetween_print_header_font_family');
/**
* Add a style block to the theme for the current general font family.
*
* This function is attached to the wp_head action hook.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_print_general_font_family() {
$options = somewhereinbetween_get_theme_options();
$general_font_family = $options['general_font_family'];
$default_options = somewhereinbetween_get_default_theme_options();
?>
<style>
/* General font family */
#page
{ font-family: <?php echo $general_font_family; ?>; }
</style>
<?php
}
add_action('wp_head', 'somewhereinbetween_print_general_font_family');
/**
* Adds Somewhere In Between layout classes to the array of body classes.
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_layout_classes($existing_classes) {
$options = somewhereinbetween_get_theme_options();
$current_layout = $options['theme_layout'];
if (in_array($current_layout, array('content-sidebar', 'sidebar-content')))
$classes = array('two-column');
else
$classes = array('one-column');
if ('content-sidebar' == $current_layout)
$classes[] = 'right-sidebar';
elseif ('sidebar-content' == $current_layout)
$classes[] = 'left-sidebar';
else
$classes[] = $current_layout;
$classes = apply_filters('somewhereinbetween_layout_classes', $classes, $current_layout);
return array_merge($existing_classes, $classes);
}
add_filter('body_class', 'somewhereinbetween_layout_classes');
/**
* Implements Somewhere In Between theme options into Theme Customizer
*
* @param $wp_customize Theme Customizer object
* @return void
*
* @since Somewhere In Between 1.0
*/
function somewhereinbetween_customize_register($wp_customize) {
$wp_customize->get_setting('blogname')->transport = 'postMessage';
$wp_customize->get_setting('blogdescription')->transport = 'postMessage';
$options = somewhereinbetween_get_theme_options();
$defaults = somewhereinbetween_get_default_theme_options();
$wp_customize->add_setting('somewhereinbetween_theme_options[color_scheme]', array(
'default' => $defaults['color_scheme'],
'type' => 'option',
'capability' => 'edit_theme_options',
));
$schemes = somewhereinbetween_color_schemes();
$choices = array();
foreach ($schemes as $scheme) {
$choices[ $scheme['value'] ] = $scheme['label'];
}
// Link Color (added to Color Scheme section in Theme Customizer)
$wp_customize->add_setting('somewhereinbetween_theme_options[link_color]', array(
'default' => somewhereinbetween_get_default_link_color($options['color_scheme']),
'type' => 'option',
'sanitize_callback' => 'sanitize_hex_color',
'capability' => 'edit_theme_options',
));
$wp_customize->add_control(new WP_Customize_Color_Control($wp_customize, 'link_color', array(
'label' => __('Link Color', 'somewhereinbetween'),
'section' => 'colors',
'settings' => 'somewhereinbetween_theme_options[link_color]',
)));
$wp_customize->add_setting('somewhereinbetween_theme_options[header_font_family]', array(
'default' => somewhereinbetween_get_default_header_font_family($options['color_scheme']),
'type' => 'option',
'sanitize_callback' => 'sanitize_key',
'capability' => 'edit_theme_options',
));
$wp_customize->add_setting('somewhereinbetween_theme_options[general_font_family]', array(
'default' => somewhereinbetween_get_default_general_font_family($options['color_scheme']),
'type' => 'option',
'sanitize_callback' => 'sanitize_key',
'capability' => 'edit_theme_options',
));
// Default Layout
$wp_customize->add_section('somewhereinbetween_layout', array(
'title' => __('Layout', 'somewhereinbetween'),
'priority' => 50,
));
$wp_customize->add_setting('somewhereinbetween_theme_options[theme_layout]', array(
'type' => 'option',
'default' => $defaults['theme_layout'],
'sanitize_callback' => 'sanitize_key',
));
$layouts = somewhereinbetween_layouts();
$choices = array();
foreach ($layouts as $layout) {
$choices[$layout['value']] = $layout['label'];
}
$wp_customize->add_control('somewhereinbetween_theme_options[theme_layout]', array(
'section' => 'somewhereinbetween_layout',
'type' => 'radio',
'choices' => $choices,
));
}
add_action('customize_register', 'somewhereinbetween_customize_register');
/**
* Bind JS handlers to make Theme Customizer preview reload changes asynchronously.
* Used with blogname and blogdescription.
*
* @since Somewhere In Between 1.3
*/
function somewhereinbetween_customize_preview_js() {
wp_enqueue_script('somewhereinbetween-customizer', get_template_directory_uri() . '/inc/theme-customizer.js', array('customize-preview'), '20120523', true);
}
add_action('customize_preview_init', 'somewhereinbetween_customize_preview_js');
旁註:「任何字體家族」可能會導致這些字體不會顯示給所有用戶,只有幸運的人才能在他們的機器上擁有它們(並且命名正確) –
這是一個非常明確的要求我爲此構建了主題。我已經解釋了更改字體系列的問題,但這正是他們想要的。 –