В WordPress шорткоды — это мощный инструмент для динамического вывода контента. Однако часто возникает задача вывести из базы данных кастомные данные, которые не входят в стандартный цикл постов. В этой статье я расскажу, как создать собственный шорткод для вывода данных из базы WordPress с примерами кода и оптимальными подходами для безопасности и производительности.
Что такое шорткод в WordPress и зачем создавать свои
Шорткод — это специальный тег, который пользователь добавляет в редактор, а WordPress подменяет его на нужный HTML-код. Например, [gallery] выводит галерею изображений. Создание собственного шорткода позволяет:
- Динамически выводить кастомные данные.
- Избежать жесткого встраивания кода в темы.
- Повысить удобство редактирования контента.
Особенно полезно, когда нужно вывести данные из кастомных таблиц или нестандартных метаполей.
Создание простого шорткода для выборки данных из таблицы wp_postmeta
Рассмотрим пример, как вывести список значений метаполя _my_custom_field для всех опубликованных постов. Создадим функцию wpturbo_shortcode_custom_field() и зарегистрируем шорткод [wpturbo_custom_field].
function wpturbo_shortcode_custom_field() {
global $wpdb;
$results = $wpdb->get_col(
"SELECT meta_value FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE pm.meta_key = '_my_custom_field' AND p.post_status = 'publish'"
);
if (empty($results)) {
return '<p>Данные не найдены.</p>';
}
$output = '<ul>';
foreach ($results as $value) {
$output .= '<li>' . esc_html($value) . '</li>';
}
$output .= '</ul>';
return $output;
}
add_shortcode('wpturbo_custom_field', 'wpturbo_shortcode_custom_field');Этот код выбирает все значения метаполя из опубликованных постов и выводит их списком. Функция esc_html() защищает от XSS-атак.
Пояснение к коду
- Используем глобальный объект
$wpdbдля SQL-запроса. - Соединяем таблицы
postmetaиposts, чтобы получить только опубликованные записи. - Выводим простой HTML список.
Добавление параметров в шорткод: фильтрация по категории
Чтобы шорткод был гибким, добавим возможность фильтрации по категории через атрибут category. Например, [wpturbo_custom_field category="novosti"].
function wpturbo_shortcode_custom_field($atts) {
global $wpdb;
$atts = shortcode_atts(array(
'category' => '',
), $atts);
$category_sql = '';
if (!empty($atts['category'])) {
$category = sanitize_text_field($atts['category']);
$term = get_term_by('slug', $category, 'category');
if ($term) {
$category_sql = $wpdb->prepare(
"AND p.ID IN (SELECT object_id FROM {$wpdb->term_relationships} tr WHERE tr.term_taxonomy_id = %d)",
$term->term_taxonomy_id
);
}
}
$query = "SELECT pm.meta_value FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON pm.post_id = p.ID
WHERE pm.meta_key = '_my_custom_field' AND p.post_status = 'publish' " . $category_sql;
$results = $wpdb->get_col($query);
if (empty($results)) {
return '<p>Данные не найдены.</p>';
}
$output = '<ul>';
foreach ($results as $value) {
$output .= '<li>' . esc_html($value) . '</li>';
}
$output .= '</ul>';
return $output;
}
add_shortcode('wpturbo_custom_field', 'wpturbo_shortcode_custom_field');Теперь шорткод умеет выбирать данные только из постов определённой категории, если атрибут передан.
Оптимизация и безопасность запросов к базе
При работе с SQL важно соблюдать несколько правил:
- Использовать
$wpdb->prepare()для подстановки переменных. - Избегать выборок без индексов — лучше использовать JOIN и фильтры по статусу и таксономиям.
- Кэшировать результаты, если данные не изменяются часто, например с помощью Transients API.
Пример с кешированием:
function wpturbo_shortcode_custom_field($atts) {
global $wpdb;
$atts = shortcode_atts(array('category' => ''), $atts);
$cache_key = 'wpturbo_custom_field_' . md5(serialize($atts));
$results = get_transient($cache_key);
if ($results === false) {
// формируем и выполняем запрос (как в предыдущем примере)
// ...
set_transient($cache_key, $results, HOUR_IN_SECONDS);
}
if (empty($results)) {
return '<p>Данные не найдены.</p>';
}
// вывод как раньше
}Использование плагина Clearfy Pro для оптимизации шорткодов и безопасности
Для дополнительной оптимизации и безопасности можно использовать популярный плагин Clearfy Pro. Он помогает:
- Оптимизировать производительность, отключая ненужные функции WordPress.
- Усилить защиту от SQL-инъекций и XSS-атак.
- Кэшировать запросы и страницы, чтобы снизить нагрузку на базу.
Это особенно полезно, если ваш шорткод активно используется на сайте с большой базой записей.
Расширение функционала: вывод данных из кастомной таблицы
Иногда данные хранятся не в стандартных таблицах, а в собственных. Рассмотрим пример, как вывести записи из таблицы wp_custom_data с колонками id, title, description.
function wpturbo_shortcode_custom_table() {
global $wpdb;
$table = $wpdb->prefix . 'custom_data';
$rows = $wpdb->get_results("SELECT id, title, description FROM {$table} ORDER BY id DESC LIMIT 10");
if (empty($rows)) {
return '<p>Данные не найдены.</p>';
}
$output = '<div class="wpturbo-custom-table">';
foreach ($rows as $row) {
$output .= '<h3>' . esc_html($row->title) . '</h3>';
$output .= '<p>' . esc_html($row->description) . '</p>';
}
$output .= '</div>';
return $output;
}
add_shortcode('wpturbo_custom_table', 'wpturbo_shortcode_custom_table');Такой шорткод позволяет выводить собственные данные без изменения шаблонов.
Заключение по созданию шорткодов для вывода данных из базы
Создание собственных шорткодов для динамического вывода данных из базы WordPress — отличное решение для кастомизации и удобства контент-менеджмента. Важно помнить про безопасность, использовать подготовленные запросы и кэширование, а при необходимости — подключать инструменты оптимизации, например Clearfy Pro. Это позволит сделать сайт быстрее, безопаснее и удобнее для пользователей и редакторов.