Заполнить пользовательский тип записи/пользовательские поля из внешней базы данных

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

У меня есть собственная база данных MySQL (тот же хост/другой домен) с большим количеством информации о транспортных средствах.

Что мы хотим сделать, так это заполнить настраиваемый тип записи и пользовательские поля этими данными, чтобы это было SEO-дружественно в WP. Есть ли способ сделать это в WordPress? По сути, мы хотим, чтобы WP обращался к этой таблице для заполнения настраиваемого типа записи. Мы НЕ собираемся использовать WP для управления этими данными. Когда данные обновляются в этой таблице, они должны автоматически обновляться в WP.

Так что это не импорт, просто чтение с другой таблицы. Если это поможет, у нас также есть построенный REST API.

Надеюсь, то, что я говорю, имеет смысл. Если это не так, пожалуйста, не стесняйтесь задавать мне вопросы. Это довольно важно для нас, и мы действительно хотим найти лучшее решение.

Таким образом, лучший способ заключается в том, чтобы ваша другая система “вызывала” WordPress каждый раз, когда что-то изменяется… Вы можете создать плагин для WordPress, который будет слушать определенный ajax-вызов, и после получения новых данных он сможет создать/обновить настраиваемый тип записи на вашем сайте WordPress.

Некоторые вещи, которые нужно помнить:

  • Убедитесь, что у вас есть некий механизм рукопожатия (например, закрытый ключ или что-то подобное), в противном случае любой сможет начать создавать записи в вашей системе!
  • Убедитесь, что вы передаете уникальный идентификатор для каждой записи, который вы сохраните как пользовательское поле в WordPress, чтобы вы могли обновлять существующие записи, а не создавать новые.

Менее элегантное решение заключалось бы в том, чтобы WordPress время от времени опрашивал вашу систему и спрашивал о чем-то новом. В этом случае вашему плагину WordPress нужно будет сохранить дату последнего запроса, чтобы он мог спрашивать вашу основную систему о любых изменениях с последнего вызова. Ваша основная система вернет список обновленных записей, и плагин сможет создать/обновить каждую пользовательскую запись соответственно.

Для опроса из WordPress ваш плагин может установить расписание для wp-cron.

Это будет немного менее элегантно и эффективно, потому что WordPress будет время от времени спрашивать, изменилось ли что-то. Это означает, что он может спрашивать слишком часто и тратить ресурсы (если изменения в основной системе происходят не часто) или слишком редко, и данные в WordPress будут устаревшими.

Надеюсь, это поможет!

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

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

Вариант 1: Использование REST API

Если у вас уже есть настроенный REST API для получения данных из вашей внешней базы данных, это наилучший способ взаимодействия с WordPress.

  1. Создание плагина WordPress: Начните с создания плагина, который будет обрабатывать запросы к вашему API. Этот плагин будет слушать AJAX-запросы и обновлять или создавать записи в WordPress на основании полученных данных.

  2. Безопасность: Для защиты вашего API реализуйте механизм аутентификации, который будет убедиться, что только авторизованные системы могут отправлять данные в WordPress. Это можно сделать, например, с помощью ключа API.

  3. Получение уникального идентификатора: Каждый раз, когда ваше внешнее приложение отправляет данные о транспортном средстве, убедитесь, что оно передает уникальный идентификатор записи. Сохраните его в пользовательском поле записи в WordPress, что позволит вам легко обновлять существующие записи, не создавая новые дубликаты.

  4. Обработка данных: В вашем плагине создайте функцию, которая будет обрабатывать полученные данные, создавая или обновляя записи пользовательского типа. Для этого можно использовать функции wp_insert_post() и update_post_meta().

  5. Пример кода:

    
    add_action('wp_ajax_nopriv_update_vehicle', 'update_vehicle_data');
    add_action('wp_ajax_update_vehicle', 'update_vehicle_data');

function update_vehicle_data() {
if (!isset($_POST[‘api_key’]) || $_POST[‘api_key’] !== ‘YOUR_PRIVATE_KEY’) {
wp_send_json_error(‘Unauthorized’, 403);
return;
}

$vehicle_data = json_decode(file_get_contents("php://input"), true);
$unique_id = $vehicle_data['unique_id']; // Уникальный идентификатор

// Проверяем, существует ли запись
$post_id = find_post_by_meta($unique_id);
if ($post_id) {
    // Обновляем существующую запись
    wp_update_post(array(
        'ID' => $post_id,
        'post_title' => $vehicle_data['title'],
        'post_content' => $vehicle_data['description'],
        'post_status' => 'publish'
    ));
} else {
    // Создаем новую запись
    $post_id = wp_insert_post(array(
        'post_title' => $vehicle_data['title'],
        'post_content' => $vehicle_data['description'],
        'post_status' => 'publish',
        'post_type' => 'vehicle' // Название вашего пользовательского типа
    ));
}

// Сохраняем пользовательские поля
update_post_meta($post_id, 'unique_id', $unique_id);
// Другие пользовательские поля...

wp_send_json_success('Record updated');

}

function find_post_by_meta($unique_id) {
$args = array(
‘post_type’ => ‘vehicle’,
‘meta_query’ => array(
array(
‘key’ => ‘unique_id’,
‘value’ => $unique_id,
‘compare’ => ‘=’
)
)
);
$query = new WP_Query($args);
if ($query->have_posts()) {
return $query->posts[0]->ID;
}
return null;
}


### Вариант 2: Периодическая проверка данных (Polling)

Если прямой интеграции нет, можно реализовать периодическую проверку данных:

1. **Настройка WP-Cron**: Создайте задачу WP-Cron, которая будет периодически вызывать функцию для проверки изменений в вашей внешней базе данных. Эта функция должна делать запрос к вашему API и проверять наличие обновлений.

2. **Разработка логики проверки**: Ваша функция должна сохранять дату последней проверки и только получать данные, которые были изменены после этой даты.

3. **Ограничение нагрузки на систему**: Поскольку WP-Cron срабатывает в зависимости от посещаемости вашего сайта, вам нужно быть осторожным с частотой проверок. Настройте интервал желаемым образом.

4. **Пример кода для WP-Cron**:
```php
if (!wp_next_scheduled('fetch_vehicle_updates')) {
    wp_schedule_event(time(), 'hourly', 'fetch_vehicle_updates');
}

add_action('fetch_vehicle_updates', 'check_for_vehicle_updates');

function check_for_vehicle_updates() {
    // Здесь вы будете делать запрос к вашему API
    // Получение данных и обновление/создание записей, аналогично предыдущему примеру.
}

Заключение

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

Настоящая гибкость вашего решения позволит вам легко масштабироваться в будущем и адаптироваться к изменениям в ваших бизнес-процессах. Убедитесь, что разработка сопровождается надлежащей документацией и тестированием для обеспечения долговечности и устойчивости вашего решения.

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

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