Comment puis-je faire en sorte que mon thème enfant réapplique les paramètres qui ont été personnalisés lorsque son parent était actif?

17

Scénario

  1. Choisissez le thème 2015. Personnalisez divers paramètres, tels que l'image d'arrière-plan, l'image d'en-tête, le nom du site et le slogan.
  2. Mais ne touchez pas au contenu des fichiers du thème.
  3. Utilisez les thèmes enfant du Codex pour créer un thème enfant minimum minimal du thème 2015.
  4. Activez le nouveau thème enfant.

Oups?

Le site avec ce thème enfant minimal activé est complètement différent du thème parent. L'arrière-plan et l'image d'en-tête avaient disparu, et toutes sortes de widgets de la barre latérale (ou en-tête) avaient été activés qui n'étaient pas actifs (par défaut) dans le thème parent 2015.

Aspect original du site avec seulement quelques paramètres personnalisés pour le thème 2015:

SofietjeWonders avec thème 2015 personnalisé

Le site tel qu'il apparaît avec le thème enfant dérivé du thème 2015, qui n'a que l'en-tête requis style.csset ne met en file d'attente que les styles suggérés par la page Thème enfant du Codex dans son function.php.

entrez la description de l'image ici

Question

Comment puis-je faire en sorte que l'activation du thème enfant conserve les personnalisations et les valeurs par défaut du thème parent?

Dans ce cas: les images d'en-tête et d'arrière-plan et la suppression (désactivation?) Des widgets par défaut (barre latérale / en-tête).


Remarques

Créer un thème enfant d'un thème personnalisé déjà lourd peut ressembler à un doublon, mais il s'agit de personnalisations en modifiant les fichiers du thème.

Cette question Lors de l'activation d'un thème enfant, quels paramètres de base doivent être réinitialisés, c'est-à-dire; Menus personnalisés, etc.? semblent demander exactement ce que je semble être après. Malheureusement, la seule réponse spécule sur un décalage dans les fonctionnalités, ce qui n'est pas le cas pour moi et n'a pas repris le commentaire du PO dans le même sens.

J'ai aussi regardé

Marjan Venema
la source

Réponses:

9

J'ai donné un +1 à la réponse de @ webtoure car cela vous donne la bonne direction, mais je pense qu'il manque quelques vérifications.

Tout d'abord, il ne vérifie pas que le thème activé est un thème enfant et ne vérifie pas que le thème précédemment actif est le thème parent du thème enfant activé.

Selon ma compréhension de l'OP, ces conditions sont requises.

De plus, un problème que vous devez prendre en compte est de savoir quoi faire avec les mods de thème du thème enfant activés, s'ils existent déjà.

Dans @webtoure answer, ils sont stockés dans une sauvegarde, ce qui peut vous sauver dans certaines circonstances, mais WordPress ne les reconnaîtra pas par défaut et ils nécessitent donc un code supplémentaire pour être utilisés.

Je pense qu'il serait préférable d'hériter des modifications de thème du thème parent uniquement la première fois qu'un thème enfant est activé.

En bref, les conditions que je veux vérifier avant d'hériter des mods de thème du thème parent sont:

  • le thème précédemment actif doit être le parent du thème enfant activé
  • le thème enfant qui est activé n'a jamais été activé auparavant

Pour garantir la deuxième condition, j'utiliserai une option personnalisée, car WordPress ne fournit pas de moyen de procéder à cette vérification.

Ceci est le code, veuillez lire les commentaires en ligne pour une explication de ce qui se passe:

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 );
gmazzap
la source
Votre premier point de préoccupation n'est pas vraiment justifié: si le thème actuel n'est pas un thème enfant get_template, il retournera simplement le nom du dir du thème actuel. Vous n'avez pas besoin de connaître la relation entre le thème précédemment actif et le thème actuel: si le thème a un parent, il charge ces paramètres, sinon il charge simplement ses propres paramètres. Je suis cependant d'accord avec votre deuxième point qui traite de la question de l'écrasement des paramètres.
webtoure
De plus, que se passe-t-il si l'utilisateur active accidentellement un autre thème avant d'activer le thème enfant souhaité? Le code ne fonctionnera pas et la relation ( theme_switched, current_theme) n'est pas pertinente pour commencer.
webtoure
1
@MarjanVenema Je serai très heureux si vous offrez des primes à webtoure .
gmazzap
1
@MarjanVenema gmazzap a en fait fourni des commentaires pour son processus de réflexion et a également suggéré une correction à mon extrait de code. Je pense que si quelqu'un mérite la prime, c'est lui. De plus, je ne réponds pas aux questions pour des points complètement inutiles. J'adore: interagir avec les gens, les défis et généralement aider quand je le peux.
webtoure
1
Veuillez prendre de longues discussions pour discuter, les commentaires ne leur sont pas destinés. :)
Rarst