为了详细说明我的建议,以下是一些工作代码:
// hook in before theme is loaded
add_action(\'plugins_loaded\',\'custom_maybe_switch_themes\');
function custom_maybe_switch_themes() {
if (!is_user_logged_in()) {return;}
if (!current_user_can(\'manage_options\')) {return;}
// check for query request eg. ?usertheme=theme-slug
if (isset($_REQUEST[\'usertheme\'])) {
// sanitize request
$usertheme = strtolower(sanitize_title($_REQUEST[\'usertheme\']));
global $current_user; $current_user = wp_get_current_user();
// maybe reset user meta stylesheet
if ($usertheme == \'reset\') {delete_user_meta($current_user->ID,\'stylesheet\'); return;}
// validate theme
$theme = wp_get_theme($usertheme);
if ($theme->exists()) {
delete_user_meta($current_user->ID,\'stylesheet\');
add_user_meta($current_user->ID,\'stylesheet\',$usertheme);
}
}
}
// add filter to stylesheet option
add_filter(\'pre_option_stylesheet\', \'get_user_stylesheet\');
function get_user_stylesheet($stylesheet) {
if (!is_user_logged_in()) {return $stylesheet;}
if (!current_user_can(\'manage_options\')) {return $stylesheet;}
// check user meta stylesheet
global $current_user; $current_user = wp_get_current_user();
$userstylesheet = get_user_meta($current_user->ID,\'stylesheet\',true);
// if we have a value use it instead
if ($userstylesheet) {return $userstylesheet;}
return $stylesheet;
}
要根据用户切换到主题,请使用
?usertheme=theme-slug
。。。要重置,只需使用?usertheme=reset
由于所有主题代码都是根据所使用的样式表加载的,因此您可以为Live、Staging和Development(使用相同的父模板)设置子主题目录,并作为开发人员轻松地在主题之间切换,并立即在同一域上查看结果。:-)
我能想到的唯一警告是测试主要的插件更新,您仍然需要一个用于此目的的开发环境,并且可能需要同步数据库以测试它们与当前数据库内容。这只是因为你不知道他们是否会改变他们的选项数据库表结构(虽然很少见,但没有回头路,所以你可以通过这种方式破坏一个活动站点。)
需要进一步测试注销用户的站点输出,但可以使用不同的查询字符串进行一次性加载,也可以使用cookie而不是用户元来实现类似的持久结果。
无论如何,能够将代码片段组织在文件中,以便在同一个域上进行开发测试和登台,使在它们之间推动新的更改变得非常容易,并且不必一直担心数据库同步(尽管这是另一种可行的方法),这一优势使我认为这是一种非常方便的方法。