我给了@webtoure\'s answer 因为它给了你正确的方向,但我认为它缺少一些检查。
首先,它不会检查正在激活的主题是否为子主题,也不会检查之前处于活动状态的主题是否为正在激活的子主题的父主题。
根据我对OP的理解,这些条件是必需的。
此外,您需要考虑的一个问题是如何激活子主题的主题mod,如果它们已经存在的话。
在@webtoure answer中,它们存储在备份中,在某些情况下可能会节省您的时间,但WordPress默认情况下不会识别它们,因此需要使用一些额外的代码。
我认为最好只从父主题继承主题修改the first time 子主题已激活。
简而言之,在从父主题继承主题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 );