Como faço meu tema filho reaplicar as configurações que foram personalizadas quando seu pai estava ativo?

14

Cenário

  1. Escolha o tema 2015. Personalize várias configurações, como imagem de fundo, cabeçalho, nome do site e slogan.
  2. Mas não toque no conteúdo de nenhum dos arquivos do tema.
  3. Use Temas para crianças do Codex para criar um tema infantil mínimo do tema 2015.
  4. Ative o novo tema filho.

Opa?

O site com esse tema infantil mínimo ativado parece completamente diferente do tema pai. O fundo e a imagem do cabeçalho foram eliminados e todos os tipos de widgets da barra lateral (ou cabeçalho) foram ativados e não estavam ativos (por padrão) no tema pai 2015.

Visual original do site com apenas algumas configurações personalizadas para o tema de 2015:

Ositecomoparececomotemafilhoderivadodotema2015,quetemapenasocabeçalhonecessárioemstyle.csseapenasenfileiraosestilosconformesugeridopelapáginaTemainfantildoCodexemseufunction.php.

Pergunta

Comofaçoparaqueaativaçãodotemafilhomantenhaaspersonalizaçõeseospadrõesdotemapai?

Nessecaso:ocabeçalhoeasimagensdeplanodefundoearemoção(desativação?)doswidgetspadrão(barralateral/cabeçalho).

Notas

Crie um tema infantil de um já O tema personalizado pesado pode parecer uma duplicata, mas trata-se de personalizações editando os arquivos do tema.

Esta questão Ao ativar um tema filho, quais configurações centrais precisam ser redefinidas, isto é; Menus personalizados etc? parecem perguntar exatamente o que parece ser depois. Infelizmente, a única resposta especula sobre uma incompatibilidade nos recursos, o que não é o caso para mim e não pegou o comentário do OP com o mesmo efeito.

Eu também olhei para

por Marjan Venema 05.08.2015 / 13:32

1 resposta

8

Eu dei +1 para a @webtoure's answer porque ela te dá a direção certa, no entanto eu acho falta algumas verificações.

Em primeiro lugar, ele não verifica se o tema que está sendo ativado é um tema filho e não verifica se o tema anteriormente ativo é o tema pai do tema filho que está sendo ativado.

Por minha compreensão do OP, essas condições são necessárias.

Além disso, um problema que você precisa levar em conta é o que fazer com os mods do tema do tema filho que estão sendo ativados, se já existirem.

Na resposta do @webtoure, eles são armazenados em um backup, que pode salvá-lo em algumas circunstâncias, mas o WordPress não os reconhecerá por padrão e, portanto, precisará de algum código adicional a ser usado.

Acho que seria melhor herdar as modificações do tema do tema pai apenas na primeira vez em que um tema filho é ativado.

Em resumo, as condições que desejo verificar antes para herdar mods de tema do tema pai são:

  • o tema anteriormente ativo deve ser o pai do tema filho que está sendo ativado
  • o tema filho que está sendo ativado nunca foi ativado antes

Para garantir a segunda condição, usarei uma opção personalizada, porque o WordPress não oferece uma maneira de fazer essa verificação.

Este é o código, por favor, leia os comentários em linha para obter explicações sobre o que está acontecendo:

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 );
    
por gmazzap 09.08.2015 / 23:58