Como carregar parent_theme functions.php antes de child_theme?


12

Eu tenho o problema de ter que carregar o functions.phparquivo do meu tema pai antes que o functions.phparquivo do tema filho seja carregado. Isso é necessário para o procedimento de instalação e inicialização. Eu olhei para os ganchos dentro de /wp_core_root/wp-settings.php (nomeado:) do_action('setup_theme');.

O problema é que eu não sei como me conectar lá, porque o primeiro arquivo que recebo é do tema filho functions.php, então não add_action( 'setup_theme', 'my_init_function' );funcionará.

Edit:
a) Eu sei que os plug-ins carregam mais cedo que o tema e, portanto, podem acessar até a consulta inicial, mas não quero confiar em um plug-in.
b) Aqui está o código (abreviado) do arquivo wp-settings.php

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

Quero evitar duas coisas: primeiro, muitas explicações para os usuários. Segundo, a chance de alguém quebrar alguma coisa se cortar a corda acidentalmente com a exclusão do procedimento inicial dos pais. As pessoas devem apenas tocar dentro do functions.php sem correr o risco de quebrar nada sem saber.

Em outras palavras: Como faço para manter limpo o arquivo functions.php dos temas filhos, mas faço a inicialização dos temas pai?

Alguma ideia? Muito obrigado!


Você não pode simplesmente incluí-lo?
Wyrfel

Minha pergunta é: de onde? O primeiro arquivo carregado no contexto do tema é o tema filho functions.php. Dê uma olhada no wp-settings.phparquivo "molto loko" no núcleo (linha: 275-279 @wp 3.1 rc) ... fica assim: if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );assim não vejo chance ... E não quero usar um plugin para iniciar meu tema.
21411 kaiser

Talvez eu esteja totalmente faltando alguma coisa aqui, mas se você inserir include(/path/to/parent/themes/functions.php)no topo dos temas filhos functions.php, tudo será carregado antes. Não?
wyrfel

@wyrfel: eu atualizei o Q para torná-lo mais claro
kaiser

Entendo, obrigado, está muito mais claro agora. Além disso, eu assumi que você estava apenas fazendo isso em uma única instalação.
Wyrfel

Respostas:


11

Justin Tadlock recentemente escreveu um ótimo post sobre como criar um arquivo functions.php melhor,
onde (se bem me lembro) ele lida com esse problema exato.

Infelizmente, o site dele está fora do ar no momento, então tenho que confiar na minha memória por enquanto.

Você está no caminho certo com o after_setup_themegancho.

  1. Tanto quanto me lembro, o truque é envolver seus filtros e ações em sua função.
    Veja o exemplo abaixo.
  2. Você fazer isso em ambos pai e filho functions.phparquivos.
  3. Então você pode jogar com a prioridade desses dois ganchos.

Um pouco de código vale mais que mil palavras - o tema principal function.phpdeve ser assim:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

Ehm, obrigado pela gravação (+1). Você tem um cérebro impressionante;). O problema é que after_setup_themeé tarde demais, porque os arquivos functions.php já foram carregados.
Kaiser

EDIT: Depois de repensar seu código e ler "faça isso nas funções pai e filho.php" e "brinque com a prioridade", isso começa a fazer sentido. Ainda procurando uma solução melhor que o usuário não consiga quebrar tão fácil, mas faz sentido! Obrigado!
Kaiser

Não há solução real por aqui, então, marque essa opção, pois você foi a primeira a propor isso.
Kaiser

9

Em primeiro lugar, você não pode. As funções do tema filho.php sempre carregam primeiro, ponto final.

Segundo, os temas não podem se conectar ao setup_theme. Os plugins podem, mas a primeira coisa que um tema pode se conectar é after_setup_theme.

Se seu pai ou mãe foi projetado corretamente, o filho poderá substituir funções e itens do pai, mas apenas quando ele for carregado primeiro.

Em termos gerais, se você acha que precisa carregar o arquivo de funções dos pais primeiro, provavelmente está fazendo algo errado, de alguma forma. Você precisa explicar o problema maior.


Obrigado pela sua resposta. Entendo a necessidade de carregar plug-ins antes dos temas e já percebi o fato (leia acima: "E não quero usar um plug-in para inicializar meu tema."). Para elaborar meu caso: recebi um arquivo ini que se preocupa em carregar todas as partes da minha estrutura, que começa nas funções de temas pais php, exigindo o arquivo e carregando a classe init. O InitClass se preocupa com o carregamento de a) e a matriz de dados dos arquivos filho .ini-files e os envia para classes diferentes para processamento adicional, por exemplo. meta boxes, tipos de postagem personalizados etc.
kaiser

Meu problema é que eu tenho que iniciar tudo isso a partir do arquivo functions.php dos meus pais, para que um usuário normal não possa quebrá-lo, ao brincar dentro do tema filho. Meu segundo problema é que todas essas classes não estão disponíveis dentro do arquivo functions.php do tema filho, portanto não servem para nada ... mas talvez eu tenha um grande erro de pensamento aqui. Alguma idéia ou sugestão de como torná-lo melhor?
Kaiser

3
.... Acho que você terá que aceitar o fato de que, se um usuário quebrar as coisas, esse será realmente o problema deles. Conclusão: Não como carregar o functions.php do tema pai primeiro e deixar o tema filho "limpo". Se você precisar que algo no tema filho seja executado após o carregamento do arquivo functions.php do tema pai, coloque-o dentro de uma função conectada ao after_setup_theme. Isso é executado após o carregamento dos dois arquivos functions.php.
Otto

Está bem. Não é esse grande problema. Só estou interessado se houver uma possibilidade. Pergunta: Para que uma "estrutura vale a pena", possui um gancho após o procedimento init e não o utiliza simplesmente after_setup_theme? Só para não "spam" o gancho, ou porque é mais "empreendedor" ou "kool" er? Quero dizer: a idéia de "melhores práticas" por trás dos ganchos paralelos específicos do tema "deixa ganchos principais para plug-ins"? (Isso é como eu lidar com isso no momento.)
kaiser

"Se você vai fazer isso, não se preocupe com uma ação extra. Basta ligar para o after_setup_theme." Está bem. Obrigado. 1
kaiser

4

Então você está tentando executar o código a partir do functions.php da criança, mas após o carregamento do tema pai. Simples, basta usar uma ação personalizada:

No final de parent/functions.php:

do_action('parent_loaded');

Em child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

Todos os temas dos pais que valem a pena fazem dessa maneira. Além disso, eles têm várias outras ações e filtros espalhados para o tema filho usar.


Eu tento evitar o máximo de instruções possível. Essa é uma das razões pelas quais mudei de um arquivo config.php na pasta do tema filho e agora use arquivos ini. Em uma frase: tento me afastar da minha solução antiga / sua e chegar o mais próximo possível do núcleo e do códice. Meu problema é que não consigo entregar uma única função do tema filho, porque nenhuma classe ou do meu bootstrap está disponível no arquivo functions.php dos temas filho (sem falar em tags de modelo customizado / framework).
Kaiser

Veja a resposta atualizada.
scribu 22/02

Eu atualizei o Q também. Depois de ler que 2/3 das respostas me apontam para a mesma fonte (temática, antes da sua edição), sinto que existe apenas o método de inclusão "justin tadlock", mas quero ter certeza.
Kaiser

2
Se você vai fazer isso, não se preocupe com uma ação extra. Basta conectar ao after_setup_theme.
Otto

0

Por que você não inclui o functions.phparquivo do tema pai no arquivo do tema filho functions.php, desta forma:

No functions.phparquivo do tema filho :

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

Dessa maneira, o functions.phparquivo do tema pai não é alterado (às vezes isso é importante).


como mencionado no Q: "Em outras palavras: como faço para manter limpo o arquivo functions.php dos temas filhos, mas faço a inicialização dos temas pai?" Ainda melhor: Como evito uma chamada de dentro de qualquer arquivo functions.php? Motivo: as pessoas costumam esmagar todas as porcarias que não desejam ter nos arquivos de modelo. Portanto, há uma grande chance de alguém acidentalmente excluir algumas linhas. Minha experiência: ninguém realmente lê comentários, leia-me ou documentação.
Kaiser

0

Eu tive um problema semelhante antes e o corrigi criando um "child-functions.php" extra vazio no pai e incluindo-o em "functions.php" (pai também) logo após os arquivos / funções que eu quero usar no child, então, no tema filho, crio um arquivo "child-functions.php" e é aí que eu posso começar a simular child functions.php, executar após o pai não é uma solução elegante, mas fez o trabalho.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.