Як завантажити parent_theme function.php перед child_theme?


12

У мене з’явилася проблема, що мені потрібно завантажити functions.phpфайл своєї батьківської теми до завантаження файлу моєї дочірньої теми functions.php. Це потрібно для процедури встановлення та init. Я подивився на гачки всередині /wp_core_root/wp-settings.php (названий:) do_action('setup_theme');.

Проблема полягає в тому, що я не знаю, як підключитися туди, тому що перший файл, який я отримую, є дочірньою темою functions.php, тому жодне не add_action( 'setup_theme', 'my_init_function' );буде працювати.

Редагувати:
а) Я знаю, що плагіни завантажуються раніше, ніж тема, і тому вони можуть отримати доступ навіть до початкового запиту, але я не хочу покладатися на плагін.
б) Ось код (скорочений) з файлу wp-settings.php

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

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

Іншими словами: Як я можу зберегти чистий файл дочірних тем files.php, але чи виконано завантажувальний пристрій для батьківських тем?

Будь-які ідеї? Дуже дякую!


Ви не можете просто включити його?
wyrfel

Моє запитання: звідки? Перший файл, який завантажується в контекст теми, - це дочірня тема functions.php. Погляньте на wp-settings.phpфайл "molto loko" в ядрі (рядок: 275-279 @wp 3.1 rc) ... виглядає так: if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );тому я не бачу шансів ... І я не хочу використовувати плагін для завантаження моєї теми.
кайзер

Я, можливо, щось тут зовсім не вистачає, але якщо ви вставляєте include(/path/to/parent/themes/functions.php)вгорі своїх дочірніх темп funk.php, то все, що там, завантажується раніше. Ні?
wyrfel

@wyrfel: Я оновив Q, щоб зробити його більш зрозумілим
кайзер

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

Відповіді:


11

Джастін Тадлок нещодавно написав чудовий пост про створення кращого файлу function.php,
де (якщо я правильно пам’ятаю) він займається саме цією проблемою.

На жаль, його сайт наразі не працює, тому я зараз повинен покластися на свою пам'ять.

Ви на правильному шляху з after_setup_themeгаком.

  1. Наскільки я пам’ятаю, хитрість полягає в тому, щоб увімкнути свої фільтри та дії у свою функцію.
    Дивіться приклад нижче.
  2. Ви робите , що в обох батьківських і дочірніх functions.phpфайлів.
  3. Тоді ви можете грати з пріоритетом цих двох гаків.

Трохи коду вартістю тисяч слів - тема вашого батьків function.phpмає виглядати так:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

Ем, дякую за написання (+1). У вас вражаючий мозок;). Проблема в тому, що after_setup_themeце занадто пізно, оскільки файли function.php вже завантажені.
кайзер

EDIT: Після переосмислення коду та читання "зробіть це як у батьківській, так і дочірній функціях. Все ще шукаємо кращого рішення, яке користувач не може зламати так просто, але це має сенс! Спасибі!
кайзер

Тут немає ніякого реального рішення, тому я поставила галочку це, оскільки ви першим запропонували це.
кайзер

9

По-перше, ви не можете. Дочірня тема function.php завжди завантажує перший, період.

По-друге, теми не можуть підключитися до setup_theme. Плагіни можуть, але перше, до чого може підключитися тема, це after_setup_theme.

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

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


Дякую за вашу відповідь. Я розумію необхідність завантаження плагінів перед темами і вже зрозумів факт (читайте вище: "І я не хочу використовувати плагін для завантаження теми".). Щоб розробити свій випадок: я отримав файл ini, який піклується про завантаження всіх моїх фреймворкових частин, який запускається в батьківських темах, функцій php з необхідністю файлу та завантаженням init-класу. InitClass піклується про завантаження a) та масив даних із дочірніх тем .ini-файлів, а потім висуває їх у різні класи для подальшої обробки ex. мета поля, типи користувальницьких повідомлень тощо
кайзер

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

3
.... Я думаю, що вам просто доведеться змиритися з тим, що якщо користувач порушує речі, то це справді їхня проблема. Підсумок: Там немає ні способу першого завантаження functions.php батьківської THEME і залишити дитина тему «чистий». Якщо вам потрібно щось запустити в дочірній темі після завантаження файлу батьківської теми function.php, тоді ви помістите його всередину функції, підключеної до after_setup_theme. Це запускається після завантаження обох файлів function.php.
Отто

В порядку. Це не така велика проблема. Я просто зацікавлений, якщо є можливість. Запитання: Що для того, щоб "рамка, яка стоїть солі", тоді була гачка після процедури init, а не просто використовувати after_setup_themeгачок? Тільки для того, щоб не "спамувати" гачок, або тому, що це більше "підприємливість" чи "кул" ер? Я маю на увазі: чи ідея "найкращої практики" за певними паралельними гачками теми "залишає основні гачки для плагінів"? (Ось як я зараз справляюся з цим.)
кайзер

"Якщо ви збираєтеся до цього, не турбуйте зайві дії. Просто підключіться до after_setup_theme." В порядку. Спасибі. +1
кайзер

4

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

Наприкінці parent/functions.php:

do_action('parent_loaded');

В child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

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


Я намагаюся уникати якомога більше інструкцій. Це одна з причин, коли я перейшов з файлу config.php у папку дочірньої теми і тепер замість цього використовую файли ini. В одному реченні: Я намагаюся відійти від свого старого / вашого рішення і якомога ближче повернутися до ядра та кодексу. Моя проблема полягає в тому, що я не можу доставити жодної функції з дочірньої теми, тому що жоден клас чи інший мій завантажувальний файл не доступний у файлі дочірньої теми function.php (не кажучи про теги шаблонів / нестандартних шаблонів).
кайзер

Дивіться оновлену відповідь.
scribu

Я також оновив Q. Прочитавши, що 2/3 відповідей вказують на мене на те саме джерело (тематичне, до редагування), я відчуваю, що існує лише метод "Джастін Тадлок", але я хочу переконатися в цьому.
кайзер

2
Якщо ви збираєтеся до цього, не турбуйте зайві дії. Просто підключіть до after_setup_theme.
Отто

0

Чому ви не включите functions.phpфайл батьківської теми у файл дочірньої теми functions.php, як-от так:

У functions.phpфайлі дочірньої теми :

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

Таким чином, functions.phpфайл батьківської теми не змінюється (іноді це важливо).


як згадується у запитанні: "Іншими словами: Як я можу зберегти чисту дочірню тематику файлу Функції.php, але чи потрібно виконати початкові теми завантаження?" Ще краще: як я уникаю дзвінка з будь-якого файлу function.php? Чому: Люди звикли просто руйнувати кожне лайно, яке вони не хочуть мати у файлах шаблонів. Тож є велика ймовірність, що хтось випадково видалить якісь рядки. Мій досвід: Ніхто насправді не читає коментарів, читань чи документації.
кайзер

0

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

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