WordPress PHP функции: варианты реализации и типовые сценарии
Функции WordPress на PHP: назначение и варианты использования
Как эффективно создавать и использовать собственные функции в WordPress?
Наиболее эффективный подход - добавление пользовательских функций в файл functions.php активной темы с последующей привязкой к хукам через add_action() или add_filter(). Это позволяет модифицировать ядро системы без изменения его исходного кода.
// Добавление пользовательской функции в functions.php
function my_theme_setup() {
add_theme_support('post-thumbnails');
register_nav_menus(array('primary' => 'Основное меню'));
}
add_action('after_setup_theme', 'my_theme_setup');
Пояснение: функция my_theme_setup() регистрирует поддержку миниатюр и меню, а хук after_setup_theme гарантирует выполнение после загрузки темы. Такой подход сохраняет изменения при обновлении темы.
function_exists() или использовать классы/пространства имён.Как организовать функции в отдельных файлах для улучшения читаемости?
Создание отдельных файлов в папке /inc/ и подключение через require_once внутри functions.php.
// functions.php
require_once get_template_directory() . '/inc/customizer.php';
require_once get_template_directory() . '/inc/shortcodes.php';
Каждый файл содержит функции для своей области. Это упрощает поддержку и повторное использование кода.
get_template_directory() или get_stylesheet_directory() для дочерних тем.Как избежать конфликтов имён при большом количестве функций?
Использование классов для группировки связанных функций. Пример класса для работы с метабоксами:
class Custom_Meta_Box {
public function __construct() {
add_action('add_meta_boxes', array($this, 'add_custom_box'));
add_action('save_post', array($this, 'save_box_data'));
}
public function add_custom_box() {
add_meta_box('custom_box_id', 'Дополнительные данные', array($this, 'render_box'), 'post');
}
public function render_box($post) {
// вывод полей
}
public function save_box_data($post_id) {
// сохранение
}
}
new Custom_Meta_Box();
Класс инкапсулирует логику и предотвращает глобальное загрязнение пространства имён.
Как использовать анонимные функции (замыкания) в качестве обработчиков хуков?
Анонимные функции удобны для простых одноразовых задач. Пример добавления CSS из плагина:
add_action('wp_enqueue_scripts', function() {
wp_enqueue_style('my-plugin-style', plugin_dir_url(__FILE__) . 'style.css');
});
Не требуется именовать функцию, но такие замыкания нельзя удалить через remove_action() без сохранения ссылки.
Как добавлять функции без редактирования темы (для пользователей без доступа к FTP)?
Плагин Code Snippets позволяет вставлять PHP-код через админпанель. Пример сниппета для вывода уведомлений:
add_action('wp_body_open', function() {
echo 'Добро пожаловать!';
});
Сниппет можно активировать/деактивировать без FTP. Это безопасно для начинающих.
Примеры расширенного использования функций WordPress на PHP с кодом и результатами.
// 1. Фильтрация контента: замена слов в записях
function replace_words($content) {
$search = array('старая', 'плохая');
$replace = array('новая', 'отличная');
return str_replace($search, $replace, $content);
}
add_filter('the_content', 'replace_words');
Результат: при выводе записи слово “старая” заменяется на “новая”, “плохая” на “отличная”. Фильтр применяется ко всем записям.
// 2. Добавление шорткода: [year] для отображения текущего года
function year_shortcode() {
return date('Y');
}
add_shortcode('year', 'year_shortcode');
Использование в редакторе: [year] → 2025 (текущий год).
// 3. REST API: добавление нового поля в ответе пользователя
function add_user_avatar($response, $user, $request) {
$response->data['avatar'] = get_avatar_url($user->ID);
return $response;
}
add_filter('rest_prepare_user', 'add_user_avatar', 10, 3);
GET /wp/v2/users/1 вернёт JSON с полем “avatar”: “http://…”.
// 4. Создание кастомной страницы настроек плагина
function my_plugin_settings_page() {
add_options_page('Настройки плагина', 'Мой плагин', 'manage_options', 'my-plugin', 'my_plugin_render');
}
add_action('admin_menu', 'my_plugin_settings_page');
function my_plugin_render() {
echo 'Настройки
';
}
Появляется страница “Мой плагин” в меню Настройки, где можно сохранить опции плагина.
// 5. Кеширование результатов функции с помощью транзиентов
function get_expensive_data() {
$data = get_transient('my_expensive_data');
if (false === $data) {
$data = some_heavy_computation();
set_transient('my_expensive_data', $data, HOUR_IN_SECONDS);
}
return $data;
}
Функция вычисляет данные один раз и кэширует на час, снижая нагрузку на сервер.
// 6. Динамическое добавление кастомных типов записей через функцию
function create_product_post_type() {
register_post_type('product',
array(
'labels' => array('name' => 'Товары'),
'public' => true,
'menu_icon' => 'dashicons-cart',
'supports' => array('title', 'editor', 'thumbnail')
)
);
}
add_action('init', 'create_product_post_type');
В админпанели появляется пункт “Товары”, записи этого типа доступны на сайте.
// 7. Использование пространства имён для функций в плагине
namespace MyPlugin;
function init() {
add_action('wp_enqueue_scripts', __NAMESPACE__ . '\\enqueue_assets');
}
function enqueue_assets() {
wp_enqueue_style('my-plugin-style', plugin_dir_url(__FILE__) . 'style.css');
}
add_action('plugins_loaded', __NAMESPACE__ . '\\init');
Пространство имён MyPlugin предотвращает конфликты с функциями других плагинов или темы.