Как публиковать посты по API на несколько удаленных сайтов?

Ссылка скопирована
1 ответ

Есть три сайта: главный и два дочерних. Задача% при публикации пота на главном сайте, публиковать их же и на дочерних сайтах. Исследуя документацию и чат GPT, я написал некий код, который выполняет задачу, но на дочернем сайте появляется два одинаковых поста.Прошу помощи найти проблему. Также интересно, есть ли возможность передавать изображения в контенте на дочерний сайт в медиатеку. Сейчас изображение на дочернем сайте ссылается на основной домен. И не передается featured image. Код ниже:

add_action('publish_post', 'sync_to_child_site');  function sync_to_child_site($new_status, $old_status, $post) {     if ($new_status === 'publish') {         $post_data = get_post($post->ID);          $login = 'admin';         $password = '...';          $request = wp_remote_post(             'https://child-domain/wp-json/wp/v2/posts',             array(                 'headers' => array(                     'Authorization' => 'Basic ' . base64_encode("$login:$password")                 ),                 'body' => array(                     'title' => $post_data->post_title,                     'content' => $post_data->post_content,                     'status' => 'publish',                 )             )         );     } }

add_action('publish_post', 'sync_to_child_site'); function sync_to_child_site($new_status, $old_status, $post) { if ($new_status === 'publish') { $post_data = get_post($post->ID); $login = 'admin'; $password = '...'; $request = wp_remote_post( 'https://child-domain/wp-json/wp/v2/posts', array( 'headers' => array( 'Authorization' => 'Basic ' . base64_encode("$login:$password") ), 'body' => array( 'title' => $post_data->post_title, 'content' => $post_data->post_content, 'status' => 'publish', ) ) ); } }

Возможно кто-то сталкивался с такими задачами? Прошу подсказать решение или хотя бы направление, куда "копать".

Дополнительно:

Ответы:

Чтобы отслеживать вставку и обновление постов рекомендую
https://developer.wordpress.org/reference/hooks/wp...
А суто правильная - слать пост запрос на апи

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

Дубли появляются потому, что хук выбран неправильно и/или функция вызывается несколько раз в процессе публикации. Для синхронизации постов на удалённые WordPress-сайты лучше использовать transition_post_status или save_post с защитой от повторного запуска, а не слепо отправлять пост при каждом событии.

Типовая защита:

add_action('transition_post_status', function ($new_status, $old_status, $post) {
    if ($post->post_type !== 'post') {
        return;
    }
 
    if ($new_status !== 'publish' || $old_status === 'publish') {
        return;
    }
 
    if (get_post_meta($post->ID, '_synced_to_child_sites', true)) {
        return;
    }
 
    // sync_to_child_sites($post);
    update_post_meta($post->ID, '_synced_to_child_sites', time());
}, 10, 3);

add_action('transition_post_status', function ($new_status, $old_status, $post) { if ($post->post_type !== 'post') { return; } if ($new_status !== 'publish' || $old_status === 'publish') { return; } if (get_post_meta($post->ID, '_synced_to_child_sites', true)) { return; } // sync_to_child_sites($post); update_post_meta($post->ID, '_synced_to_child_sites', time()); }, 10, 3);

Так код сработает только при первом переходе в publish, а не при каждом обновлении опубликованной записи.

Для изображений нужно не просто передать HTML с URL старого домена. Нужно скачать медиафайл на дочерний сайт через REST API /wp/v2/media, получить новый attachment ID и заменить URL в контенте. Featured image задаётся полем featured_media при создании поста.

Упрощённая логика:

  1. Получить исходную запись.
  2. Найти featured image и картинки в контенте.
  3. Загрузить каждую картинку на дочерний сайт через REST media endpoint.
  4. Заменить URL картинок в HTML на новые.
  5. Создать пост на дочернем сайте с featured_media.
  6. Сохранить remote post ID в метаполе главного сайта.

Также не храните логин и пароль администратора прямо в коде. Используйте Application Passwords WordPress или отдельного пользователя с минимальными правами. И обязательно логируйте ответы REST API: код ответа, тело ошибки и ID созданного поста. Без логов дубли и падения будет трудно отлаживать.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно