Введение в автоматический импорт постов в WordPress
Автоматический импорт постов в WordPress — востребованная задача для сайтов, которые регулярно обновляются контентом из внешних источников: новостных лент, RSS, API партнеров или других сайтов. Это позволяет экономить время на ручном добавлении контента и поддерживать сайт всегда актуальным.
В этой статье мы рассмотрим, как реализовать автоматический импорт постов с помощью кастомного плагина и подключить поддержку виджетов для отображения импортированного контента. Такой подход дает гибкость и контроль над процессом, а также позволяет интегрировать импортированный контент в различные части сайта.
Выбор источника и способов импорта
Первый шаг — выбрать источник данных. Часто это RSS-ленты или JSON API. В зависимости от формата меняется и способ обработки данных.
Для примера возьмем JSON API, возвращающий массив постов с полями title, content, date, author.
Для автоматизации процесса лучше всего использовать WP Cron — системный планировщик задач WordPress, который запускает импорт через заданные интервалы.
Пример базовой функции импорта JSON
function wpzoom_import_posts_from_api() {
$response = wp_remote_get('https://example.com/api/posts');
if (is_wp_error($response)) {
return;
}
$data = json_decode(wp_remote_retrieve_body($response), true);
if (empty($data)) {
return;
}
foreach ($data as $item) {
// Проверяем, существует ли уже пост по уникальному признаку
$existing = get_page_by_title($item['title'], OBJECT, 'post');
if ($existing) {
continue;
}
// Создаем новый пост
$post_id = wp_insert_post([
'post_title' => sanitize_text_field($item['title']),
'post_content' => wp_kses_post($item['content']),
'post_date' => sanitize_text_field($item['date']),
'post_status' => 'publish',
'post_author' => 1,
]);
}
}Эта функция получает данные, проверяет на дубли и создает новые записи.
Настройка WP Cron для регулярного запуска импорта
Чтобы импорт выполнялся автоматически, добавим событие в WP Cron:
function wpzoom_activation() {
if (!wp_next_scheduled('wpzoom_import_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'wpzoom_import_cron_hook');
}
}
register_activation_hook(__FILE__, 'wpzoom_activation');
function wpzoom_deactivation() {
wp_clear_scheduled_hook('wpzoom_import_cron_hook');
}
register_deactivation_hook(__FILE__, 'wpzoom_deactivation');
add_action('wpzoom_import_cron_hook', 'wpzoom_import_posts_from_api');Здесь импорт будет запускаться ежечасно. Можно изменить частоту, зарегистрировав собственный интервал через фильтр cron_schedules.
Создание виджета для отображения импортированных постов
Чтобы показывать импортированные посты в сайдбаре или других областях, создадим простой виджет.
class WPZoom_Imported_Posts_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'wpzoom_imported_posts_widget',
'Импортированные посты',
['description' => 'Отображает последние импортированные посты']
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
echo $args['before_title'] . 'Последние импортированные посты' . $args['after_title'];
$query = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC',
'meta_key' => '_imported', // Можно добавить мета для точной фильтрации
]);
if ($query->have_posts()) {
echo '<ul>';
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Нет импортированных постов</p>';
}
echo $args['after_widget'];
}
public function form($instance) {
// Можно добавить настройки виджета
}
public function update($new_instance, $old_instance) {
return $new_instance;
}
}
function wpzoom_register_widgets() {
register_widget('WPZoom_Imported_Posts_Widget');
}
add_action('widgets_init', 'wpzoom_register_widgets');Этот виджет выводит последние 5 импортированных постов. Для точной фильтрации можно при импорте добавлять мета-поле _imported.
Добавление мета-поля при импорте для удобной фильтрации
Чтобы отличать импортированные записи от остальных, добавим мета-поле при создании поста:
function wpzoom_import_posts_from_api() {
$response = wp_remote_get('https://example.com/api/posts');
if (is_wp_error($response)) {
return;
}
$data = json_decode(wp_remote_retrieve_body($response), true);
if (empty($data)) {
return;
}
foreach ($data as $item) {
$existing = get_page_by_title($item['title'], OBJECT, 'post');
if ($existing) {
continue;
}
$post_id = wp_insert_post([
'post_title' => sanitize_text_field($item['title']),
'post_content' => wp_kses_post($item['content']),
'post_date' => sanitize_text_field($item['date']),
'post_status' => 'publish',
'post_author' => 1,
]);
if ($post_id) {
update_post_meta($post_id, '_imported', 1);
}
}
}Дополнительные советы и рекомендации
1. Если источник часто меняется, используйте кеширование или проверяйте ETag, чтобы не импортировать одни и те же данные повторно.
2. Для более сложных сценариев рассмотрите использование WP All Import или аналогичных плагинов с поддержкой cron и API.
3. При работе с большим объемом данных разбивайте импорт на части, чтобы избежать превышения лимитов по времени выполнения.
4. Если нужна интеграция с плагинами, например, Expert Review для автоматических отзывов, импортируйте дополнительные поля и связывайте записи после импорта.
Заключение
Создание собственного механизма автоматического импорта постов в WordPress позволяет гибко управлять контентом, интегрировать его с виджетами и расширениями сайта. Используйте WP Cron для регулярного запуска, добавляйте мета-поля для фильтрации и создавайте удобные виджеты для отображения данных.
Для удобства можно оформить этот функционал в отдельный плагин и расширять его по мере необходимости.
Если хотите готовое решение с расширенными возможностями, обратите внимание на плагины с поддержкой импорта и интеграцией с вашей темой или виджетами. Например, можно использовать Expert Review для автоматизации отзывов, или тему Root с улучшенной интеграцией виджетов и кастомных типов записей.