¿Cómo cargar parent_theme functions.php antes de child_theme?

11

Tengo el problema de que tengo que cargar el archivo functions.php del tema principal antes de que se cargue el archivo functions.php del tema principal. Esto es necesario para la configuración & procedimiento de iniciación. Miré los ganchos dentro de /wp_core_root/wp-settings.php (llamado: do_action('setup_theme'); ).

El problema es que no sé cómo enlazar allí, ya que el primer archivo que recibo es functions.php del tema secundario, por lo que no funcionará add_action( 'setup_theme', 'my_init_function' ); .

Editar:
a) Sé que los complementos se cargan antes que el tema y, por lo tanto, pueden acceder incluso a la consulta inicial, pero no quiero confiar en un complemento.
b) Aquí está el código (abreviado) del archivo 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' );

Quiero evitar dos cosas: Primero, muchas explicaciones para los usuarios. En segundo lugar, existe la posibilidad de que alguien rompa algo si corta la cuerda y borra accidentalmente el procedimiento de inicio de los padres. Las personas solo deben jugar dentro de las funciones. Php sin arriesgarse a romper nada sin saberlo.

En otras palabras: ¿Cómo mantengo limpio el archivo functions.php de mis temas secundarios, pero tengo el bootstrap de los temas principales?

¿Alguna idea? Muchas gracias!

    
pregunta kaiser 21.02.2011 - 20:02

5 respuestas

9

Justin Tadlock escribió recientemente una excelente publicación sobre crear un mejor archivo functions.php
donde (si recuerdo bien) se ocupa de este problema exacto.

Lamentablemente, su sitio está inactivo en este momento, así que tengo que confiar en mi memoria por ahora.

Estás en el camino correcto con el after_setup_theme hook.

  1. Por lo que recuerdo, el truco es envolver sus filtros y acciones en su función.
    Vea el ejemplo a continuación.
  2. Haces eso en ambos padres e hijos functions.php archivos.
  3. Entonces puedes jugar con la prioridad de estos dos ganchos.

Un poco de código que vale más que mil palabras: function.php de tu tema principal debería verse así:

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() {
...
}
    
respondido por el Michal Mau 21.02.2011 - 22:24
9

En primer lugar, no puedes. Las funciones del tema secundario.php siempre se cargan primero, punto.

Segundo, los temas no pueden engancharse a setup_theme. Los complementos pueden, pero lo primero que puede enlazar un tema es after_setup_theme.

Si su padre está diseñado correctamente, entonces el niño es capaz de anular funciones y cosas en el padre, pero solo cuando se carga primero.

Hablando en términos generales, si crees que primero debes cargar el archivo de funciones de los padres, entonces probablemente lo estés haciendo mal, de alguna manera. Necesitas explicar el problema más grande.

    
respondido por el Otto 21.02.2011 - 21:30
4

Entonces, estás intentando ejecutar el código desde funciones.php del niño, pero después de que el tema principal se haya cargado. Simple, solo usa una acción personalizada:

Al final de parent/functions.php :

do_action('parent_loaded');

En child/functions.php :

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

Todos los temas principales que valgan la pena lo hacen de esta manera. Lo que es más, tienen varias otras acciones y filtros repartidos por el tema secundario a utilizar.

    
respondido por el scribu 22.02.2011 - 00:52
0

¿Por qué no incluyes el archivo functions.php del tema principal en el archivo functions.php del tema principal, como esto:

En el archivo functions.php del tema secundario:

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

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

De esta manera, el archivo functions.php del tema principal no se modifica (a veces esto es importante).

    
respondido por el Anh Tran 22.02.2011 - 06:40
0

Anteriormente tuve un problema similar y lo solucioné creando un "child-functions.php" vacío adicional en parent e incluyéndolo en "functions.php" (parent también) justo después de los archivos / funciones que quiero usar en child, luego en child theme creo un archivo "child-functions.php" y ahí es donde puedo comenzar a simular child functions.php después de que el padre no sea una solución elegante, pero hizo el trabajo.

    
respondido por el Softmixt 07.04.2017 - 12:50

Lea otras preguntas en las etiquetas