É possível criar temas netos?

10

Se eu usar um dos frameworks populares como o Genesis, é possível criar temas para netos?

Como exemplo, quero usar o Genesis como o backbone de todos os meus sites. Gênesis é chamado de quadro, mas na verdade é um tema pai.

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

    
por urok93 21.09.2012 / 13:17

2 respostas

14

Sim e Não.

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

No entanto

Você encontrará problemas, sem mencionar que os principais desenvolvedores declararam explicitamente que isso 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 de 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ô estiver incluído, get_template_directory_uri faz referência pai ou o avô? Várias chamadas de API agora são ambíguas e pessoas diferentes esperariam um comportamento diferente, incluindo o código que está no núcleo. Você também precisa carregar o functions.php do pai ou do avô e certificar-se de que seja feito na ordem correta.

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

Eu aconselho que você evite o conceito de temas netos, isso levará a mais problemas. Em vez disso, mais filtros de ganchos filtram ações e modularidade em seu tema filho, permitindo que você mantenha os componentes compartilhados de temas-filhos iguais e deixe-o com pouca dificuldade. Tente mover elementos comuns para um submódulo svn external / git.

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

    
por Tom J Nowell 21.09.2012 / 13:28
2

Eu não testei completamente o método descrito abaixo, nem um tema "neto" normal, Mas, com 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 forma 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 o que disse e fez, não tenho certeza se é a melhor maneira de fazer as coisas.

    
por krembo99 27.02.2014 / 06:15