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

14

Scénario

  1. Choisissez le thème de 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 les thèmes enfant du Codex pour créer un thème enfant très simple pour le thème de 2015.
  4. Activer le nouveau thème enfant.

Oops?

Le site avec ce thème enfant minimal minimum activé est complètement différent du thème parent. L'image d'arrière-plan et d'en-tête avait disparu et toutes sortes de widgets de barre latérale (ou d'en-tête) avaient é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:

Lesitetelqu'ilseprésenteaveclethèmeenfantdérivéduthème2015,quinecontientquel'en-têterequisdansstyle.cssetmetuniquementenfiled'attentelesstylessuggérésparlapageThèmeenfantduCodexdanssonfunction.php.

Question

Commentpuis-jefaireensortequel'activationduthèmeenfantconservelespersonnalisationsetlesvaleurspardéfautduthèmeparent?

Danscecas:l'en-têteetlesimagesd'arrière-planetlasuppression(désactivation?)deswidgetspardéfaut(barrelatérale/en-tête).

Notes

Créer un thème enfant d'un déjà Un thème personnalisé 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 fondamentaux doivent être réinitialisés, par exemple; Les 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 de l'OP dans le même sens.

J'ai aussi regardé

posée Marjan Venema 05.08.2015 - 13:32

1 réponse

8

J'ai donné un +1 à la réponse de @ webtoure car elle vous indique la bonne direction, mais je pense il manque quelques contrôles.

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 le thème mods du thème enfant activé, s’ils existent déjà.

Dans la réponse @webtoure, ils sont stockés dans une sauvegarde, ce qui pourrait vous sauver dans certaines circonstances, mais WordPress ne les reconnaîtra pas par défaut et ils nécessiteront donc l'utilisation d'un code supplémentaire.

Je pense qu'il vaudrait mieux 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 souhaite 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 en cours d'activation
  • le thème enfant en cours d'activation n'a jamais été activé auparavant

Pour garantir la deuxième condition, je vais utiliser une option personnalisée, car WordPress ne fournit pas un moyen d'effectuer 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 );
    
réponse donnée gmazzap 09.08.2015 - 23:58

Lire d'autres questions sur les étiquettes