web-dev-qa-db-fra.com

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

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 au contenu d'aucun des fichiers du thème.
  3. Utilisez Thèmes du Codex pour les enfants pour créer un thème pour enfant au minimum strict du thème de 2015.
  4. Activer le nouveau thème enfant.

Oops?

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

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

 SofietjeWonders with customised 2015 theme 

Le site tel qu'il se présente avec le thème enfant dérivé du thème 2015, qui n'a que l'en-tête requis dans style.css et met en file d'attente uniquement les styles suggérés par la page Child Theme du Codex dans son function.php.

 enter image description here 

Question

Comment 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: l'en-tête et les images d'arrière-plan et la suppression (désactivation?) Des widgets par défaut (barre latérale/en-tête).


Remarques

Créez un thème enfant d'un thème personnalisé déjà lourd peut sembler être 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, par exemple; Menus personnalisés, etc.? semble 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é

15
Marjan Venema

J'ai donné un +1 à la réponse de @ webtoure / parce que 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 du PO, ces conditions sont requises.

De plus, vous devez prendre en compte un problème: que faire avec les mods de thème du thème enfant activé, 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 à utiliser.

Je pense qu'il vaudrait mieux hériter des modifications de thème du thème parent uniquement la première fois un thème enfant est activé.

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

  • le thème précédemment actif doit être le parent du thème enfant en cours d'activation
  • le thème enfant activé n'est jamais activé auparavant

Pour garantir la deuxième condition, je vais utiliser une option personnalisée, car WordPress ne fournit pas un 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 );
9
gmazzap