Импорт внешнего API для проблемы с пользовательским типом записи, проблема: дублирование записей или более.

Вопрос или проблема

Я импортирую внешнее API в пользовательский тип записи под названием “журнал”.

Я работаю с mu-плагином.
Я могу импортировать свою информацию, но мои записи дублируются.

Когда я сбрасываю количество записей для тестирования, оно может варьироваться от 50 до 200, например, и я не понимаю почему. Есть двойные записи.

Я извлекаю свой ID в поле ACF
И заголовок в классической функции заголовка WordPress.

Вот мой код:


function interval_cron ($schedules){
    $schedules ['five_minutes'] = array(
        'interval' => 300,
        'display' => esc_html__('all five minutes'),
    );
    return $schedules;
}
add_filter ('cron_schedules', 'interval_cron');

if ( !wp_next_scheduled ('api_cron') ):
    wp_schedule_event ( time(), 'five_minutes', 'api_cron' );
endif;

add_action ('api_cron', 'my_api');

function my_api(){ 


    if ( defined ('DOING_AUTOSAVE') and DOING_AUTOSAVE ){
        return;
    }


    if ( wp_is_post_revision ( get_the_id() ) ){
        return;
    }

    $request = wp_remote_get ('my url');

    if ( is_wp_error ($request) ){
        return false;
    } 

    $body = wp_remote_retrieve_body ($request);

    $data = json_decode ($body, true); ?>

    <?php foreach ($data as $data_info):

    $title = $data_info ['titre'];
    $id_catalog = $data_info ['revueid'];

    $arg = get_posts ( array (
       'post_type' => 'magazine',
       'meta_key'=> 'id_magazine',
       'meta_value' => $id_catalog,
       'posts_per_page' => 1,
     ));

    $post_catalog = wp_insert_post ( array (
     'post_type' => 'catalog',
     'post_title' => $title,
     'post_status' => 'publish',
    ));

    if ($post_catalog):
    update_field ('id_magazine', $id_catalog, $post_catalog);
    endif;

 endforeach;

}
add_action('init', 'my_api');

.

Ответ или решение

При работе с API и кастомными типами постов в WordPress время от времени можно столкнуться с проблемами дублирования контента. Дублирование записей, которое вы испытываете при импорте внешнего API в кастомный тип поста "magazine", является одной из распространённых проблем. Чтобы решить данную задачу, необходимо внимательно рассмотреть текущую реализацию вашего кода и провести его оптимизацию. Давайте подробно разберём, что может быть причиной дублирования и как это исправить.

Теория

В первую очередь, важно обратиться к принципам управления импортом данных. Обычно, основной причиной дублирования является отсутствие проверки на существование записи перед её созданием. Другими словами, ваш код должен проверять, существует ли уже пост с тем же идентификатором автора API, прежде чем его создать. Использование правильных методов проверки и управления записями позволит избежать дублирования постов.

Пример

В вашем текущем коде можно заметить несколько потенциальных областей для улучшения. Рассмотрим следующие аспекты:

  1. Проверка существования поста: Вы используете get_posts() для проверки существования записи с конкретной мета-полей, но затем всё равно создаете новый пост, независимо от того, была ли такая запись найдена.

  2. Типы данных и последовательность: Функция wp_insert_post() вызывается каждый раз без учёта результатов предыдущей проверки. Это явно создаёт дублирование, так как создаётся новая запись без учёта уже существующих.

Применение

Вы можете улучшить свой код, внеся соответствующие изменения, чтобы избежать создания дубликатов. Вот улучшенный пример кода:

function interval_cron($schedules) {
    $schedules['five_minutes'] = array(
        'interval' => 300,
        'display' => esc_html__('Every Five Minutes'),
    );
    return $schedules;
}
add_filter('cron_schedules', 'interval_cron');

if (!wp_next_scheduled('api_cron')) {
    wp_schedule_event(time(), 'five_minutes', 'api_cron');
}

add_action('api_cron', 'my_api');

function my_api() { 
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    $request = wp_remote_get('my url');

    if (is_wp_error($request)) {
        return false;
    }

    $body = wp_remote_retrieve_body($request);
    $data = json_decode($body, true);

    foreach ($data as $data_info) {
        $title = $data_info['titre'];
        $id_catalog = $data_info['revueid'];

        // Проверка на существование записи
        $existing_post = get_posts(array(
            'post_type' => 'magazine',
            'meta_key' => 'id_magazine',
            'meta_value' => $id_catalog,
            'posts_per_page' => 1,
        ));

        if ($existing_post) {
            // Обновление существующего поста
            $post_id = $existing_post[0]->ID;
            wp_update_post(array(
                'ID' => $post_id,
                'post_title' => $title,
            ));
            update_field('id_magazine', $id_catalog, $post_id);
        } else {
            // Создание нового поста
            $post_id = wp_insert_post(array(
                'post_type' => 'magazine',
                'post_title' => $title,
                'post_status' => 'publish',
            ));

            if ($post_id) {
                update_field('id_magazine', $id_catalog, $post_id);
            }
        }
    }
}
add_action('init', 'my_api');

В этом коде внесены следующие изменения:

  • Проверка существования: Перед созданием нового поста теперь код проверяет, существует ли уже пост с тем же id_magazine. Если существует, он обновляет пост вместо создания нового.

  • Исправлена последовательность: Код теперь более консистентен и логически читаем: сначала идёт проверка, а затем создается или обновляется пост, что исключает возможность дублирования.

Заключение

Следуя данному подходу, можно значительно сократить количество дублирований и уменьшить нагрузку на систему. Это обеспечит более чистое и управляемое импортирование данных из внешнего API в ваш кастомный тип поста "magazine". Тщательно тестируя предложенные изменения, вы уверяетесь в том, что поведение кода соответствует вашим ожиданиям, а количество записей остаётся в пределах нормы.

Оцените материал
Добавить комментарий

Капча загружается...