Метаданные (custom fields) — это важный инструмент для расширения функционала WordPress. Они позволяют добавлять дополнительную информацию к записям, страницам или любым другим типам записей (custom post types). В этой статье мы рассмотрим, как создать уникальные метаданные для каждого типа записей WordPress, используя примеры кода и популярные плагины.
Почему важно создавать уникальные метаданные для разных типов записей
В стандартном WordPress все метаданные хранятся в одной таблице wp_postmeta, но для разных типов записей зачастую нужны разные поля. Например, для товаров WooCommerce нужны поля «артикул», «вес», «цвет», а для отзывов — «оценка», «автор», «дата посещения». Унификация метаданных позволяет:
- Упростить админку, показывая только актуальные поля для каждого типа записи.
- Избежать путаницы и ошибок при вводе данных.
- Оптимизировать работу сайта, исключив лишние запросы к базе.
- Облегчить разработку шаблонов и функций, работающих с конкретными метаданными.
Создание уникальных метаполей через код: пример для пользовательского типа записей
Рассмотрим пример создания метаполей для типа записей wpmax_portfolio. Для этого мы добавим метабокс с двумя полями: «Клиент» и «Дата завершения проекта».
<?php
// Добавляем метабокс
function wpmax_add_portfolio_metabox() {
add_meta_box(
'wpmax_portfolio_meta',
'Данные проекта',
'wpmax_portfolio_metabox_callback',
'wpmax_portfolio',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wpmax_add_portfolio_metabox');
// Выводим HTML метабокса
function wpmax_portfolio_metabox_callback($post) {
wp_nonce_field('wpmax_portfolio_save', 'wpmax_portfolio_nonce');
$client = get_post_meta($post->ID, '_wpmax_client', true);
$completion_date = get_post_meta($post->ID, '_wpmax_completion_date', true);
echo '<p><label for="wpmax_client">Клиент:</label><br>';
echo '<input type="text" id="wpmax_client" name="wpmax_client" value="'.esc_attr($client).'" size="25" /></p>';
echo '<p><label for="wpmax_completion_date">Дата завершения проекта:</label><br>';
echo '<input type="date" id="wpmax_completion_date" name="wpmax_completion_date" value="'.esc_attr($completion_date).'" /></p>';
}
// Сохраняем данные метаполей
function wpmax_save_portfolio_meta($post_id) {
if (!isset($_POST['wpmax_portfolio_nonce']) || !wp_verify_nonce($_POST['wpmax_portfolio_nonce'], 'wpmax_portfolio_save')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpmax_client'])) {
update_post_meta($post_id, '_wpmax_client', sanitize_text_field($_POST['wpmax_client']));
}
if (isset($_POST['wpmax_completion_date'])) {
update_post_meta($post_id, '_wpmax_completion_date', sanitize_text_field($_POST['wpmax_completion_date']));
}
}
add_action('save_post', 'wpmax_save_portfolio_meta');
?>
Этот код добавляет в админку для типа записей wpmax_portfolio удобные поля для ввода клиента и даты, а также сохраняет их при сохранении записи.
Использование плагинов для создания метаполей на примере Meta Box и Advanced Custom Fields
Если вы не хотите писать код вручную, можно использовать популярные плагины для создания метаданных. Рассмотрим два варианта:
Meta Box
Плагин Meta Box позволяет создавать метаполя через интерфейс и программно. Для уникальных метаданных создайте новый метабокс, укажите тип записи и добавьте необходимые поля. Пример программного добавления:
<?php
add_filter('rwmb_meta_boxes', 'wpmax_register_meta_boxes');
function wpmax_register_meta_boxes($meta_boxes) {
$meta_boxes[] = [
'title' => 'Данные проекта',
'post_types' => 'wpmax_portfolio',
'fields' => [
[
'id' => 'client',
'name' => 'Клиент',
'type' => 'text',
],
[
'id' => 'completion_date',
'name' => 'Дата завершения проекта',
'type' => 'date',
],
],
];
return $meta_boxes;
}
?>
Advanced Custom Fields (ACF)
ACF позволяет создавать группы полей в админке и назначать их на любые типы записей. Для уникальных метаданных создайте группу полей и выберите условие показа для нужного типа записи. В шаблоне вывести значения можно так:
<?php
$client = get_field('client');
$completion_date = get_field('completion_date');
if ($client) {
echo '<p>Клиент: ' . esc_html($client) . '</p>';
}
if ($completion_date) {
echo '<p>Дата завершения проекта: ' . esc_html($completion_date) . '</p>';
}
?>
Как использовать уникальные метаданные в шаблонах WordPress
При наличии уникальных метаданных логично выводить их в шаблонах темы, чтобы улучшить UX и дать больше информации пользователям.
Например, для типа записей wpmax_portfolio в файле single-wpmax_portfolio.php можно добавить вывод данных:
<?php
get_header();
if (have_posts()) : while (have_posts()) : the_post();
the_title('<h1>', '</h1>');
$client = get_post_meta(get_the_ID(), '_wpmax_client', true);
$completion_date = get_post_meta(get_the_ID(), '_wpmax_completion_date', true);
if ($client) {
echo '<p><strong>Клиент:</strong> ' . esc_html($client) . '</p>';
}
if ($completion_date) {
echo '<p><strong>Дата завершения проекта:</strong> ' . esc_html($completion_date) . '</p>';
}
the_content();
endwhile; endif;
get_footer();
?>
Так вы получите уникальное отображение метаданных для каждой записи портфолио.
Интеграция с плагином Clearfy Pro для управления метаданными
Если вы используете Clearfy Pro, то сможете дополнительно оптимизировать вывод и хранение метаданных, отключая ненужные поля для разных типов записей и улучшая безопасность данных. Clearfy также поможет скрыть метаданные от REST API и других публичных интерфейсов, если необходимо.
Полезные советы при работе с уникальными метаданными
- Всегда используйте префиксы в ID метаполей, например
_wpmax_, чтобы избежать конфликтов с другими плагинами. - Обязательно проверяйте права пользователя и nonce при сохранении данных, чтобы защититься от CSRF-атак.
- Для даты используйте тип
dateв HTML, чтобы облегчить ввод и избежать ошибок. - Храните данные в стандартизированном формате, чтобы облегчить сортировку и поиск.
- Используйте кастомные функции с префиксом
wpmax_для обработки метаданных — так будет проще поддерживать код.