web-dev-qa-db-ja.com

親がアクティブになったときにカスタマイズした設定を子テーマに再適用させるにはどうすればよいですか。

シナリオ

  1. 2015年のテーマを選びます。背景画像、ヘッダー画像、サイト名、タグラインなどのさまざまな設定をカスタマイズします。
  2. しかし、テーマのファイルの内容に触れないでください。
  3. 2015テーマの最低限の子テーマを作成するには、 Codex 'Child Themes )を使用します。
  4. 新しい子テーマをアクティブにします。

おっとっと?

この最小の子テーマがアクティブになっているサイトは、親テーマとはまったく異なります。背景画像とヘッダー画像がなくなり、2015年の親テーマでは(デフォルトでは)アクティブではなかった、あらゆる種類のサイドバー(またはヘッダー)ウィジェットがアクティブになりました。

2015テーマ用にカスタマイズされた設定がいくつかあるだけの、サイトのオリジナルの外観:

SofietjeWonders with customised 2015 theme

このサイトは2015年のテーマから派生した子テーマを表示しています。この子テーマはstyle.cssに必要なヘッダーのみを持ち、そのfunction.phpのCodexの子テーマページで提案されているスタイルのみをエンキューします。

enter image description here

質問

子テーマをアクティブにしても親テーマのカスタマイズとデフォルトが維持されるようにするにはどうすればよいですか。

この場合は、ヘッダーと背景の写真、およびデフォルトの(サイドバー/ヘッダー)ウィジェットの削除(無効化?)。


ノート

すでにカスタマイズされたテーマの子テーマを作成する は重複しているように思えるかもしれませんが、それはテーマのファイルを編集することによるカスタマイズについてです。

この質問 子テーマをアクティブにするとき、どのカスタム設定をリセットする必要があるのでしょうか?カスタムメニューなど? 私は後になっていると思うものを正確に尋ねるようです。私の場合はそうではありませんし、同じ効果に対するOPのコメントを拾いませんでした。

私も見ました

15
Marjan Venema

私は @ webtoureの答えに+1を与えました それはあなたに正しい方向を与えるので、しかし私はそれがいくつかのチェックを欠いていると思います。

まず最初に、アクティブ化されているテーマが子テーマであることを確認しません。また、以前にアクティブ化されていたテーマがアクティブ化されている子テーマの親テーマであることを確認しません。

私のOPの理解によれば、これらの条件は必須です。

さらに、考慮しなければならない問題の1つは、アクティブになっている子テーマのテーマmodがすでに存在する場合、それらをどうするかです。

@webtoureの答えでは、それらは状況によってはあなたを救うかもしれないバックアップに保存されますが、WordPressはデフォルトでそれらを認識しないので、それらは使用される追加のコードを必要とします。

私はそれが親のテーマだけからテーマの変更を継承する方が良いと思います 初めて 子テーマがアクティブになります。

手短に言えば、親テーマからテーマMODを継承するために私が前にチェックしたい条件は以下のとおりです。

  • 以前にアクティブだったテーマは、アクティブになっている子テーマの親である必要があります。
  • アクティブ化されている子テーマは、以前にアクティブ化されたことがないはずです。

WordPressはこのチェックを行う方法を提供していないので、2番目の条件を保証するために私はカスタムオプションを使用します。

これがコードです。何が起こっているのか説明するためにインラインコメントを読んでください。

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 );
9
gmazzap