É possível criar temas para netos?

15

Se eu usar uma das estruturas populares, como o Genesis, é possível criar temas para netos?

Como exemplo, quero usar o Genesis como a espinha dorsal de todos os meus sites. O Gênesis é chamado de estrutura, mas na verdade é um tema pai.

Depois, seleciono um dos temas filho do Genesis para venda no StudioPress e quero continuar personalizando-o para cada um dos meus sites. Eu criaria um tema neto para todos os meus sites e como eu o faria?

urok93
fonte

Respostas:

17

Sim e não.

Você pode criar um tema filho especificando outro tema filho como pai, e o WordPress tentaria usá-lo.

Contudo

Você encontrará problemas, sem mencionar que os desenvolvedores principais declararam explicitamente que esse não é um comportamento desejável e não farão esforços para apoiar os temas dos netos.

Por exemplo, as APIs do WP fazem uma distinção entre URLs / diretórios da folha de estilo e modelo, onde folha de estilo sempre se refere ao tema ativo e modelo refere-se ao tema pai, mas se um tema de avós for incluído, ele fará get_template_directory_urireferência ao pai ou ao avô? Agora, muitas chamadas de API são ambíguas e pessoas diferentes esperam um comportamento diferente, incluindo o código essencial. Você também precisa carregar o functions.phppai ou a avó ou o pai e certificar-se de que isso seja feito na ordem correta.

Também é considerado uma prática muito ruim. Se você precisa de temas para netos, sua abordagem tomou um rumo errado e você precisa dar um passo atrás e reavaliar as coisas.

Eu aconselho você a evitar o conceito de temas de netos, isso levará a mais problemas. Em vez disso, mais hooks filtra ações e modularidade no seu tema filho, permitindo que você mantenha os componentes compartilhados dos temas filhos iguais, e permita que você se ramifique com pouca dificuldade. Tente mover elementos comuns para um submódulo svn external / git.

Há também o modelo _s em que você tem o tema filho como base e bifurca-o, em vez de tê-lo como pai com a intenção de trabalhar na cópia, em vez de filho / substituição.

Tom J Nowell
fonte
Então, no meu caso, se eu for com o Genesis, só precisarei modificar o tema filho diretamente, certo? Não está muito familiarizado com o Git, mas estaria interessado em uma abordagem que me ajude a manter intacto o tema filho original.
Urok93
Sim, você não tem muitas opções aqui.
Tom J Nowell
Eu me pergunto o que aconteceria se você tentasse criar um ótimo tema para netos.
Chris_O
1
Você mencionou que o método tomou um rumo errado, se você precisar disso. A razão pela qual estou curioso sobre isso é devido a um cenário como o uso do tema WooCommerce Storefront. Eles vendem temas filhos para a montra, personalizados para várias coisas. Portanto, se estou usando um dos temas filhos deles, mas quero fazer minhas próprias alterações de uma maneira que não sejam substituídas quando eles atualizarem o tema filho ... como eu faria isso?
Drew Angell
1
Eu não sei, isso é uma limitação de como o tema loja foi construída, em que ponto você é forçado a desembolsar o tema criança
Tom J Nowell
3

Não testei completamente o método descrito abaixo, nem um tema normal de "neto", mas fornecendo a funcionalidade do 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.

Você também pode, de maneira semelhante, tentar filtros mais específicos, como por exemplo archive_template

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

Tudo dito e feito, não tenho certeza de que é a melhor maneira de fazer as coisas.

krembo99
fonte