В WordPress шорткоды — удобный способ внедрять динамический контент в записи и страницы без прямого редактирования шаблонов. Но часто возникает задача не просто вывести статический текст, а выполнить PHP функцию с передачей параметров и получить результат на странице. В этой статье мы подробно разберём, как создать такой шорткод, обеспечить его безопасность и удобство использования.
Что такое шорткод с вызовом PHP функции
Шорткод — это сокращённый тег в квадратных скобках, например, [my_shortcode], который WordPress заменяет на определённый контент или результат функции. При создании шорткода можно указать, какую PHP функцию нужно вызвать, и передать ей параметры, например, [my_shortcode param1="value1" param2="value2"].
Такой подход позволяет создавать гибкие решения: от вывода данных из базы до интеграций с внешними сервисами и динамического отображения информации.
Однако важно правильно обработать параметры и защитить выполнение кода, чтобы не допустить уязвимостей.
Создание шорткода с передачей параметров — пошагово
Для примера создадим шорткод [wpzoom_run func="function_name" arg1="value1"], который будет вызывать внутри себя PHP функцию с переданными аргументами, и выводить результат.
Шаг 1. Регистрация шорткода
function wpzoom_shortcode_run_function($atts) {
// Разбор параметров с установкой значений по умолчанию
$atts = shortcode_atts(
array(
'func' => '',
'arg1' => '',
'arg2' => '',
), $atts, 'wpzoom_run'
);
$func = sanitize_text_field($atts['func']);
$arg1 = sanitize_text_field($atts['arg1']);
$arg2 = sanitize_text_field($atts['arg2']);
// Проверяем, существует ли функция и разрешена ли к вызову
$allowed_functions = array('wpzoom_test_function', 'wpzoom_another_function');
if (!in_array($func, $allowed_functions) || !function_exists($func)) {
return '<div style="color:red;">Ошибка: функция не найдена или вызов запрещён.</div>';
}
// Вызываем функцию с аргументами
return call_user_func($func, $arg1, $arg2);
}
add_shortcode('wpzoom_run', 'wpzoom_shortcode_run_function');Здесь мы реализовали фильтрацию параметров, проверку разрешённых функций для безопасности и вызов через call_user_func.
Шаг 2. Пример функций для вызова
function wpzoom_test_function($param1, $param2) {
return 'Результат test_function: Param1=' . esc_html($param1) . ', Param2=' . esc_html($param2);
}
function wpzoom_another_function($param1, $param2) {
return 'Другая функция получила: ' . esc_html($param1) . ' и ' . esc_html($param2);
}Добавьте эти функции в файл functions.php или в свой плагин. Теперь можно использовать шорткод:
[wpzoom_run func="wpzoom_test_function" arg1="Привет" arg2="Мир"]
И на странице выведется:
Результат test_function: Param1=Привет, Param2=Мир
Безопасность вызова функций через шорткод
Важно не давать возможность запускать произвольные PHP функции через шорткод — это огромный риск для сайта. В нашем примере мы явно перечислили разрешённые функции в массиве $allowed_functions. Так можно контролировать, что именно можно вызвать.
Также нужно обязательно использовать функции очистки данных, например sanitize_text_field, и экранировать вывод через esc_html или аналогичные средства.
Если вы планируете более сложные функции с разными типами параметров, стоит дополнительно валидировать и фильтровать входящие значения, чтобы избежать SQL-инъекций или XSS-атак.
Расширение шорткода: динамическое количество параметров
В реальных задачах может понадобиться передавать переменное число параметров. Для этого можно передавать их в виде JSON или использовать все атрибуты, кроме func, динамически.
function wpzoom_shortcode_run_function_dynamic($atts) {
$atts = shortcode_atts(array('func' => ''), $atts, 'wpzoom_run');
$func = sanitize_text_field($atts['func']);
$allowed_functions = array('wpzoom_test_function_dynamic');
if (!in_array($func, $allowed_functions) || !function_exists($func)) {
return '<div style="color:red;">Ошибка: функция не найдена или вызов запрещён.</div>';
}
// Удаляем ключ func из параметров
unset($atts['func']);
// Вызываем функцию, передавая все остальные параметры
return call_user_func($func, $atts);
}
add_shortcode('wpzoom_run', 'wpzoom_shortcode_run_function_dynamic');
function wpzoom_test_function_dynamic($params) {
$output = 'Получены параметры:<br>';
foreach ($params as $key => $value) {
$output .= esc_html($key) . ' = ' . esc_html($value) . '<br>';
}
return $output;
}Теперь шорткод может выглядеть так:
[wpzoom_run func="wpzoom_test_function_dynamic" foo="bar" number="123"]
И функция выведет список всех переданных атрибутов.
Практические советы и рекомендации
- Кэширование результатов. Если функция выполняет тяжёлые операции (запросы к БД, API), стоит кэшировать результат, например с помощью Transients API.
- Используйте nonce и проверки прав. Если функция меняет данные, лучше выполнять вызов через AJAX с проверкой nonce и возможностей пользователя.
- Логирование ошибок. При отладке полезно логировать ошибки в файл через
error_logили плагин Clearfy Pro, чтобы быстро находить проблемы. - Оптимизируйте функции. Минимизируйте время выполнения и используйте встроенные функции WordPress для безопасности и совместимости.
Интеграция с плагинами WPShop
Если вы используете плагин Clearfy Pro, он поможет дополнительно обезопасить сайт и оптимизировать работу с кастомными шорткодами.
Плагин Expert Review можно использовать для создания интерактивных отзывов, которые также можно вывести через шорткод с параметрами.