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

У Кодексі WordPress дається наступне визначення файлу функцій:
Файл functions.php веде себе, як плагін, додаючи функції і функціонал на WordPress — сайт. Його можна використовувати для виклику як PHP-функцій, так і вбудованих функцій WordPress, для визначення власних функцій. Можна отримати той же результат, додавши код в плагін WordPress або в файл functions.php теми WordPress.

Між functions.php і файлом плагіна існує подібність. Він використовується для коду того ж типу, який можна додати в плагін.

Якщо у вас є багато функціонального коду, який необхідно використовувати на сайті, тоді потрібно помістити цей код плагін. Але якщо код залежить від теми, то functions.php — це саме те місце, де його слід розмістити. Загальне правило:

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

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

Спільне використання файлу функцій

Коли використовувати functions.php:

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

Додавання коду в файл функцій та його активація

Ми додаємо код functions.php і вказуємо WordPress активувати його точно так само, як і у випадку з плагіном:

  • Пишемо функції, які потім викликаємо у файлах шаблонів теми — це корисно, коли є блок коду, який потрібно використовувати в декількох місцях теми, але він не буде працювати як частина шаблону;
  • Прив’язуємо функції до хуку дії або фільтра. Таким чином, функція запускається, коли WordPress зустрічає цей хук. WordPress сам надає в розпорядження розробників сотні хуків. Ви можете знайти деякі з них у своїй темі і плагінах. Якщо ви додаєте в functions.php код для активації певного функціоналу в новій темі, тоді вам потрібно створити дочірню тему. Інакше файл функцій буде перезаписаний відразу після оновлення теми;
  • Створюємо шорткод, який потім додаємо в контент. Я б не рекомендувала додавати шорткод з допомогою файлу PHP function. Краще зробити це за допомогою плагіна, щоб вміст, виведене шорткодом, не пропало, якщо ви поміняєте тему;
  • Створюємо віджет. Це не дуже гарне рішення; якщо ви хочете створити віджет, додайте плагін;
  • Давайте розглянемо, як працювати з файлом functions.php і як з його допомогою додати деякі з поширених функціональних можливостей.

Створення файлу функцій

Якщо ваша тема не містить functions.php, його потрібно створити в кореневому каталозі. Потім потрібно додати в файл відкривається тег PHP, але закривати його не потрібно:

Тепер ваш файл функцій готовий до додавання коду. Краще додавати перед кожним розділом великі блоки закомментированного тексту, щоб легко знайти будь-код:

/************************************************************************
my_function — короткий текст, що описує, що це робить
************************************************************************/

Додавання коду в файл functions.php

Розглянемо деякі часто використовувані функції.

Додавання підтримки теми

У WordPress є певні PHP static function, для яких потрібно додати підтримку темою, щоб скористатися ними:

  • Формати записів — tumblr-формати, такі як standard, video, quote і aside;
  • Мініатюри записів — якщо ви хочете використовувати їх у своїй темі, доведеться додати код для виведення їх у файлах шаблонів. Але вони не будуть доступні в панелі адміністрування, якщо ви не додасте для них підтримку темою;
  • Користувальницький фон — дозволяє настроювати фонове зображення і кольору фону через користувальницький інтерфейс;
  • Користувальницький заголовок, який працює так само, як і користувальницький фон;
  • Автоматичні посилання на канали — для RSS-каналів;
  • HTML5 — для форми пошуку, коментарів, галереї і т. д. Це не впливає на можливість створення коду теми за допомогою HTML5, але відноситься до коду, згенеровані WordPress;
  • Тег заголовка — дозволяє додати тег заголовка в розділ для поліпшення SEO та доступності.

Таким чином, щоб додати, наприклад, підтримку теми для форматів записів, необхідно використовувати функцію add_theme_support():

add_theme_support( ‘post-formats’ );

Деякі з функцій WordPress functions php, для яких додається підтримка темою, мають додаткові параметри. Наприклад, при додаванні підтримки можна вказати формати записів, які потрібно використовувати:

add_theme_support( ‘post-formats’, array( ‘aside’, ‘quote’ ) );

А для спеціальних зображень можна вказати, які типи записів вони будуть підтримуватися:

add_theme_support( ‘post-thumbnails’, array( ‘post’, ‘page’ ) );

Але нічого з цього не спрацює, якщо ви не помістіть свій код всередині функції і не прив’яжете до відповідного хуку дії after_setup_theme. Можна додати всі функції add_theme_support() всередині більш крупної функції, яку ви потім прив’яжете до after_setup_theme. Тому, якщо ви хочете додати підтримку темою мініатюр записів, форматів записів, HTML5 і автоматичних посилань на канали, додайте наступний код у файл функцій:

/*******************************************************************************
wpmu_theme_support — додає підтримку темою форматів записів, мініатюр записів, HTML5 і автоматичних посилань на канали
*******************************************************************************/
function wpmu_theme_support() {
/* формати записів */
add_theme_support( ‘post-formats’, array( ‘aside’, ‘quote’ ) );
/* мініатюри записів */
add_theme_support( ‘post-thumbnails’, array( ‘post’, ‘page’ ) );
/* HTML5 */
add_theme_support( ‘html5’ );
/* автоматичні посилання на канали */
add_theme_support( ‘automatic-feed-links’ );
}
add_action( ‘after_setup_theme’, ‘wpmu_theme_support’ );

Додавання файлу перекладу

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

З допомогою private function PHP load_theme_textdomain() у файлі функцій вкажіть WordPress, де розміщується файл перекладу:

function wpmu_translation() {
load_child_theme_textdomain( ‘wpmu-theme’, get_stylesheet_directory() . ‘/languages’ );
}
add_action( ‘after_setup_theme’, ‘wpmu_translation’ );

Ця функція використовує функцію get_template_directory(), щоб знайти папку теми, а потім шукає в папці languages файл, який починається з wpmu-theme. Тому шлях буде wp-content/themes/mytheme/languages/, а ім’я для файлу мови починається з wpmu-theme, за чим слід код мови.

Реєстрація меню навігації

У файлі functions.php також реєструються меню навігації. У багатьох темах є прапорець «головне меню», який можна встановити в розділі «Меню». Це дає можливість використовувати меню в певному місці теми. Щоб реалізувати подібний функціонал, потрібно використовувати функцію register nav menus():

function wpmu_nav_menus() {
register_nav_menus( array(
‘primary’ => __( ‘Primary Navigation’, ‘wpmu-theme’ ),
) );
}
add_action( ‘after_setup_theme’, ‘wpmu_nav_menus’ );

Цей код реєструє розташування меню, яке буде відображатися у панелі адміністрування як «Основне меню«, а його ідентифікатор буде primary. Потім ви використовуєте цей код для виведення меню у файлі теми header.php.

Зверніть увагу: в коді, наведеному вище, я вже зробила назва меню готовим до перекладу. Тому будь-який користувач, що говорить на іншій мові, буде бачити текст «головне меню», переведеним для нього за допомогою файлу перекладу.

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

function wpmu_nav_menus() {
register_nav_menus( array(
‘primary’ => __( ‘Primary Navigation’, ‘wpmu-theme’ ),
‘sidebar’ => __( ‘Sidebar Navigation’, ‘wpmu-theme’ ),
) );
}
add_action( ‘after_setup_theme’, ‘wpmu_nav_menus’ );

Потрібно додати код в меню файл sidebar.php теми, використовуючи функцію wp_nav_menu().

Підіб’ємо підсумки

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

Можна створити одну велику функцію:

/**********************************************************************************
wpmu_theme_setup — задає параметри теми
— додає підтримку темою форматів записів, мініатюр записів, HTML5 і автоматичних посилань на канали
— реєструє файл перекладу
— реєструє меню навігації
**********************************************************************************/
function wpmu_theme_setup() {
/*******************************
Починаємо з додавання підтримки темою
*******************************/
/* форматів записів */
add_theme_support( ‘post-formats’, array( ‘aside’, ‘quote’ ) );
/* мініатюр записів */
add_theme_support( ‘post-thumbnails’, array( ‘post’, ‘page’ ) );
/* HTML5 */
add_theme_support( ‘html5’ );
/* автоматичних посилань на канали */
add_theme_support( ‘automatic-feed-links’ );
/*******************************
Файл перекладу
*******************************/
load_child_theme_textdomain( ‘wpmu-theme’, get_stylesheet_directory() . ‘/languages’ );
/*******************************
Меню навігації
*******************************/
register_nav_menus( array(
‘primary’ => __( ‘Primary Navigation’, ‘wpmu-theme’ ),
‘sidebar’ => __( ‘Sidebar Navigation’, ‘wpmu-theme’ ),
) );
}
add_action( ‘after_setup_theme’, ‘wpmu_theme_support’ );

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

Включення файлів

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

Створіть у своїй темі папку під назвою includes, а потім додайте в неї окремі файли PHP для кожного блоку коду, який потрібно відокремити. Наприклад, якщо потрібно було перемістити налаштування теми в інший файл, я б перемістила весь наведений вище код у файл з ім’ям theme_setup.phpа потім викликала його в functions.php:

include( get_stylesheet_directory() . ‘/includes/theme_setup.php’ );

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

Робота з батьківськими і дочірніми темами

functions.php може стати ефективним інструментом для роботи з батьківськими і дочірніми темами. У дочірньої темі можна використовувати власний файл функцій для зміни або видалення функцій з батьківського теми, або додавання нових.

Існує три способи зміни або додавання функцій в дочірню тему:

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

Розглянемо кожен із способів.

Підключаються функції

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

Наприклад:

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

Деактивація функцій

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

remove_action( ‘init’, ‘parent_function’ );

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

Примітка. Якщо батьківська функція містить параметр пріоритету в add_action() виконує функцію, яку потрібно деактивувати, вам потрібно вказати той же пріоритет при її деактивації.

Використання пріоритету функції

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

Припустимо, що батьківська тема містить функцію parent_function(), яка активується з допомогою хука init з пріоритетом 20:

function parent_function() {
// Вміст функції.
}
add_action( ‘init’, ‘parent_function’, 20 );

Можна написати функцію, яка перевизначити батьківську функцію, а потім прив’язати її до хуку init з більш високим пріоритетом, наприклад 30:

function child_function() {
// Вміст функції.
}
add_action( ‘init’, ‘child_function’, 30 );

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

Файл функцій — ваш друг

Файл PHP function теми працює дуже схоже на плагін, але він специфічний для конкретної теми. Тому необхідно використовувати його тільки для того, щоб додати функціонал, який може бути відключений при активації іншої теми. У цій статті ви дізналися, для чого використовується файл функцій теми. Працюйте з functions.php обережно, уникайте його використання, коли все що потрібно можна зробити за допомогою плагіна.

Переклад статті «The Ultimate Guide to the WordPress functions.php File» дружною командою проекту Сайтостроение від А до Я.