Хуки WordPress та анонімні функції

Привіт:) У цьому пості покажу як використовувати анонімні функції у хуках (фільтрах та екшенах) WordPress.

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

Contents:

Хуки бувають двох типів:

  • Actions (екшени) — виконують певний код у визначений момент;
  • Filters (фільтри) — змінюють дані перед їх використанням.

Стандартний спосіб підключення функції до хука

Зазвичай щоб прикріпити користувацьку колбек-функцію до хука використовують наступний код

// Екшен
add_action( $hook_name, $callback, $priority, $accepted_args );

// Фільтр
add_filter( $hook_name, $callback, $priority, $accepted_args );

Наприклад:

add_action( 'wp_head', 'mp_add_to_header' );
if ( ! function_exists( 'mp_add_to_header' ) ) {
  function mp_add_to_header() {
    echo 'Hello, Wordl!';
  }
}

У цьому прикладі функція mp_add_to_header() буде виконана всередині HTML-тегу <head> сторінки.

back to contents ↑

Використання анонімних функцій у WordPress

Починаючи з PHP 5.3, з'явилась можливість використовувати анонімні функції (closures).

Вони дозволяють передати функцію без створення окремого іменованого callback.

Приклад для фільтру:

add_filter( 'назва_фільтру', function() {
    // тіло функції
} );

Приклад для екшену:

add_action( 'назва_екшену', function() {
// тіло функції
} );

Той самий приклад з wp_head можна переписати так:

add_action( 'wp_head', function() {
    echo 'Hello, Wordl!';
} );

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

back to contents ↑

Коли варто використовувати анонімні функції

Анонімні функції добре підходять коли:

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

Наприклад:

add_filter( 'the_title', function( $title ) {
return '★ ' . $title;
} );

Тут перед кожним заголовком запису додається символ.

back to contents ↑

Недоліки анонімних функцій у WordPress

Основна проблема анонімних функцій — їх складно відкріпити від хука.

Наприклад:

add_action( 'wp_head', function() {
	echo '<style>
            body {
                background-color: red ! important;
            }
          </style>';
} );

Такий код неможливо відмінити через remove_action(), оскільки WordPress не має посилання на callback.

Щоб змінити поведінку доведеться:

  • редагувати код,
  • закоментувати його,
  • або переписати логіку.
back to contents ↑

Як зробити анонімну функцію керованою

Якщо потрібно мати можливість вимикати анонімну функцію, її можна записати у змінну.

$adminInitCallback = '';
$adminInitCallback = function() {
    echo '<style>
            body {
                background-color: red ! important;
            }
          </style>';
};

if ( $adminInitCallback ) {
	add_action( 'wp_head', $adminInitCallback );
}

Тепер WordPress має посилання на callback, і його можна відкріпити.

Як змінити поведінку функції

Якщо потрібно змінити логіку функції, можна зробити так:

remove_action( 'wp_head', $adminInitCallback );
add_action( 'wp_head', 'mp_add_to_header' );
if ( ! function_exists( 'mp_add_to_header' ) ) {
  function mp_add_to_header() {
    echo '<style>
            body {
                background-color: green ! important;
            }
          </style>';
  }
}

Або використати нову анонімну функцію:

remove_action( 'wp_head', $adminInitCallback );
add_action( 'wp_head', function() {
    echo '<style>
            body {
                background-color: green ! important;
            }
          </style>';
} );

У цьому прикладі:

  • add_action() підключає нову,
  • remove_action() відкріплює стару функцію.
back to contents ↑

Використання змінних всередині анонімної функції

Closure також дозволяють використовувати змінні із зовнішнього коду через use.

Наприклад:

$color = 'blue';

add_action( 'wp_head', function() use ( $color ) {
    echo "<style>body { background-color: $color; }</style>";
} );

Це дозволяє передавати значення у функцію без глобальних змінних.

Корисні патерни використання анонімних функцій у WordPress

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

Передача параметрів у фільтр

Багато фільтрів WordPress передають параметри у callback-функцію.

Наприклад, фільтр the_content передає текст посту:

add_filter( 'the_content', function( $content ) {
    return $content . '<p>Дякуємо за прочитання статті!</p>';
} );

У цьому прикладі:

  • $content — це контент посту;
  • функція змінює його та повертає нове значення.

Важливо пам'ятати: фільтри повинні повертати значення, інакше дані можуть зникнути.

back to contents ↑

Використання пріоритету хуку

Іноді потрібно змінити порядок виконання функцій.

Для цього використовується параметр priority.

add_action( 'wp_footer', function() {
    echo '<p>Footer message</p>';
}, 20 );

Пояснення параметрів:

add_action( $hook, $callback, $priority, $accepted_args );
  • priority — порядок виконання (за замовчуванням 10),
  • менше число → виконується раніше,
  • більше число → виконується пізніше.
back to contents ↑

Передача зовнішніх змінних через use

Closure дозволяють передавати змінні із зовнішнього коду.

$message = 'Hello WordPress';

add_action( 'wp_footer', function() use ( $message ) {
echo "<p>$message</p>";
} );

Це зручно, коли потрібно використати значення змінної без створення глобальних змінних.

Використання анонімних функцій у циклах

Іноді потрібно динамічно створювати декілька хуків.

$hooks = array( 
'wp_head',
'wp_footer'
);

foreach ( $hooks as $hook ) {
add_action( $hook, function() use ( $hook ) {
echo "<!-- Hook executed: $hook -->";
} );
}

Такий підхід дозволяє генерувати callback-функції динамічно.

Closure для швидких helper-функцій

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

Наприклад:

add_filter( 'excerpt_length', function() {
    return 20;
} );

Цей код змінює довжину excerpt до 20 слів.

Коли краще НЕ використовувати анонімні функції

Навіть попри зручність closure, у WordPress є випадки, коли їх краще уникати.

Наприклад:

  • у великих плагінах,
  • у великих темах,
  • коли функцію потрібно відключати через remove_action(),
  • коли код має бути перевизначений у дочірній темі.

У таких ситуаціях краще використовувати іменовані функції або методи класів.

back to contents ↑

Порада для WordPress-розробників

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

Але якщо код:

  • росте,
  • використовується повторно,
  • або стає складнішим,

— краще винести його у окрему функцію або клас.

Це зробить код:

  • більш читабельним,
  • легшим для підтримки,
  • суміснішим із плагінами та дочірніми темами.
back to contents ↑

Практичні приклади використання анонімних функцій у WordPress

Нижче наведу декілька реальних прикладів використання анонімних функцій у хуках WordPress.

Зміна довжини excerpt

За замовчуванням WordPress обрізає анонс запису до 55 слів. Це можна легко змінити:

add_filter( 'excerpt_length', function() {
return 20;
} );

Тепер анонс постів буде складатися з 20 слів.

Зміна тексту "Read more"

WordPress додає після excerpt текст [...]. Його можна замінити на власний.

add_filter( 'excerpt_more', function() {
return '...';
} );

Або зробити посилання на запис:

add_filter( 'excerpt_more', function() {
return ' <a href="' . get_permalink() . '">Читати далі</a>';
} );

Додавання CSS або JS у <head>

Іноді потрібно швидко додати стилі або скрипт без створення окремого файлу.

add_action( 'wp_head', function() {
echo '<style>
.highlight {
background: yellow;
}
</style>';
} );

Такий підхід часто використовують для невеликих кастомних стилів.

Можна легко додати свій HTML у footer:

add_action( 'wp_footer', function() {
echo '<p style="text-align:center;">© ' . date( 'Y' ) . ' My Website</p>';
} );

Відключення WordPress Emoji

WordPress автоматично підключає скрипти для emoji, але на багатьох сайтах вони не потрібні.

add_action( 'init', function() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

} );

Це дозволяє трохи оптимізувати завантаження сайту.

Додавання класу до тегу body

Іноді потрібно додати власний CSS-клас до <body>.

add_filter( 'body_class', function( $classes ) {
$classes[] = 'my-custom-class';

return $classes;
} );

Відключення admin bar на фронтенді

Якщо потрібно приховати верхню адмін-панель WordPress:

add_filter( 'show_admin_bar', function() {
return false;
} );

Додавання атрибута loading="lazy" до зображень

Можна автоматично змінити HTML контенту постів. Це допоможе оптимізувати швидкість завантаження сторінки.

add_filter( 'the_content', function( $content ) {

$content = str_replace(
'<img',
'<img loading="lazy"',
$content
);

return $content;
} );

Висновок

Анонімні функції у WordPress — це зручний спосіб швидко додати просту логіку до actions та filters.

Їх переваги:

  • короткий та чистий код
  • не потрібно створювати окрему функцію
  • зручно для невеликих задач

Недоліки:

  • складно відкріпити від хука
  • важче перевизначати у темах або плагінах
  • можуть ускладнювати підтримку коду

Тому у великих проектах зазвичай рекомендується використовувати іменовані функції, а анонімні залишати лише для невеликих helper-рішень.

✅ Таким чином, анонімні функції можуть зробити код WordPress більш компактним, але використовувати їх вар

Михайло Петров
Михайло Петров

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, інтернет-магазини, блоги на WordPress. Надаю консультації з WordPress.