В WordPress часто возникает необходимость добавить собственные метаполя (custom fields) к записям для хранения дополнительной информации. Однако стандартный функционал не позволяет легко сделать эти поля уникальными для каждой записи. В этой статье мы разберем, как добавить уникальное метаполе к записям WordPress без использования плагинов, а также обеспечим проверку уникальности значения при сохранении.
Что такое метаполя и зачем нужна уникальность
Метаполя — это дополнительная информация, связанная с записью или другим объектом WordPress. Они хранятся в таблице wp_postmeta и используются для расширения функциональности сайта: например, можно добавить артикул товара, уникальный код или дополнительный идентификатор.
Уникальность метаполя важна, чтобы предотвратить дублирование данных, что может приводить к ошибкам в логике работы сайта, например, если по метаполю производится поиск или фильтрация.
Добавляем уникальное метаполе в админке WordPress
Для начала создадим метабокс в административной части, который позволит вводить уникальное значение.
add_action('add_meta_boxes', 'wplike_add_unique_meta_box');
function wplike_add_unique_meta_box() {
add_meta_box(
'wplike_unique_meta',
'Уникальное метаполе',
'wplike_render_unique_meta_box',
'post',
'side'
);
}
function wplike_render_unique_meta_box($post) {
wp_nonce_field('wplike_unique_meta_nonce', 'wplike_unique_meta_nonce_field');
$value = get_post_meta($post->ID, '_wplike_unique_meta_key', true);
echo '<input type="text" name="wplike_unique_meta_input" value="' . esc_attr($value) . '" style="width:100%;" />';
}
Здесь мы создаем метабокс для типа записи post. Если у вас кастомные типы постов, добавьте их в список в функции add_meta_box.
Валидация и сохранение уникального значения
Теперь нужно обработать сохранение метаполя и проверить, что введенное значение уникально среди всех записей.
add_action('save_post', 'wplike_save_unique_meta');
function wplike_save_unique_meta($post_id) {
if (!isset($_POST['wplike_unique_meta_nonce_field']) || !wp_verify_nonce($_POST['wplike_unique_meta_nonce_field'], 'wplike_unique_meta_nonce')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (!isset($_POST['wplike_unique_meta_input'])) {
return;
}
$new_value = sanitize_text_field($_POST['wplike_unique_meta_input']);
if ($new_value === '') {
delete_post_meta($post_id, '_wplike_unique_meta_key');
return;
}
// Проверяем уникальность
$args = [
'post_type' => 'post',
'post_status' => 'any',
'meta_query' => [
[
'key' => '_wplike_unique_meta_key',
'value' => $new_value,
'compare' => '=',
],
],
'fields' => 'ids',
'posts_per_page' => 1,
'exclude' => [$post_id],
];
$query = new WP_Query($args);
if ($query->have_posts()) {
// Дублирование найдено — выводим ошибку
add_filter('redirect_post_location', function($location) {
return add_query_arg('wplike_unique_meta_error', '1', $location);
});
return;
}
update_post_meta($post_id, '_wplike_unique_meta_key', $new_value);
}
Обратите внимание на проверку nonce, прав пользователя и автосохранения. Запрос WP_Query ищет другие записи с таким же значением метаполя, исключая текущую запись.
Вывод сообщения об ошибке в админке
Чтобы уведомить пользователя, если значение не уникально, добавим сообщение об ошибке в экран редактирования записи.
add_action('admin_notices', 'wplike_unique_meta_admin_notice');
function wplike_unique_meta_admin_notice() {
if (isset($_GET['wplike_unique_meta_error'])) {
echo '<div class="notice notice-error is-dismissible">
<p>Ошибка: значение уникального метаполя уже используется в другой записи. Пожалуйста, введите уникальное значение.</p>
</div>';
}
}
Использование уникального метаполя в шаблонах
Чтобы вывести уникальное метаполе на сайте, например, в шаблоне single.php, используйте следующий код:
$unique_value = get_post_meta(get_the_ID(), '_wplike_unique_meta_key', true);
if ($unique_value) {
echo '<p>Уникальный код: ' . esc_html($unique_value) . '</p>';
}
Это позволит выводить дополнительную информацию для посетителей.
Дополнительные рекомендации и оптимизация
Если планируется множество записей и частые запросы по уникальному метаполю, имеет смысл добавить индекс в базу данных для поля meta_key и meta_value, чтобы ускорить поиск.
Также можно расширить функционал, добавив поддержку уникальных метаполей для других типов записей, а также использовать JavaScript для проверки уникальности в реальном времени через AJAX.
Альтернативные решения на базе плагинов
Если вы хотите облегчить работу с метаполями, можно использовать плагины, такие как Clearfy Pro, которые позволяют управлять метаполями и улучшать производительность сайта.
Но в случае необходимости полной кастомизации и контроля уникальности без сторонних зависимостей описанный выше метод будет оптимальным.