Как создать собственный шорткод для вывода данных из базы WordPress

В 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. Это позволит сделать сайт быстрее, безопаснее и удобнее для пользователей и редакторов.

Как удалить пустые метаполя в WordPress с помощью кода
01.04.2026
Как избежать конфликтов между плагинами WordPress
07.04.2026
Как удалить старые метаданные в WordPress быстро и безопасно
25.03.2026
Как удалить дубликаты постов в WordPress с помощью кода
08.03.2026
Как автоматически удалять неиспользуемые вариации товаров в WooCommerce через код
12.06.2026