我给@webtoure的答案 +1,因为它为您提供了正确的方向,但是我认为它缺少一些检查。
首先,它不会检查正在激活的主题是否是子主题,也不会检查先前处于活动状态的主题是被激活的子主题的父主题。
根据我对OP的了解,这些条件是必需的。
此外,您需要考虑的一个问题是如何激活已激活的子主题的主题mod。
在@webtoure答案中,它们存储在备份中,在某些情况下可能会节省您,但是WordPress默认不会识别它们,因此它们需要使用一些其他代码。
我认为最好仅在第一次激活子主题时从父主题继承主题修改。
简而言之,我想从父主题继承主题mod之前要检查的条件是:
- 先前活动的主题必须是被激活的子主题的父主题
- 被激活的子主题必须从未被激活过
为了确保第二种情况,我将使用自定义选项,因为WordPress没有提供进行此检查的方法。
这是代码,请阅读内联注释以了解发生的情况:
add_action( 'switch_theme', function( $new_name, \WP_Theme $new_theme ) {
// get the previously active theme
$previous = get_option( 'theme_switched', -1 );
// get the parent of current theme, will be false if no parent
$parent = $new_theme->parent() ? $new_theme->get_template() : false;
// current stylesheet name
$stylesheet = get_option( 'stylesheet' );
// has the theme being activated ever been activated before?
$lastActive = get_option( $stylesheet . '_last_active', false );
// if previouly active theme is the parent of the the child theme being activated
// and it has never been activated before..
if ( ! $lastActive && $parent === $previous ) {
// update "last_active" option so following code won't run again for this theme
update_option( $stylesheet . '_last_active', current_time( 'timestamp', 1 ) );
// get the theme mods of the parent
$previousMods = get_option( 'theme_mods_' . $parent, array() );
// inherit current theme mods from parent theme mods
update_option( 'theme_mods_' . $stylesheet, $previousMods );
}
}, 10, 2 );
get_template
仅返回当前主题的目录名称。您不需要知道先前活动的主题与当前主题之间的关系:如果主题有父主题,则它将加载这些设置,否则将仅加载其自己的设置。我同意您的第二点,即解决设置被覆盖的问题。