Advanced Custom Fields (ACF) — один из самых популярных плагинов для расширения функционала WordPress. Часто возникает задача синхронизировать значения полей ACF между разными сайтами WordPress, но не всегда нужно переносить все данные целиком. В этой статье рассмотрим, как выполнить выборочную синхронизацию полей ACF по заданным условиям, используя вебхуки, REST API и кастомный код.
Почему нужна выборочная синхронизация ACF?
Случаи, когда требуется синхронизировать только часть данных ACF, встречаются часто. Например, на одном сайте вы храните маркетинговую информацию, на другом — технические параметры. Или вы хотите синхронизировать только поля с определённым статусом публикации, пользовательской ролью или другими условиями.
Простая репликация базы или экспорт/импорт JSON не подходит, когда данные нужно фильтровать и обновлять динамически. Для таких случаев лучше использовать REST API и настраиваемые webhook-обработчики.
Настройка REST API для выборочной передачи полей ACF
Для начала убедимся, что на обоих сайтах включен REST API и установлен плагин ACF to REST API, который расширяет стандартный REST API WordPress, позволяя работать с полями ACF.
После установки плагина ACF to REST API у вас появится возможность получать и отправлять данные кастомных полей через endpoint типа /wp-json/acf/v3/posts/{id}.
Далее нужно написать функцию, которая будет отбирать и отправлять только нужные поля. Пример кода для отправки выбранных полей через REST API:
function wpsync_send_acf_fields_conditionally($post_id) {
// Получаем все поля ACF для поста
$fields = get_fields($post_id);
if (!$fields) {
return;
}
// Фильтруем поля по условию, например, только поля с префиксом 'sync_'
$filtered_fields = array_filter($fields, function($key) {
return strpos($key, 'sync_') === 0;
}, ARRAY_FILTER_USE_KEY);
if (empty($filtered_fields)) {
return;
}
$remote_url = 'https://targetsite.ru/wp-json/acf/v3/posts/' . $post_id;
$response = wp_remote_post($remote_url, [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . WPSYNC_API_TOKEN
],
'body' => json_encode(['fields' => $filtered_fields])
]);
if (is_wp_error($response)) {
error_log('WPSYNC: Ошибка синхронизации ACF - ' . $response->get_error_message());
}
}
add_action('acf/save_post', 'wpsync_send_acf_fields_conditionally', 20);
В этом примере при сохранении поста срабатывает функция, которая выбирает из всех полей ACF только те, что начинаются с sync_, и отправляет их на удалённый сайт через REST API с авторизацией по токену.
Обработка входящих данных на целевом сайте
На стороне принимающего сайта нужно создать endpoint REST API, который будет принимать обновлённые поля и сохранять их к соответствующему посту.
Пример регистрации собственного REST API маршрута для приёма данных:
add_action('rest_api_init', function () {
register_rest_route('wpsync/v1', '/update-acf/(?P<id>\d+)', [
'methods' => 'POST',
'callback' => 'wpsync_receive_acf_fields',
'permission_callback' => function () {
return current_user_can('edit_posts');
}
]);
});
function wpsync_receive_acf_fields($request) {
$post_id = $request['id'];
$fields = $request->get_param('fields');
if (!$fields || !is_array($fields)) {
return new WP_Error('no_fields', 'Поля не переданы или неверный формат', ['status' => 400]);
}
foreach ($fields as $key => $value) {
update_field($key, $value, $post_id);
}
return ['success' => true];
}
Этот код создаёт REST API маршрут /wp-json/wpsync/v1/update-acf/{id}, который принимает поля и обновляет их у поста с переданным ID.
Примеры плагинов для синхронизации ACF с условием
Если хочется готовое решение, можно обратить внимание на плагины, которые поддерживают синхронизацию с фильтрами:
- WP Sync DB — умеет экспортировать и импортировать данные базы с возможностью выбора таблиц и условий.
- WP All Import + WP All Export — позволяют гибко настраивать экспорт/импорт полей ACF с фильтрацией по условиям.
- ACF Sync — плагин для синхронизации полей ACF между сайтами, поддерживает JSON-экспорт и импорт.
Но для тонкой настройки по условиям лучше писать собственные скрипты, как показано выше.
Советы по безопасности и производительности
При реализации выборочной синхронизации важно учитывать безопасность — передавать данные только по защищённым каналам (HTTPS), использовать авторизацию с токеном или ключом, ограничивать права доступа на сервере.
Также не стоит синхронизировать слишком часто или сразу много записей — это может нагрузить сервер. Рекомендуется использовать WP-Cron для отложенной отправки обновлений или триггеры только на изменённые записи.
Итоги
Выборочная синхронизация полей ACF между сайтами WordPress — задача не из простых, но с помощью REST API, хуков и небольшого кода её можно реализовать гибко и эффективно. Такой подход позволит передавать только нужные данные и контролировать процесс синхронизации, избегая излишней нагрузки и ошибок.
Для удобной работы с ACF и REST API можно использовать плагин ACF to REST API, а для управления процессом — WP-Cron и собственные REST маршруты.