2022-01-07 11:15:42 +08:00
|
|
|
<?php
|
|
|
|
|
/**
|
|
|
|
|
* Options Framework
|
|
|
|
|
*
|
|
|
|
|
* @package Options Framework
|
|
|
|
|
* @author Devin Price <devin@wptheming.com>
|
|
|
|
|
* @license GPL-2.0+
|
|
|
|
|
* @link http://wptheming.com
|
|
|
|
|
* @copyright 2010-2014 WP Theming
|
|
|
|
|
*
|
|
|
|
|
* @wordpress-plugin
|
|
|
|
|
* Plugin Name: Options Framework
|
|
|
|
|
* Plugin URI: http://wptheming.com
|
|
|
|
|
* Description: A framework for building theme options.
|
|
|
|
|
* Version: 1.9.1
|
|
|
|
|
* Author: Devin Price
|
|
|
|
|
* Author URI: http://wptheming.com
|
|
|
|
|
* License: GPL-2.0+
|
|
|
|
|
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
|
|
|
|
* Text Domain: optionsframework
|
|
|
|
|
* Domain Path: /languages
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// If this file is called directly, abort.
|
|
|
|
|
if (!defined('WPINC')) {
|
|
|
|
|
die;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Don't load if optionsframework_init is already defined
|
|
|
|
|
if (is_admin() && !function_exists('optionsframework_init')):
|
|
|
|
|
|
|
|
|
|
function optionsframework_init()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// If user can't edit theme options, exit
|
|
|
|
|
if (!current_user_can('edit_theme_options')) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
require get_template_directory() . '/inc/theme-options.php';
|
|
|
|
|
|
|
|
|
|
// Loads the required Options Framework classes.
|
|
|
|
|
require plugin_dir_path(__FILE__) . 'includes/class-options-framework.php';
|
|
|
|
|
require plugin_dir_path(__FILE__) . 'includes/class-options-framework-admin.php';
|
|
|
|
|
require plugin_dir_path(__FILE__) . 'includes/class-options-interface.php';
|
|
|
|
|
require plugin_dir_path(__FILE__) . 'includes/class-options-media-uploader.php';
|
|
|
|
|
require plugin_dir_path(__FILE__) . 'includes/class-options-sanitization.php';
|
|
|
|
|
|
|
|
|
|
// Instantiate the options page.
|
|
|
|
|
$options_framework_admin = new Options_Framework_Admin;
|
|
|
|
|
$options_framework_admin->init();
|
|
|
|
|
|
|
|
|
|
// Instantiate the media uploader class
|
|
|
|
|
$options_framework_media_uploader = new Options_Framework_Media_Uploader;
|
|
|
|
|
$options_framework_media_uploader->init();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
add_action('init', 'optionsframework_init', 20);
|
|
|
|
|
|
|
|
|
|
endif;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Helper function to return the theme option value.
|
|
|
|
|
* If no value has been saved, it returns $default.
|
|
|
|
|
* Needed because options are saved as serialized strings.
|
|
|
|
|
*
|
|
|
|
|
* Not in a class to support backwards compatibility in themes.
|
|
|
|
|
*/
|
|
|
|
|
if (!function_exists('kratos_option')):
|
|
|
|
|
function kratos_option($name, $default = false)
|
|
|
|
|
{
|
|
|
|
|
|
2026-10-23 18:49:06 +08:00
|
|
|
/* 一次性覆盖层:只影响当前这次请求。
|
|
|
|
|
*
|
|
|
|
|
* 用在「后台点测试邮件」这一种场景:那时用户刚在表单里改了
|
|
|
|
|
* SMTP 主机/账号/密码,但新值还没写进库(register_setting 的
|
|
|
|
|
* sanitize 回调返回值之后才落库)。直接读库会拿到上一次的配置,
|
|
|
|
|
* 于是"明明填对了却发不出去"。
|
|
|
|
|
*
|
|
|
|
|
* 为什么不用 update_option() 把新值先写进去:那个函数会再触发
|
|
|
|
|
* 一次 sanitize_option_kratos 过滤器,而写入逻辑本身就在那个
|
|
|
|
|
* 回调里 ⇒ 无限递归吃爆内存(3.2.11 的事故)。
|
|
|
|
|
*
|
|
|
|
|
* 覆盖层只在本请求内有效、不落库、不触发任何过滤器,
|
|
|
|
|
* 所以安全。其它场景这个全局变量根本不存在,行为与原来一致。
|
|
|
|
|
*/
|
|
|
|
|
if (isset($GLOBALS['__yang_options_override'])
|
|
|
|
|
&& is_array($GLOBALS['__yang_options_override'])
|
|
|
|
|
&& array_key_exists($name, $GLOBALS['__yang_options_override'])) {
|
|
|
|
|
return $GLOBALS['__yang_options_override'][$name];
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-07 11:15:42 +08:00
|
|
|
$option_name = 'kratos';
|
|
|
|
|
|
|
|
|
|
// Get option settings from database
|
|
|
|
|
$options = get_option($option_name);
|
|
|
|
|
|
|
|
|
|
// Return specific option
|
|
|
|
|
if (isset($options[$name])) {
|
|
|
|
|
return $options[$name];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $default;
|
|
|
|
|
}
|
|
|
|
|
endif;
|
|
|
|
|
|
|
|
|
|
add_action('admin_init', 'optionscheck_change_santiziation', 100);
|
|
|
|
|
function optionscheck_change_santiziation()
|
|
|
|
|
{
|
|
|
|
|
remove_filter('of_sanitize_textarea', 'of_sanitize_textarea');
|
|
|
|
|
add_filter('of_sanitize_textarea', 'custom_sanitize_textarea');
|
|
|
|
|
}
|
|
|
|
|
function custom_sanitize_textarea($input)
|
|
|
|
|
{
|
|
|
|
|
global $allowedposttags;
|
|
|
|
|
$custom_allowedtags["embed"] = array(
|
|
|
|
|
"src" => array(),
|
|
|
|
|
"type" => array(),
|
|
|
|
|
"allowfullscreen" => array(),
|
|
|
|
|
"allowscriptaccess" => array(),
|
|
|
|
|
"height" => array(),
|
|
|
|
|
"width" => array(),
|
|
|
|
|
);
|
|
|
|
|
$custom_allowedtags["script"] = array("type" => array(), "src" => array());
|
|
|
|
|
$custom_allowedtags = array_merge($custom_allowedtags, $allowedposttags);
|
|
|
|
|
$output = wp_kses($input, $custom_allowedtags);
|
|
|
|
|
return $output;
|
|
|
|
|
}
|