Как добавить уникальное поле в метабокс WordPress с проверкой уникальности

В работе с WordPress часто возникает необходимость добавить собственные метабоксы с уникальными полями, которые должны содержать уникальные значения. Например, уникальный артикул товара, уникальный идентификатор записи или другой параметр, который не может повторяться в базе. В этой статье мы разберём, как создать метабокс с уникальным полем, реализовать проверку уникальности значения при сохранении и вывести ошибки в админке, если значение не уникально.

Почему важна уникальность поля в метабоксе WordPress

Уникальные поля критичны, когда вы хотите избежать дублирования информации в базе данных. Например, при создании каталога товаров уникальный SKU помогает идентифицировать продукт, предотвращая путаницу. Без проверки уникальности пользователь может случайно ввести одинаковые значения, что приведёт к логическим ошибкам в работе сайта или плагина.

Реализация проверки на уровне PHP – самый надёжный способ, так как JavaScript можно отключить. Мы рассмотрим именно серверный вариант.

Создание метабокса с уникальным полем: базовый код

Для начала создадим метабокс с текстовым полем. Вставьте следующий код в functions.php вашей темы или в отдельный плагин:

function wpsnippets_add_custom_metabox() {
    add_meta_box(
        'wpsnippets_unique_field',
        'Уникальное поле',
        'wpsnippets_show_metabox',
        'post', // можно заменить на свой тип записи
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wpsnippets_add_custom_metabox');

function wpsnippets_show_metabox($post) {
    $value = get_post_meta($post->ID, '_wpsnippets_unique_field', true);
    wp_nonce_field('wpsnippets_save_metabox_nonce', 'wpsnippets_metabox_nonce');
    echo '<label for="wpsnippets_unique_field">Введите уникальное значение:</label>';
    echo '<input type="text" id="wpsnippets_unique_field" name="wpsnippets_unique_field" value="' . esc_attr($value) . '" size="25" />';
}

Этот код создаёт метабокс с полем ввода для постов. Дальше добавим сохранение с проверкой уникальности.

Проверка уникальности значения при сохранении метабокса

Чтобы проверить, что значение уникально, нам нужно найти в базе других постов с таким же мета-значением. Если такие есть, запрещаем сохранение и выводим ошибку.

Добавим следующий код в functions.php или плагин:

function wpsnippets_save_metabox($post_id) {
    if (!isset($_POST['wpsnippets_metabox_nonce']) || !wp_verify_nonce($_POST['wpsnippets_metabox_nonce'], 'wpsnippets_save_metabox_nonce')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wpsnippets_unique_field'])) {
        $new_value = sanitize_text_field($_POST['wpsnippets_unique_field']);

        // Проверка уникальности
        $args = [
            'post_type' => 'post',
            'post_status' => 'any',
            'meta_query' => [
                [
                    'key' => '_wpsnippets_unique_field',
                    'value' => $new_value,
                    'compare' => '=',
                ],
            ],
            'posts_per_page' => 1,
            'fields' => 'ids',
            'exclude' => [$post_id],
        ];
        $query = new WP_Query($args);

        if ($query->have_posts()) {
            // Выводим ошибку и не сохраняем
            add_filter('redirect_post_location', function($location) {
                return add_query_arg('wpsnippets_unique_error', 1, $location);
            });
        } else {
            update_post_meta($post_id, '_wpsnippets_unique_field', $new_value);
        }
    }
}
add_action('save_post', 'wpsnippets_save_metabox');

Здесь мы создаём WP_Query, чтобы найти посты с таким же значением уникального поля, исключая текущий пост (если редактируем). Если находим совпадение — создаём параметр ошибки при редиректе.

Отображение ошибки в админке

Теперь нужно вывести сообщение об ошибке, если значение не уникально. Добавим в functions.php:

function wpsnippets_admin_notices() {
    if (isset($_GET['wpsnippets_unique_error'])) {
        echo '<div class="error notice is-dismissible"><p>Ошибка: значение уникального поля уже используется в другом посте. Пожалуйста, введите уникальное значение.</p></div>';
    }
}
add_action('admin_notices', 'wpsnippets_admin_notices');

Теперь при попытке сохранить неуникальное значение вы увидите красное сообщение с ошибкой.

Дополнительные советы и улучшения

1. Можно расширить проверку для других типов записей, заменив параметр post_type в WP_Query на нужный.

2. Если нужно уникальность в пределах таксономии или другого параметра — добавьте дополнительный фильтр в запрос WP_Query.

3. Для удобства пользователя можно добавить JavaScript проверку уникальности по AJAX, используя REST API. Но серверная проверка обязательна.

4. Если вы используете плагин для управления метабоксами (например, Advanced Custom Fields), можно аналогично реализовать серверную проверку через хуки сохранения.

Пример использования с плагином Clearfy Pro

Если на вашем сайте установлен Clearfy Pro, то можно дополнительно оптимизировать запросы и безопасность сохранения мета-полей, используя встроенные функции оптимизации и очистки данных.

Итог

Добавление уникального поля в метабокс WordPress с проверкой уникальности — важная задача для многих проектов. Мы подробно рассмотрели создание метабокса, сохранение с проверкой уникальности, вывод ошибок и дали рекомендации по улучшению. Этот приём поможет вам избежать проблем с дублированием данных и повысить качество вашего сайта.

WooCommerce: как изменить статус заказа без повышения суммы платежа
23.04.2026
Как добавить поддержку формата WebP в WordPress без плагинов
17.04.2026
WooCommerce: как исключить повторную отправку письма при изменении статуса заказа
20.05.2026
WooCommerce: как изменить цену товара без повышения суммы платежа при изменении заказа
29.04.2026
WooCommerce: отключение отсроченного платежа при изменении заказа
20.04.2026