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


17

シナリオ

  1. 2015テーマを選択します。背景画像、ヘッダー画像、サイト名、キャッチフレーズなど、さまざまな設定をカスタマイズします。
  2. ただし、テーマのファイルの内容には触れないでください。
  3. 使用コーデックス」チャイルドテーマ 2015年のテーマの最低限の子テーマを作成します。
  4. 新しい子テーマをアクティブにします。

おっとっと?

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

2015テーマ用にカスタマイズされたいくつかの設定を備えたサイトの元の外観:

カスタマイズされた2015テーマを使用したSofietjeWonders

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

ここに画像の説明を入力してください

質問

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

この場合:ヘッダーと背景画像、およびデフォルト(サイドバー/ヘッダー)ウィジェットの削除(非アクティブ化?)。


ノート

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

この質問は、子テーマをアクティブにするとき、どのコア設定をリセットする必要がありますか。カスタムメニューなど?私が何を望んでいるのかを正確に尋ねているようです。残念ながら、唯一の答えは機能の不一致について推測していますが、これは私には当てはまらず、同じ効果に対するOPのコメントを拾いませんでした。

私も見ました

回答:


9

@webtoureの答えに +1を付けました。正しい方向を示しているからです。しかし、いくつかのチェックが欠けていると思います。

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

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

さらに、考慮する必要がある1つの問題は、アクティブ化されている子テーマのテーマmodが既に存在する場合、それをどうするかです。

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

子テーマが初めてアクティブになったときにのみ親テーマからテーマの変更を継承する方が良いと思います。

要するに、親テーマからテーマmodを継承する前に確認したい条件は次のとおりです。

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

2番目の条件を確保するために、カスタムオプションを使用します。これは、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、現在のテーマのディレクトリ名が返されます。以前にアクティブだったテーマと現在のテーマの関係を知る必要はありません。テーマに親がある場合、それらの設定をロードします。そうでない場合は、独自の設定をロードします。ただし、上書きされる設定の問題に対処する2番目のポイントに同意します。
webtoure

さらに、目的の子テーマをアクティブ化する前に、ユーザーが誤って別のテーマをアクティブ化した場合はどうなりますか?コードは機能せず、(theme_switchedcurrent_theme)関係は最初は無関係です。
webtoure

1
あなたに恵みをあげるならば@MarjanVenema私はとても幸せになるでしょうwebtoure
gmazzap

1
@MarjanVenema gmazzapは実際に彼の思考プロセスにコメントを提供し、スニペットの修正も提案しました。誰もが賞金に値するなら、それは彼だと思います。また、まったく役に立たない点については質問に答えません。私は大好きです。人々とやり取りし、挑戦し、一般的に私ができるときに助けます。
webtoure

1
チャットのために詳細な議論をしてください。コメントは彼らのためのものではありません。:)
Rarst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.