Проблеми, пов’язані з таблицями стилів батьків та дітей з переглянутим методом Codex


9

У цій публікації виникає кілька питань, з якими я стикався стосовно останніх змін навколо таблиць стилів, що приводять до цього потоку та цієї теми .

Проблеми, з якими я стикався, виникали в загальному сценарії використання, використовуючи широко використовувану та доглянуту батьківську тему, яка спеціально є дочірньою темою, готовою до встановлення WP 4.0. Тема моєї дочірні функції.php містить лише wp_enqueue_styleфункцію, детально описану в Кодексі .

Зауважте, що, хоча наведений нижче код є специфічним для цієї теми, значна частина використовує поточні умови кодування, використовувані для батьківських тем. Крім того, мої проблеми, які викликають занепокоєння, скоріш за все повторюються на велику кількість встановлених батьківських тем, що зараз є в дикій природі. Також питання, які вони піднімають, застосовні на універсальному рівні, незалежно від того, яка батьківська тема використовується.

ВИПУСК 1: Двох черговість

Рекомендована настройка:

Батьківська тема - це стимуляція стилів та сценаріїв за допомогою wp_enqueue_scriptsгачка, причому належна частина полягає в наступному:

add_action('wp_enqueue_scripts', 'parent_theme_function_name');
function parent_theme_function_name() {
    wp_register_style( 'avia-style' ,  $child_theme_url."/style.css", array(),  '2', 'all' );
    wp_enqueue_style( 'avia-base');
    if($child_theme_url !=  $template_url) { wp_enqueue_style( 'avia-style'); }
}

Тема моєї дитини functions.phpстосується стилів за останніми змінами кодексу:

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style' );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
}

Зверніть увагу на такі ідентифікатори, які використовуються у згаданому коді:

  • id='dm-parent-style-css' - це таблиця стилів батьківської теми, як це стосується функції моєї дочірньої теми
  • id='avia-style-css' - це таблиця стилів моєї дочірньої теми, яку охоплює функція батьківської теми
  • id='dm-child-style-css' - це таблиця стилів моєї дочірньої теми, яку охоплює функція моєї дитини

Результати:

На перший погляд, все було добре, <head> показав такий порядок:

<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

Після встановлення плагіна порядок enqueue тепер змінився таким чином:

<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->

Зрештою, мені потрібен файл css для моєї дитини після будь-яких плагінів, тому я змушений був додати номер пріоритету до функції в моїй дочірній темі (див. Попереднє обговорення щодо пріоритетного номера) .

Оскільки моя функція запускає лише css батьківської теми, результат є те, що тепер css теми для батьківської теми переміщується до кінця, залишаючи css теми моєї дитини в ще гіршому становищі, ніж раніше.

<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />

Тепер я змушений вдатися до того, щоб зайнятися моїм стилем теми для дитини, щоб переконатися, що він повернеться до передньої частини рядка, викликаючи вищезгадану проблему двозначного (новий термін? Lol) дочірньої теми CSS.

Застаріле налаштування:

Переглянута функція у дочірній темі:

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style', 99 );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
    wp_enqueue_style( 'dm-child-style', get_stylesheet_directory_uri().'/style.css' );
}

Результати:

Виконуючи наступне замовлення у <head>:

<!-- Multiple individual parent theme styles here -->
<link rel='stylesheet' id='avia-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />
<!-- Pesky plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<link rel='stylesheet' id='dm-child-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

Навіть незважаючи на те, що включення в мою функцію дочірнього аркуша стилів призвело до його введення в дію двічі, IMHO є кращим над кодуванням з припущенням, що батьківська тема належним чином додасть нам наш дочірній таблицю стилів. Виходячи з ідентифікатора, призначеного кожному стилю, що додається, виявляється, що батьківська тема запускає його, а не що-небудь у WP Core.

Мій Шивм:

Хоча я навряд чи запропонував би це бути рекомендованим засобом (і я впевнений, що розробники з більшим досвідом кодування, ніж я буду стогнати над цим рішенням), я скасував ідентифікатор батьківської теми (використовувався для привласнення стилю моєї дитячої теми) прямо над власним записом у файлі функцій теми моєї дитини, як показано:

add_action( 'wp_enqueue_scripts', 'enqueue_parent_theme_style', 99 );
function enqueue_parent_theme_style() {
    wp_enqueue_style( 'dm-parent-style', get_template_directory_uri().'/style.css' );
    wp_dequeue_style( 'avia-style' );
    wp_enqueue_style( 'dm-child-style', get_stylesheet_directory_uri().'/style.css' );
}

Результати:

Це вирішило існуючі проблеми, в результаті чого:

<!-- Multiple individual parent theme styles here -->
<!-- Plugin styles -->
<link rel='stylesheet' id='dm-parent-style-css' href='testinstall.dev/wp-content/themes/enfold/style.css?ver=4.0' type='text/css' media='all' />
<link rel='stylesheet' id='dm-child-style-css' href='testinstall.dev/wp-content/themes/child-theme/style.css?ver=2' type='text/css' media='all' />

Звичайно, для цього потрібно знати ідентифікатор, що використовується батьківською темою - щось стандартне потрібно буде використовувати як стандартну методологію розробки дочірньої теми.

ВИПУСК 2: Таблиці стилів для переселених дітей

(Здається, важко повірити, що це не з'явилося в іншій темі, хоча я не побачив конкретних під час перегляду ... якщо я пропустив це, не соромтеся донести це до мене.)

Я ніколи не використовую за замовчуванням style.cssу кореневій темі дочірньої теми для моїх стилів тем - це, очевидно, повинно бути там, але всі мої фактичні стилі збираються з SCSS як мінімізований файл .css в / css / директорії. Хоча я усвідомлюю, що це не "очікувана норма" на універсальному рівні для розвитку дитячої тематики, більшість серйозних розробників WordPress, яких я знаю, роблять щось подібне. Звичайно, це вимагає вручну запустити цю таблицю стилів у моїй функції, незалежно від того, підкріплювала її батьківська тема чи ні.

Підсумовуючи все це ...

  1. Чи безпечно включати припущення про те, що батьківські теми належним чином переймають стилі дочірніх тем, з позицій дитячих стандартних тем?
  2. Видалення пріоритету може потенційно створити більше плутанини для частини спільноти WordPress, коли дочірні стилі теми починають перезаписувати плагін. Ми очікуємо, що теми замінять стилі, але не так з плагінами.
  3. Використовуючи спеціальний таблицю стилів для фактичних стилів дочірньої теми (як передбачається, розміщуючи їх заздалегідь style.css), необхідність вручну створювати цей файл вручну. Що стосується збереження наступності для широкого кола розробників, чи не було б сенсу заохочувати вручну залучати дочірній таблицю стилів незалежно від можливого дубліката?

Я впевнений, що існує дискусія щодо того, як структурувати стосунки дитина-батько-тема. Я не думаю, що це просто припустити щось про батьківську тему. Я особисто вважаю за краще вручну завантажувати стилі в дочірню тему. Але це рішення, які потрібно приймати щодо природи дитячої теми і чітко повідомляти про це. Якщо дочірні теми призначені лише для простих візуальних налаштувань, то, можливо, батько завантажує таблицю стилів дитини. Але якщо батьківська тема є рамкою, то я б пішов назустріч дочінній темі, завантажуючи таблиці стилів.
Seamus Leahy

Відповіді:


5

ПИТАННЯ 1

Чи безпечно включати припущення про те, що батьківські теми належним чином переймають стилі дочірніх тем, з позицій дитячих стандартних тем?

Загальне правило, так. Але , ніколи не слід припускати . Більшість катастроф і невдач у прямому ефірі пов'язані з припущеннями або фактами, заснованими на припущенні

ФАКТИ БЕЗ ПІДПРИЄМСТВ

  • Спочатку завантажується дочірня тема function.php, потім батьківська function.php. Це гарантує завантаження основного таблиці стилів батьківської теми перед основним таблицею стилів дочірньої теми з оновленого коду в кодексі

  • Давайте подивимось на пакетну тему, двадцять тв. Магія відбувається тут wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );. Ось так зав'язується основна таблиця стилів. Коли тема активна як батьківська тема, style.css буде завантажений з батьківської теми, як get_stylesheet_uri()буде вказано на адресу батьківського каталогу style.css.

  • Коли ви переходите на дочірню тему, get_stylesheet_uri()"змінює" свій шлях, щоб вказати на style.css дочірньої теми, тобто тепер, замість того, що wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );завантажує батьківський style.css, він завантажує дочірній style.css

  • Усі інші стилі з батьківської теми завантажуються, як правило, у тому порядку, який вони написали

ЛОТИНИ

  • Вбудовані стилі та таблиці стилів, які додаються безпосередньо до шаблону заголовка. Я провів тестування з цього питання. Якщо батьківський таблицю стилів не заповнюється за допомогою wp_enqueue_scriptsта безпосередньо завантажується в заголовок, то спочатку завантажується основна таблиця стилів дочірньої теми. Як вирішення цього питання, я раніше рекомендував скопіювати header.php з батьків у дочірню тему та видалити ці виклики. Тоді вам доведеться заздалегідь заздалегідь задати і батьківський, і дочірній стилі теми, і будь-які інші таблиці стилів, які безпосередньо завантажувались у header.php, як це було визначено в функції знецінення OP.

  • Я стикався з цим раз чи два, де стилі (та сценарії) безпосередньо завантажуються в заголовок, і через це заклик до wp_headопущено. Це змусить вас невдало провалити дії, тому ваші стилі просто не відображатимуться.

  • Встановлено неправильні пріоритети. Не потрібно встановлювати пріоритети - це дії батьків або дітей, коли ви підключаєте свої функції enqueueu. Коли обидва мають однаковий пріоритет за замовчуванням, застосовується правило першого приходу, першого обслуговування. Це забезпечить правильність порядку завантаження

ПРИМІТКА ДЛЯ РІДНІХ ТЕМИ АВТОРІВ

Правильно прийнятий метод додавання стилів та сценаріїв до теми - це wp_enqueue_scriptsгачок дій. Ніколи не додайте стилі та сценарії безпосередньо в шаблон заголовка, і не встановлюйте жодного пріоритету вашої дії під час підключення функції

Завжди також завантажуйте основні таблиці стилів так:

wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );

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

ВАША ВІДПОВІДАЛЬНІСТЬ ЯК АВТОР ТЕМИ ДІТЕЙ

  • Знайдіть свій час і працюйте над батьківською темою. Знайте свою батьківську тему, переконайтеся, що вам зручні структури тем і як використовуються функції та гачки в цій темі. Ви не можете створити успішну дочірню тему, якщо не знаєте, як працює батьківська тема. Ваша відповідальність - переконатися, що стилі та сценарії завантажуються належним чином, щоб ваш код працював так, як очікувалося.

  • Завжди повідомляйте автора батьківської теми про будь-який код, яким ви не задоволені. Наприклад, якщо автор додав свої стилі безпосередньо до заголовка, сповістіть про це і дайте йому знати, що це неправильний спосіб зробити це, і попросіть його виправити це в майбутньому випуску

ЗАПИТАННЯ 2

Видалення пріоритету може потенційно створити більше плутанини для частини спільноти WordPress, коли дочірні стилі теми починають перезаписувати плагін. Ми очікуємо, що теми замінять стилі, але не так з плагінами

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

У вас також завжди є можливість скасувати та скасувати реєстрацію стилю (та скрипту), який вам не потрібен, або який вам потрібно змінити пріоритет і потребувати повторного перегляду та перереєструвати їх, як у вашому коді вище (що цілком чудово). Лише зауваження про ваш шивм , найкраще відмовитись та скасувати реєстрацію стилю та сценарію.

ПИТАННЯ 3

Використовуючи таблицю стилів для власних стилів дочірньої тематики (як передбачається, розміщуючи їх у заздалегідь визначеному style.css), необхідність вручну запускати цей файл вручну. Що стосується збереження наступності для широкого кола розробників, чи не було б сенсу заохочувати вручну залучати дочірній таблицю стилів незалежно від можливого дубліката?

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

Таблиці стилів не існують, щоб додати функціональність, але вони можуть додати візуального досвіду користувачеві. Стилі також безпосередньо надсилають як є у браузер, якщо він обробляється. Wordpress тут не грає ніякої ролі.

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

ІМХО, дублікати ніколи не є добрими і завжди повинні їх уникати. Я б запропонував, що якщо ви дійсно хочете вручну зав'язати основний таблицю стилів дитини з будь-якої причини, ви повинні використовувати свій код у своїй шивмі . Видаліть та скасуйте реєстрацію дублікату, який додано за замовчуванням, а потім вимагати отримання таблиці стилів як звичайного.

Також слід пам’ятати лише одне, що функції enqueue та register мають $dependancyпараметр, який ви також можете використовувати. Тож легко завантажити вторинну таблицю стилів і зробити її залежною від основного таблиці стилів вашої дитячої теми

В ЗАКЛЮЧЕННІ

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


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

Будь ласка, зробіть це. Я дуже хотів би почути з цього приводу інші думки. Моя відповідь - це моя думка, заснована на моєму тесті, тому це, безумовно, не альфа та омега. З нетерпінням чекаю вашої думки :-)
Пітер Гузен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.