В WordPress метаполя позволяют хранить дополнительные данные для записей, страниц, пользователей и других объектов. Однако часто стандартных простых метаполей недостаточно, особенно если нужно работать с комплексными структурами: массивами, вложенными объектами, повторяющимися группами полей. В этой статье подробно разберём, как создавать и использовать такие комплексные метаполя, какие плагины помогут упростить задачу, и как работать с ними программно.
Что такое комплексные метаполя и зачем они нужны
Комплексные метаполя — это метаполя, которые содержат не просто одно значение, а сложные структуры данных: массивы, объекты, группы полей, повторяющиеся наборы. Например, если у вас есть кастомный тип записей «Проекты», и каждому проекту нужно добавить несколько контактов с именем, телефоном и email, то простые метаполя не подходят. Здесь лучше создать повторяющееся комплексное поле с подполями.
Без комплексных метаполей придется создавать много отдельных простых метаполей и усложнять логику вывода и сохранения данных. Использование комплексных метаполей значительно упрощает организацию данных и делает интерфейс удобнее для пользователя.
Примеры использования комплексных метаполей
- Список нескольких адресов доставки с полями город, улица, индекс;
- Галерея изображений с подписью и ссылкой;
- Технические характеристики товара, сгруппированные по категориям;
- Многоступенчатые формы с вложенными данными.
Плагины для работы с комплексными метаполями в WordPress
Для удобного создания и управления такими полями существуют мощные плагины. Рассмотрим самые популярные:
Advanced Custom Fields (ACF) Pro
ACF Pro поддерживает повторяющиеся поля (Repeater), гибкие контенты (Flexible Content), групповые поля. Это позволяет создавать любые сложные структуры без написания большого количества кода. Интерфейс интуитивен, и метаполя легко выводить через функции API.
При использовании ACF для вывода повторяющихся полей применяется функция have_rows(), пример:
if( have_rows('wpkeys_project_contacts') ):
while ( have_rows('wpkeys_project_contacts') ) : the_row();
$name = get_sub_field('name');
$phone = get_sub_field('phone');
echo "<p>Контакт: $name, телефон: $phone</p>";
endwhile;
endif;
Meta Box
Meta Box — ещё один мощный фреймворк для метаполей. Он поддерживает повторяющиеся поля, вложенные группы, и имеет множество расширений. Meta Box удобен для разработчиков, позволяет создавать метаполя через PHP с подробной конфигурацией.
CMB2
CMB2 — легковесный и гибкий инструмент для добавления метаполей. Он тоже поддерживает сложные типы полей и повторяющиеся группы. Подходит для тех, кто предпочитает писать конфигурацию в коде.
Как создать комплексные метаполя программно без плагинов
Если не хотите использовать сторонние плагины, можно создать комплексные метаполя вручную. Для этого нужно хранить данные в формате сериализованного массива или JSON и писать код для сохранения и отображения.
Добавление и сохранение комплексного метаполя
Пример: создадим метаполе для «контактов проекта» — массив с именем и телефоном.
function wpkeys_add_project_contacts_metabox() {
add_meta_box('wpkeys_project_contacts', 'Контакты проекта', 'wpkeys_project_contacts_callback', 'project');
}
add_action('add_meta_boxes', 'wpkeys_add_project_contacts_metabox');
function wpkeys_project_contacts_callback($post) {
$contacts = get_post_meta($post->ID, 'wpkeys_project_contacts', true);
if (!is_array($contacts)) {
$contacts = [];
}
wp_nonce_field('wpkeys_project_contacts_nonce', 'wpkeys_project_contacts_nonce_field');
?>
<div id="contacts-wrapper">
<?php foreach ($contacts as $index => $contact): ?>
<div class="contact-item">
<label>Имя</label>
<input type="text" name="wpkeys_contacts[<?php echo $index; ?>][name]" value="<?php echo esc_attr($contact['name']); ?>" />
<label>Телефон</label>
<input type="text" name="wpkeys_contacts[<?php echo $index; ?>][phone]" value="<?php echo esc_attr($contact['phone']); ?>" />
</div>
<?php endforeach; ?>
</div>
<button type="button" id="add-contact">Добавить контакт</button>
<script>
document.getElementById('add-contact').addEventListener('click', function() {
var wrapper = document.getElementById('contacts-wrapper');
var count = wrapper.children.length;
var div = document.createElement('div');
div.className = 'contact-item';
div.innerHTML = `<label>Имя</label><input type='text' name='wpkeys_contacts[${count}][name]' /><label>Телефон</label><input type='text' name='wpkeys_contacts[${count}][phone]' />`;
wrapper.appendChild(div);
});
</script>
<?php
}
function wpkeys_save_project_contacts($post_id) {
if (!isset($_POST['wpkeys_project_contacts_nonce_field']) || !wp_verify_nonce($_POST['wpkeys_project_contacts_nonce_field'], 'wpkeys_project_contacts_nonce')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpkeys_contacts']) && is_array($_POST['wpkeys_contacts'])) {
$contacts = array_map(function($contact) {
return [
'name' => sanitize_text_field($contact['name']),
'phone' => sanitize_text_field($contact['phone'])
];
}, $_POST['wpkeys_contacts']);
update_post_meta($post_id, 'wpkeys_project_contacts', $contacts);
} else {
delete_post_meta($post_id, 'wpkeys_project_contacts');
}
}
add_action('save_post', 'wpkeys_save_project_contacts');
В этом примере мы добавили метабокс с динамическим добавлением блоков контактов, сохранили массив контактов в метаполе и обеспечили безопасность через nonce.
Вывод комплексного метаполя на фронтенде
$contacts = get_post_meta($post->ID, 'wpkeys_project_contacts', true);
if (!empty($contacts) && is_array($contacts)) {
echo '<ul class="project-contacts">';
foreach ($contacts as $contact) {
echo '<li>' . esc_html($contact['name']) . ' — ' . esc_html($contact['phone']) . '</li>';
}
echo '</ul>';
}
Советы по оптимизации и безопасности при работе с метаполями
Работая с комплексными метаполями, важно учитывать безопасность и производительность:
- Всегда проверяйте nonce и права пользователя при сохранении данных;
- Санитизируйте данные перед сохранением и выводом;
- Избегайте хранения избыточных данных, используйте сериализацию или JSON;
- При большом объёме данных можно рассмотреть кастомные таблицы для метаданных;
- Кэшируйте результаты запросов при частом выводе.
Использование комплексных метаполей с плагином Clearfy Pro
Плагин Clearfy Pro помогает оптимизировать работу WordPress и включает инструменты для управления метаполями, в том числе удаление неиспользуемых и автоматизацию. Хотя он не создаёт комплексные метаполя, он полезен для поддержки чистоты и быстродействия базы данных при активном использовании метаполей.
Заключение
Комплексные метаполя — мощный инструмент для расширения функционала WordPress и организации структурированных данных. Используйте ACF Pro, Meta Box или CMB2 для удобства, либо реализуйте собственные решения вручную, если нужно максимальное кастомное управление. Обязательно учитывайте безопасность и оптимизацию при работе с такими метаполями.