Como carregar parent_theme functions.php antes de child_theme?

11

Eu tenho o problema de carregar o arquivo functions.php do meu tema pai antes que o arquivo functions.php do meu filho seja carregado. Isso é necessário para a configuração & procedimento init. Eu olhei para os ganchos dentro de /wp_core_root/wp-settings.php (chamado: do_action('setup_theme'); ).

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

Editar:
a) Eu sei que os plugins carregam mais cedo do que o tema e, portanto, podem acessar até mesmo a consulta inicial, mas eu não quero depender de um plugin.
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' );

Eu quero evitar duas coisas: primeiro muita explicação para os usuários. Segundo, a chance de que alguém quebre alguma coisa se cortar a corda acidentalmente excluindo o procedimento init dos pais. As pessoas devem apenas jogar dentro das funções.php sem arriscar quebrar nada sem saber.

Em outras palavras: Como eu mantenho o arquivo functions.php dos meus temas filhos limpo, mas faço o bootstrap dos temas pai?

Alguma ideia? Muito obrigado!

    
por kaiser 21.02.2011 / 20:02

5 respostas

9

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

Infelizmente, o site dele está inativo no momento, então tenho que confiar em minha memória por enquanto.

Você está no caminho certo com o gancho after_setup_theme .

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

Um pouco de código vale mais que mil palavras - o function.php do seu tema pai deve ficar 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() {
...
}
    
por Michal Mau 21.02.2011 / 22:24
9

Em primeiro lugar, você não pode. O functions.php do tema filho sempre carrega primeiro, ponto final.

Em segundo lugar, os temas não podem ser inseridos no setup_theme. Plugins podem, mas a primeira coisa que um tema pode conectar é after_setup_theme.

Se o seu pai for projetado corretamente, o filho será capaz de substituir funções e material no pai, mas somente quando for carregado primeiro.

De um modo geral, se você acha que precisa carregar o arquivo de funções do pai primeiro, então provavelmente você está fazendo errado, de alguma forma. Você precisa explicar o problema maior.

    
por Otto 21.02.2011 / 21:30
4

Então você está tentando executar o código a partir do arquivo functions.php do filho, 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 para pais que valem a pena são assim. Além disso, eles têm várias outras ações e filtros espalhados para o tema filho usar.

    
por scribu 22.02.2011 / 00:52
0

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

No arquivo functions.php 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 forma, o arquivo functions.php do tema pai não é alterado (às vezes isso é importante).

    
por Anh Tran 22.02.2011 / 06:40
0

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

    
por Softmixt 07.04.2017 / 12:50

Tags