В современных проектах на WordPress часто возникает необходимость вывода динамического контента, получаемого из внешних API. Такой подход позволяет интегрировать данные из сторонних сервисов и отображать их на страницах сайта через удобные шорткоды. В этой статье мы подробно рассмотрим, как создать динамический шорткод, который будет получать данные из внешнего REST API, обрабатывать их и выводить на сайте.
Почему стоит использовать динамические шорткоды с API
Динамические шорткоды позволяют обновлять контент без необходимости редактировать страницу вручную. Например, это удобно для отображения актуальных курсов валют, новостей, данных с CRM или других систем. Использование внешних API расширяет возможности сайта, делая его интерактивным и более полезным для пользователей.
Кроме того, при правильной реализации можно кэшировать данные, чтобы снизить нагрузку на сервер и улучшить производительность сайта.
Создаем базовую структуру шорткода для вызова API
Для начала создадим простой шорткод, который будет обращаться к внешнему API и выводить полученные данные. Предположим, у нас есть API, возвращающее список последних новостей в формате JSON.
Вставьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpcoding_fetch_external_api_data() {
$response = wp_remote_get('https://api.example.com/latest-news');
if (is_wp_error($response)) {
return 'Ошибка получения данных';
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (empty($data) || !is_array($data)) {
return 'Данные не найдены';
}
$output = '<ul>';
foreach ($data as $item) {
$output .= '<li>' . esc_html($item['title']) . '</li>';
}
$output .= '</ul>';
return $output;
}
add_shortcode('wpcoding_news', 'wpcoding_fetch_external_api_data');Теперь вы можете вставить шорткод [wpcoding_news] в любую страницу или запись, и будет отображаться список новостей из внешнего API.
Обработка ошибок и оптимизация запросов
Важно правильно обрабатывать ошибки при работе с API, чтобы не выводить пользователю нечитабельные сообщения или пустой контент. Мы уже добавили базовую проверку ошибок, но стоит улучшить вывод и добавить кэширование данных.
Для кэширования используем Transients API WordPress. Это позволит сохранить ответ API на некоторое время, снизив количество запросов.
function wpcoding_fetch_external_api_data() {
$cache_key = 'wpcoding_latest_news';
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$response = wp_remote_get('https://api.example.com/latest-news');
if (is_wp_error($response)) {
return 'Ошибка получения данных';
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (empty($data) || !is_array($data)) {
return 'Данные не найдены';
}
$output = '<ul>';
foreach ($data as $item) {
$output .= '<li>' . esc_html($item['title']) . '</li>';
}
$output .= '</ul>';
set_transient($cache_key, $output, 15 * MINUTE_IN_SECONDS); // кэш на 15 минут
return $output;
}
add_shortcode('wpcoding_news', 'wpcoding_fetch_external_api_data');Таким образом, при повторном вызове шорткода в течение 15 минут данные будут браться из кэша, что значительно ускорит загрузку и снизит нагрузку на внешний сервер.
Добавляем параметры в шорткод для гибкости
Чтобы сделать шорткод более универсальным, добавим параметры, например, количество выводимых новостей и категорию.
function wpcoding_fetch_external_api_data($atts) {
$atts = shortcode_atts(
array(
'count' => 5,
'category' => '',
),
$atts,
'wpcoding_news'
);
$cache_key = 'wpcoding_latest_news_' . md5(serialize($atts));
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
$api_url = 'https://api.example.com/latest-news?count=' . intval($atts['count']);
if (!empty($atts['category'])) {
$api_url .= '&category=' . urlencode($atts['category']);
}
$response = wp_remote_get($api_url);
if (is_wp_error($response)) {
return 'Ошибка получения данных';
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (empty($data) || !is_array($data)) {
return 'Данные не найдены';
}
$output = '<ul>';
foreach ($data as $item) {
$output .= '<li>' . esc_html($item['title']) . '</li>';
}
$output .= '</ul>';
set_transient($cache_key, $output, 15 * MINUTE_IN_SECONDS);
return $output;
}
add_shortcode('wpcoding_news', 'wpcoding_fetch_external_api_data');Теперь шорткод можно использовать так:
[wpcoding_news count="10" category="technology"]
И он выведет 10 новостей из категории «technology».
Пример интеграции с плагином WPRemark для комментариев к новостям
Если на вашем сайте установлен плагин WPRemark, можно расширить функциональность и добавлять под каждой новостью блок комментариев WPRemark.
Для этого немного изменим вывод:
foreach ($data as $item) {
$output .= '<li>' . esc_html($item['title']);
$output .= do_shortcode('[wpremark_comments id="' . intval($item['id']) . '"]');
$output .= '</li>';
}Так посетители смогут обсуждать каждую новость прямо на сайте, а данные комментариев будут обрабатываться плагином WPRemark.
Советы по безопасности и производительности
1. Всегда используйте функции экранирования, такие как esc_html(), чтобы избежать XSS-уязвимостей при выводе данных из внешних источников.
2. Кэшируйте результаты запросов, чтобы минимизировать задержки и нагрузку.
3. Обрабатывайте ошибки и возвращайте понятные сообщения для пользователей.
4. Ограничивайте параметры шорткода, чтобы не допустить излишних запросов или чрезмерной нагрузки.
5. При необходимости используйте WP Cron или сторонние задачи для предварительного обновления кэша.
Заключение
Создание динамического шорткода с подключением к внешнему API — отличное решение для интеграции актуального контента на сайт WordPress. Такой подход позволяет автоматизировать обновление данных и расширить возможности сайта без лишних усилий.
Используйте описанные методы, адаптируйте код под свои задачи и не забывайте про безопасность и оптимизацию. Если вы хотите более продвинутые возможности, обратите внимание на готовые плагины, например, WPRemark для комментариев или WPGPT для генерации контента на основе AI.