Перемещаемые (repeater) поля в плагине Advanced Custom Fields (ACF) — мощный инструмент для создания сложных структур данных в WordPress. Однако при наличии нескольких сайтов возникает задача синхронизации таких полей между ними, чтобы контент и структура оставались идентичными. В этой статье рассмотрим, как настроить синхронизацию repeater-полей ACF между сайтами на практике, используя PHP-код и рекомендации по плагинам.
Почему стандартная синхронизация ACF не подходит для repeater-полей
ACF хранит данные repeater-полей в виде множества метаполей с префиксами и индексами, что усложняет их перенос в базе данных. Стандартный экспорт/импорт JSON файлов ACF-контента затрагивает только настройки полей, но не данные конкретных записей. Для синхронизации именно данных repeater-полей нужно использовать программные методы.
Кроме того, при переносе записей через стандартные средства экспорта WordPress repeater-поля часто теряют структуру или данные оказываются неполными. Поэтому нужна кастомная реализация, которая корректно переберёт все вложенные элементы и сохранит их на целевом сайте.
Решение этой проблемы особенно актуально для сайтов с динамическим контентом, где repeater-поля используются для описания сложных блоков, например, расписаний, галерей, списков продуктов и т.п.
Обзор подходов к синхронизации repeater-полей между сайтами
Существует несколько способов синхронизировать repeater-поля ACF между сайтами WordPress:
- Экспорт и импорт данных через REST API. Использование WP REST API для передачи JSON с данными repeater-полей. Позволяет построить автоматическую синхронизацию, но требует написания кода для правильной сериализации и десериализации.
- Синхронизация через XML/RSS. Можно экспортировать записи со всеми метаданными и импортировать их на другой сайт, но обработка сложных repeater-полей усложнена.
- Использование плагинов для миграции и синхронизации. Например, плагин WP All Import/Export с аддонами для ACF. Однако часто они платные и не дают полного контроля.
- Собственные скрипты с WP-CLI. Для опытных разработчиков — можно написать скрипты импорта/экспорта repeater-полей через командную строку.
В этой статье мы подробно рассмотрим вариант с использованием REST API и PHP-кода, позволяющий гибко настроить передачу и применение данных repeater-полей.
Как подготовить данные repeater-поля для передачи через REST API
Основная задача — получить из записи все значения repeater-поля в удобном формате. Для этого удобно использовать функцию get_field ACF, которая возвращает массив с вложенными данными.
Пример получения данных repeater-поля с ключом wpsync_repeater_field:
function wpsync_get_repeater_data($post_id) {
$data = get_field('wpsync_repeater_field', $post_id);
return $data ?: [];
}Далее нужно упаковать эти данные в JSON и передать целевому сайту. Для синхронизации можно создать собственный REST API эндпоинт на сайте-получателе, который будет принимать JSON и обновлять поле.
Создание REST API endpoint для приёма repeater-полей
Пример регистрации эндпоинта в функциях темы или плагина:
add_action('rest_api_init', function () {
register_rest_route('wpsync/v1', '/update_repeater', [
'methods' => 'POST',
'callback' => 'wpsync_handle_repeater_update',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
]);
});
function wpsync_handle_repeater_update(WP_REST_Request $request) {
$post_id = $request->get_param('post_id');
$repeater_data = $request->get_param('repeater_data');
if (!$post_id || !is_array($repeater_data)) {
return new WP_Error('invalid_data', 'Post ID or repeater data missing', ['status' => 400]);
}
// Обновляем поле
update_field('wpsync_repeater_field', $repeater_data, $post_id);
return ['success' => true];
}Такой эндпоинт позволяет принимать обновлённые данные repeater-поля и сохранять их в указанной записи.
Пример кода отправки данных repeater-поля с исходного сайта
Используем стандартную PHP-функцию wp_remote_post для отправки JSON на целевой сайт:
function wpsync_send_repeater_data($post_id, $target_url, $auth_token) {
$data = wpsync_get_repeater_data($post_id);
$response = wp_remote_post($target_url, [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $auth_token,
],
'body' => json_encode([
'post_id' => $post_id,
'repeater_data' => $data,
]),
]);
if (is_wp_error($response)) {
error_log('WPSync error: ' . $response->get_error_message());
return false;
}
return true;
}Не забудьте настроить аутентификацию (например, JWT или OAuth) между сайтами для безопасности.
Автоматизация и расширение функционала синхронизации
Для удобства можно повесить вызов функции отправки данных на хуки обновления записи:
add_action('acf/save_post', function ($post_id) {
// Проверяем, что это нужный тип записи
if (get_post_type($post_id) !== 'post') return;
// Отправляем данные repeater-поля на другой сайт
wpsync_send_repeater_data($post_id, 'https://targetsite.ru/wp-json/wpsync/v1/update_repeater', 'ВАШ_ТОКЕН');
}, 20);Также можно внедрить обратную синхронизацию, логирование ошибок, повторные попытки и управление версиями данных.
Использование плагинов для упрощения задачи
Для ускорения можно рассмотреть плагин Clearfy Pro, который помогает оптимизировать работу с метаданными и может облегчить ручную синхронизацию. Также полезен плагин WPRemark для расширенного управления пользовательскими данными.
Выводы и рекомендации
Синхронизация repeater-полей ACF требует аккуратного подхода, так как это сложная структура данных. Использование REST API с кастомными endpoint'ами — гибкий и масштабируемый способ, позволяющий настроить обмен данными между сайтами без потерь.
Важно тщательно тестировать процесс, особенно при наличии вложенных repeater-полей и сложных типов данных. Рекомендуется также использовать средства логирования и мониторинга, чтобы вовремя обнаруживать и исправлять ошибки.
Если нужна более простая интеграция, рассмотрите специализированные плагины с поддержкой ACF или WP-CLI скрипты для пакетной обработки данных.
Таким образом, с помощью приведённых примеров и рекомендаций вы сможете организовать надёжную синхронизацию перемещаемых полей ACF между сайтами WordPress и обеспечить целостность данных на всех ресурсах.