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

17

Cenário

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

Opa?

O site com este tema filho mínimo desencapado ativado parece completamente diferente do tema pai. A imagem de plano de fundo e cabeçalho desapareceu e todos os tipos de widgets da barra lateral (ou cabeçalho) foram ativados que não estavam ativos (por padrão) no tema pai de 2015.

Aparência original do site, com apenas algumas configurações personalizadas para o tema de 2015:

Maravilhas com tema 2015 personalizado

O site como ele se parece com o tema filho derivado do tema de 2015, que possui apenas o cabeçalho necessário style.csse enfileira apenas os estilos, conforme sugerido na página Tema do Criança do Codex function.php.

insira a descrição da imagem aqui

Questão

Como faço para que a ativação do tema filho mantenha as personalizações e os padrões do tema pai?

Nesse caso: o cabeçalho e as imagens de plano de fundo e a remoção (desativação?) Dos widgets padrão (barra lateral / cabeçalho).


Notas

Criar um tema filho de um tema personalizado já pesado pode parecer uma duplicata, mas isso é sobre personalizações, editando os arquivos do tema.

Esta pergunta Ao ativar um tema filho, quais configurações principais precisam ser redefinidas, por exemplo; Menus personalizados etc? parece perguntar exatamente o que eu pareço estar depois. Infelizmente, a única resposta especula sobre uma incompatibilidade de recursos, o que não é o meu caso e não entendeu o comentário do OP com o mesmo efeito.

Eu também olhei

Marjan Venema
fonte

Respostas:

9

Eu dei um +1 à resposta do @ webtoure porque ela fornece a direção certa, no entanto, acho que falta algumas verificações.

Primeiro, 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.

Pelo meu entendimento do OP, essas condições são necessárias.

Além disso, um problema que você precisa levar em consideração é o que fazer com os mods de tema do tema filho serem ativados, se eles 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 reconhece por padrão e, portanto, eles exigem algum código adicional para serem usados.

Eu acho que seria melhor herdar as modificações de tema do tema pai apenas na primeira vez que um tema filho for 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 fornece uma maneira de fazer essa verificação.

Este é o código, por favor, leia os comentários embutidos para obter uma explicação do 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 );
gmazzap
fonte
Seu primeiro ponto de preocupação não é realmente justificado: se o tema atual não for um tema filho, get_templateele simplesmente retornará o nome do diretório do tema atual. Você não precisa saber a relação entre o tema anteriormente ativo e o atual: se o tema tiver um pai, ele carregará essas configurações, caso contrário, apenas carregará suas próprias configurações. Concordo, porém, com o seu segundo ponto, que trata da questão de as configurações serem substituídas.
Webtoure
Além disso, e se o usuário ativar acidentalmente outro tema antes de ativar o tema filho desejado? O código não funcionará e a relação ( theme_switched, current_theme) é irrelevante para começar.
Webtoure 10/08/2015
1
@MarjanVenema Ficarei muito feliz se você der recompensa à webtoure .
gmazzap
1
O @MarjanVenema gmazzap, na verdade, forneceu comentários para seu processo de pensamento e também sugeriu uma correção no meu snippet. Eu acho que se alguém merece a recompensa, é ele. Além disso, não respondo perguntas por pontos completamente inúteis. Adoro: interagir com pessoas, desafios e geralmente ajudar quando posso.
Webtoure
1
Por favor, tome discussões prolongadas para conversar, os comentários não são para eles. :)
Rarst