¿Es posible hacer temas de nietos?

15

Si uso uno de los marcos populares como Génesis, ¿es posible crear temas de nietos?

Como ejemplo, quiero usar Genesis como la columna vertebral de todos mis sitios. Génesis se llama un marco, pero en realidad es un tema principal.

Luego selecciono uno de los temas secundarios de Genesis para la venta en StudioPress, y deseo continuar personalizándolo para cada uno de mis sitios. ¿Crearía un tema de nieto para todos mis sitios y cómo lo haría?

urok93
fuente

Respuestas:

17

Si y no.

Podría crear un tema secundario especificando otro tema secundario como el principal, y WordPress intentaría usarlo.

sin embargo

Te encontrarás con problemas, sin mencionar que los desarrolladores principales han declarado explícitamente que este no es un comportamiento deseable, y no harán esfuerzos para apoyar los temas de los nietos.

Por ejemplo, las API de WP hacen una distinción entre URL / directorios de hoja de estilo y plantilla, donde la hoja de estilo siempre se refiere al tema activo, y la plantilla se refiere al tema principal, pero si se incluye un tema de abuelo, ¿hace get_template_directory_urireferencia al padre o al abuelo? Muchas llamadas de API ahora son ambiguas, y diferentes personas esperarían un comportamiento diferente, incluido el código que está en el núcleo. También debería cargar el functions.phppadre o el abuelo y asegurarse de que se realiza en el orden correcto.

También se considera muy mala práctica. Si necesita temas para nietos, entonces su enfoque ha dado un giro equivocado y necesita retroceder y volver a evaluar las cosas.

Le aconsejaría que evite el concepto de temas de nietos, esto generará más problemas. En cambio, más acciones de filtros de ganchos y modularidad en su tema secundario deberían permitirle mantener los componentes compartidos de los temas secundarios iguales, y permitirle bifurcar / bifurcar con poca dificultad. Intente mover elementos comunes a un submódulo svn external / git.

También está el modelo _s donde tiene el tema de su hijo como base, y lo bifurca, en lugar de tenerlo como padre con la intención de que trabaje en la copia, en lugar de un hijo / anulación.

Tom J Nowell
fuente
Entonces, en mi caso, si voy con Génesis, tendré que modificar el tema secundario directamente, ¿verdad? No estoy muy familiarizado con Git, pero estaría interesado en un enfoque que me ayude a mantener intacto el tema original del niño.
urok93
Sí, no tienes muchas opciones aquí.
Tom J Nowell
Me pregunto qué pasaría si intentaras hacer un tema de bisnieto.
Chris_O
1
Usted menciona que el método ha tomado un giro equivocado si necesita esto. La razón por la que tengo curiosidad sobre esto es debido a un escenario como el uso del tema WooCommerce Storefront. Venden temas infantiles a la tienda que están personalizados para varias cosas. Entonces, si estoy usando uno de sus temas secundarios, pero luego quiero hacer mis propios cambios de una manera que no se sobrescriba cuando actualicen su tema secundario ... ¿cómo lo haría?
Drew Angell
1
No sé, eso es una limitación de cómo se ha creado el tema de la tienda, en ese momento te ves obligado a bifurcar el tema secundario
Tom J Nowell
3

No probé completamente el método que se describe a continuación, ni un tema normal de "nieto", pero si le doy la funcionalidad del filtro template_include :

    /*
    Plugin Name: Grandchild Themes
    Plugin URI: http://www.who-cares.com/
    Description: A concept for Grandchild themes Plugin
    Author: See Plugin URI
    Version: 0.0.0.0.1-Alpha
    */

    add_action('wp_head', 'grnd_chld_add_headers', 0);
    add_action('init', 'grnd_chld_add_css');

    // Load template if exists. 
function grandchild_template_include( $template ) {

    if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
        $template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );

    return $template;
}

// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );

    function grnd_chld_add_headers () {
        wp_enqueue_style('my_grandchild_style');
    }

    function grnd_chld_add_css() {
        $stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
        wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
    }

    // From here , what you got is like a normal functions.php.

También puede, de manera similar, probar filtros más específicos como, por ejemplo, archive_template

add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));

Dicho todo esto, no estoy seguro de que sea la mejor manera de hacer las cosas.

krembo99
fuente