Більше результатів...

Загальні селектори
Тільки точні збіги
Шукати у заголовках
Шукати у контенті
Вибір типів постів
Фільтрувати за категоріями
FAQ
Hostenko
Натхнення
Відео уроки
Новини
Плагіни
теми
Уроки
Хакі

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

Дивіться також:

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

У цьому уроці ми розглянемо три способи перевизначення функцій батьківської теми в дочірній темі, а саме:

  • Функції, що підключаються (відомих як pluggable functions)
  • Пріоритет функцій
  • Відкріплення функцій із хука, до якого вони прикріплені

Як працюють функції у батьківській та у дочірній темах

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

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

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

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

1. Функції, що підключаються

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

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

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

<?php
if ( ! function_exists ( 'my_function' ) ) {
    function my_function() {
        // Contents of your function here.
    }
}
?>

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

Потім при створенні функції в дочірній темі, дію якої потрібно скасувати в активній батьківській, необхідно дати їй таку назву, як і функції в батьківській:

<?php
function my_function() {
    // Contents for your function override here.
}
?>

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

2. Пріоритет функцій

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

При створенні функцій можна розставити їхній пріоритет, що повідомить WordPress про те, коли і яку використовувати.

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

Уявимо, що функція в батьківській темі не є такою, що підключається і виглядає ось так:

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function' );
?>

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

Це означає, що функція в дочірній темі виглядатиме приблизно так:

<?php
function child_function() {
    // Contents for your function here.
}
add_action( 'init', 'child_function', 15 );
?>

Інший варіант — спочатку присвоїти функції у батьківській темі пріоритет 20:

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function', 20 );
?>

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

<?php
function child_function() {
    // Contents for your function here.
}
add_action( 'init', 'child_function', 25 );
?>

3. Відв'язування функцій від хуків

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

В цьому випадку можна відв'язати батьківську функцію з хука, до якого вона була прикріплена. Це можна зробити за допомогою функції remove_action () або remove_filter(). Яку з них використовувати залежить від того, чи функція прикріплена до хуку action або хуку filter в батьківській темі.

Давайте на секунду повернемося до попередньої функції у батьківській темі:

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function' );
?>

Щоб відкріпити цю функцію від хука action та згодом запобігти її виконанню після дочірньої функції, потрібно створити функцію у дочірній темі за допомогою remove_action ():

<?php
remove_action( 'init', 'parent_function' );
?>

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

<?php
function child_remove_parent_function() {
    remove_action( 'init', 'parent_function' );
}
add_action( 'wp_loaded', 'child_remove_parent_function' );
?>

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

Про пріоритети у функціях

Потрібно враховувати, що при видаленні функції із заданим пріоритетом за допомогою remove_action () або remove_filter(), потрібно включити пріоритет і при видаленні цієї функції. Інакше нічого не працюватиме.

Отже, якщо функція в батьківській темі виглядає так:

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function', 15 );
?>

…то потрібно включити те саме значення пріоритету і за її видаленні:

<?php
function child_remove_parent_function() {
    remove_action( 'widgets_init', 'parent_function', 15 );
}
add_action( 'wp_loaded', 'child_remove_parent_function' );
?>

Висновок

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

Джерело: code.tutsplus.com
редактор wpcafe
Вивчає сайтобудування з 2008 року. Практикуючий вебмайстер, який спеціалізується на створенні сайтів на WordPress. Задати питання Олексію можна на https://profiles.wordpress.org/wpthemeus/

Коментарі до запису: 2

Михайло Лисецький (MacKor):

А ось як перевизначити функцію плагіна?

Олексій:

Добридень! Допоможіть будь-ласка перезаписати функцію батьківської теми. Читав вашу статтю, але не зміг розібратися. Функція в батьківській темі: add_filter( 'enlightenment_entry_meta_args', 'enlightenment_filter_entry_meta_args');

function enlightenment_filter_entry_meta_args( $args ) {….

Додати коментар або відгук