Можно ли делать внуковые темы?

15

Если я использую одну из популярных платформ, такую ​​как Genesis, возможно ли создавать темы для внуков?

В качестве примера я хочу использовать Genesis в качестве основы всех моих сайтов. Genesis называется структурой, но на самом деле является родительской темой.

Затем я выбираю одну из дочерних тем Genesis для продажи на StudioPress и хочу продолжить настраивать ее для каждого из моих сайтов. Буду ли я создавать тему внуков для всех своих сайтов, и как мне это сделать?

urok93
источник

Ответы:

17

Да и нет.

Вы можете создать дочернюю тему, указав другую дочернюю тему в качестве родительской, и WordPress попытается использовать ее.

тем не мение

Вы столкнетесь с проблемами, не говоря уже о том, что основные разработчики прямо заявили, что это нежелательное поведение, и они не будут прилагать усилия для поддержки тем внуков.

Например, в WP API проводится различие между таблицей стилей и URL-адресами / каталогами шаблонов, где таблица стилей всегда ссылается на активную тему, а шаблон ссылается на родительскую тему, но если включена тема прародителя, get_template_directory_uriссылается ли родитель или прародитель? Многие вызовы API теперь неоднозначны, и разные люди ожидают различного поведения, включая код, который находится в ядре. Вы бы также необходимо загрузить functions.phpлибо из родителей или прародителей, и убедитесь , что это делается в правильном порядке.

Это также считается очень плохой практикой. Если вам нужны темы для внуков, то ваш подход принял неверный оборот, и вам нужно отступить и переоценить вещи.

Я бы посоветовал вам избегать концепции внуков, это приведет к большему количеству проблем. Вместо этого, больше хуков фильтрует действия и модульность в вашей дочерней теме, что позволит вам сохранить общие компоненты дочерних тем одинаковыми, и позволит вам с легкостью выполнять ветвление / ветвление. Попробуйте переместить общие элементы в подмодуль svn external / git.

Существует также модель _s, в которой ваша дочерняя тема используется в качестве основы, и вы ее разветвляете, вместо того, чтобы использовать ее в качестве родителя с намерением работать с копией, а не как дочернюю / переопределенную.

Том Дж Новелл
источник
Так что в моем случае, если я перейду к Genesis, мне просто нужно изменить дочернюю тему, верно? Не очень знаком с Git, но был бы заинтересован в подходе, который поможет мне сохранить оригинальную дочернюю тему нетронутой.
urok93
Да, у вас нет много вариантов здесь.
Том Дж. Новелл
Интересно, что произойдет, если вы попытаетесь сделать тему великого внука.
Chris_O
1
Вы упоминаете, что метод принял неправильный оборот, если вам это нужно. Причина, по которой мне это интересно, из-за такого сценария, как использование темы WooCommerce Storefront. Они продают дочерние темы в витрине магазина, которые настроены для различных вещей. Поэтому, если я использую одну из их дочерних тем, но затем я хочу внести свои собственные изменения таким образом, чтобы они не были перезаписаны при обновлении их дочерней темы ... как бы я это сделал?
Дрю Энджелл
1
Я не знаю, это ограничение того, как была построена тема витрины магазина, в этот момент вы вынуждены раскошелиться на дочернюю тему
Том Дж. Новелл
3

Я не полностью протестировал метод, описанный ниже, ни обычную тему «внучат», но дал функциональность фильтра 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.

Вы также можете, аналогичным образом, попробовать более конкретные фильтры, такие как, например, archive_template

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

Все, что сказано и сделано, я не уверен, что это лучший способ сделать что-то.

krembo99
источник