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


17

情境

  1. 选择2015年主题。自定义各种设置,例如背景图片,标题图片,站点名称和标语。
  2. 但是,请勿触摸任何主题文件的内容。
  3. 使用Codex的“子主题”创建2015主题的最低子主题。
  4. 激活新的子主题。

哎呀

激活了这个最低限度的最小子主题的网站看起来与父主题完全不同。背景和标题图像消失了,并且激活了侧栏(或标题)小部件的所有方式,这些小部件在父级2015主题中不处于活动状态(默认情况下)。

网站的原始外观,其中包含针对2015年主题的一些自定义设置:

SofietjeWonders具有定制的2015年主题

该网站看起来带有2015年主题派生的子主题,该主题仅包含必需的标头,style.css并且仅使Codex的“子主题”页面中建议的样式入队function.php

在此处输入图片说明

我如何做到这一点,以便激活子主题保留父主题的自定义和默认设置?

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


笔记

创建已经很繁重的自定义主题的子主题可能听起来像是重复的,但这与通过编辑主题文件进行自定义有关。

这个问题在激活儿童主题时,必须重置哪些核心设置。自定义菜单等?似乎在问我似乎在追求什么。不幸的是,唯一的答案推测出功能上的不匹配,对我而言不是这种情况,并且没有采纳OP的评论以达到相同的效果。

我也看着

Answers:


9

我给@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仅返回当前主题的目录名称。您不需要知道先前活动的主题与当前主题之间的关系:如果主题有父主题,则它将加载这些设置,否则将仅加载其自己的设置。我同意您的第二点,即解决设置被覆盖的问题。
webtoure

此外,如果用户在激活所需的子主题之前意外激活了另一个主题怎么办?该代码将不起作用,并且(theme_switchedcurrent_theme)关系一开始是不相关的。
webtoure

1
@MarjanVenema如果您能赏金到webtoure,我将非常高兴。
gmazzap

1
@MarjanVenema gmazzap实际上提供了有关他的思考过程的评论,并且还建议对我的摘录进行更正。我认为如果有人应得赏金,那就是他。另外,我也不回答完全没用的问题。我爱:与人互动,挑战并在可能的情况下提供帮助。
webtoure

1
请进行更多讨论以聊天,评论不适合他们。:)
拉斯特2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.