Автоматический импорт постов в WordPress — востребованная задача, особенно если нужно регулярно обновлять контент с внешних источников. В этой статье подробно рассмотрим, как создать собственный механизм импорта постов, используя WPUnit и стандартные средства WordPress. Это позволит не только автоматизировать процесс, но и получить гибкие настройки под свои задачи.
Почему стоит создавать собственный импорт вместо плагинов?
Готовые плагины для импорта часто не подходят под конкретные задачи или перегружены ненужным функционалом. Собственный импорт позволит:
- Точно контролировать формат данных и логику обработки.
- Легко интегрировать с кастомными типами записей и таксономиями.
- Автоматизировать задачи с помощью WP-Cron и событий.
- Оптимизировать скорость и ресурсы, минимизируя нагрузку.
Далее рассмотрим все этапы создания автоматического импорта постов.
Шаг 1. Подготовка источника данных для импорта
Первое — необходимо определиться с источником. Это может быть JSON с внешнего API, XML-файл, CSV или даже RSS-лента. Для примера возьмём JSON API. Предположим, что внешний сервис возвращает список постов в формате:
{
"posts": [
{"title": "Заголовок 1", "content": "Содержимое 1", "date": "2024-06-01"},
{"title": "Заголовок 2", "content": "Содержимое 2", "date": "2024-06-02"}
]
}Чтобы загрузить этот JSON, можно использовать wp_remote_get, встроенную функцию WordPress для HTTP-запросов.
Пример функции для получения данных из API
function wpunit_get_import_data() {
$response = wp_remote_get('https://example.com/api/posts');
if (is_wp_error($response)) {
return false;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (json_last_error() !== JSON_ERROR_NONE) {
return false;
}
return $data['posts'] ?? [];
}Эта функция возвращает массив постов или false при ошибке.
Шаг 2. Обработка и импорт данных в WordPress
После получения массива постов нужно пройтись по каждому элементу и создать запись в WordPress через wp_insert_post. Важно проверить, чтобы не было дублирования постов — для этого можно хранить внешний ID или сравнивать по названию и дате.
Пример функции импорта одного поста
function wpunit_import_single_post($post_data) {
// Проверяем наличие поста с таким названием и датой
$existing = get_posts([
'title' => $post_data['title'],
'date_query' => [
[
'year' => date('Y', strtotime($post_data['date'])),
'month' => date('m', strtotime($post_data['date'])),
'day' => date('d', strtotime($post_data['date'])),
],
],
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
]);
if (!empty($existing)) {
// Такой пост уже есть, пропускаем
return false;
}
$postarr = [
'post_title' => wp_strip_all_tags($post_data['title']),
'post_content' => $post_data['content'],
'post_status' => 'publish',
'post_date' => $post_data['date'],
'post_type' => 'post',
];
$post_id = wp_insert_post($postarr);
return $post_id;
}Данная функция вставляет пост, если такого ещё нет, и возвращает ID созданного поста.
Шаг 3. Автоматизация импорта с помощью WP-Cron
Чтобы импорт происходил регулярно без вашего участия, используем WP-Cron — планировщик задач WordPress. Настроим событие, которое будет запускать импорт раз в час.
Добавление WP-Cron события
function wpunit_schedule_import() {
if (!wp_next_scheduled('wpunit_import_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'wpunit_import_cron_hook');
}
}
add_action('wp', 'wpunit_schedule_import');Обработчик Cron события
function wpunit_import_cron_function() {
$posts = wpunit_get_import_data();
if (!$posts) {
return;
}
foreach ($posts as $post_data) {
wpunit_import_single_post($post_data);
}
}
add_action('wpunit_import_cron_hook', 'wpunit_import_cron_function');Таким образом, импорт будет происходить автоматически каждый час.
Шаг 4. Обработка ошибок и логирование
Очень важно вести логирование ошибок, чтобы в случае проблем быстро понять причину. Для этого можно записывать ошибки в отдельный файл или использовать стандартный error_log. Вот простой пример записи ошибок в файл:
function wpunit_log_error($message) {
$log_file = WP_CONTENT_DIR . '/wpunit-import-errors.log';
$date = date('Y-m-d H:i:s');
error_log("[$date] $message\n", 3, $log_file);
}В функции импорта добавьте вызовы wpunit_log_error при неудачных запросах или ошибках.
Шаг 5. Использование плагинов WPUnit для расширения возможностей
WPUnit предлагает удобные инструменты для работы с базой данных и планировщиком событий, что упрощает автоматизацию.
Например, с помощью метода WPUnit Database Query можно эффективно проверять наличие постов, а WPUnit Schedule Event — легко управлять крон-событиями.
Если вы хотите добавить визуальный интерфейс для запуска импорта вручную и просмотра логов, рекомендуем использовать плагин WPUnit от WPShop, который отлично интегрируется с таким функционалом.
Подсказки и советы по улучшению импорта
- При большом объёме данных разбивайте импорт на части, чтобы избежать таймаутов сервера.
- Для импорта изображений используйте функцию
media_sideload_image, чтобы добавлять медиафайлы к постам. - Можно расширить функционал, импортируя кастомные поля и таксономии, передавая их в
wp_insert_postи используя функцииupdate_post_meta. - Для управления импортом из админки создайте отдельную страницу с кнопкой запуска и выводом статуса.
Заключение
Создание собственного автоматического импорта постов в WordPress — задача вполне решаемая и гибкая. Используя базовые функции WordPress, WP-Cron и возможности WPUnit, вы сможете настроить именно тот процесс, который подходит под ваши нужды, избегая ограничений готовых плагинов.
Если хотите облегчить разработку и получить готовые инструменты для работы с импортом и событиями, рекомендуем ознакомиться с WPUnit от WPShop.