如何使子主题重新应用在其父主题处于活动状态时自定义的设置?

时间:2015-08-05 作者:Marjan Venema

场景选择2015年主题。自定义各种设置,例如背景图片、标题图片、网站名称和标语使用Codex\' Child Themes 创建2015年主题的最低儿童主题

激活了这个最小子主题的站点看起来与父主题完全不同。背景和标题图像都消失了,所有在父2015主题中不活动(默认)的边栏(或标题)小部件都被激活了。

网站的原始外观,仅为2015年主题提供了一些定制设置:

SofietjeWonders with customised 2015 theme

该站点外观与2015主题派生的子主题一致,其中仅包含所需的标题style.css 并且仅将Codex子主题页在其function.php.

enter image description here

问题

How do I make it so that activating the child theme keeps the customisations and defaults of the parent theme?

在这种情况下:标题和背景图片以及删除(停用?)默认(边栏/标题)小部件的。

注释

Create a child theme of an already heavy customised theme 听起来可能像是重复的,但这是关于通过编辑主题文件进行自定义的。

这个问题When activating a child theme, what core settings have to be reset ie; Custom Menus etc? 似乎在问我到底想要什么。不幸的是,唯一的答案是推测功能不匹配,这对我来说并非如此,也没有从OP的评论中得到同样的效果。

我还看了

1 个回复
SO网友:gmazzap

我给了@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 );

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register