Чи можна скласти онукові теми?


15

Якщо я використовую одну з популярних рамок, таких як «Генеза», чи можливо створити онукові теми?

Як приклад, я хочу використовувати Genesis як основу всіх моїх сайтів. Буття називається рамкою, але насправді є батьківською темою.

Потім я вибираю одну з дочірніх тем Genesis для продажу на StudioPress і хочу продовжувати налаштовувати її для кожного з моїх сайтів. Чи буду я створювати тему онука для всіх своїх сайтів, і як би я пішов на цю тему?

Відповіді:


18

Так і ні.

Ви можете створити дочірню тему, вказавши іншу дочірню тему як батьківську, і WordPress намагатиметься використовувати її.

Однак

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

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

Це також вважається дуже поганою практикою. Якщо у вас є потреба в онукових темах, то ваш підхід пішов неправильно, і вам потрібно відступити і переоцінити речі.

Я б радив вам уникати концепції онукових тем, це призведе до більшої кількості проблем. Натомість більше дій фільтрів з гачками та модульність у вашій дочірній темі повинно дозволяти вам тримати однакові спільні компоненти для дочірніх пристроїв, а також ви можете з невеликими труднощами відгалужувати / розвивати. Спробуйте перемістити загальні елементи у підмодуль svn external / git.

Існує також модель _s, де ви базуєте свою дитячу тему як основу, і роздрібнюйте її, а не мати її як батька з наміром працювати над копією, а не дитиною / заміною.


Тож у моєму випадку, якщо я переходжу до книги Буття, мені доведеться безпосередньо змінити дочірню тему правильно? Не дуже знайомий з Git, але був би зацікавлений у підході, який допомагає мені зберегти оригінальну дитячу тему недоторканою.
urok93

Так, тут у вас не так багато варіантів.
Том Дж. Ноуелл

Цікаво, що було б, якби ти спробував зробити тему великого онука.
Chris_O

1
Ви згадуєте, що метод пішов неправильно, якщо вам це потрібно. Мені це цікаво через те, що такий сценарій, як використання теми WooCommerce Storefront, є таким. Вони продають дочірні теми на 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";'));

З усього сказаного і зробленого, я не впевнений, що це найкращий спосіб робити справи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.