Для многих сайтов на WordPress важна возможность автоматически импортировать отзывы клиентов из различных источников, например, из CSV, XML или внешних API, с последующим подтверждением и модерацией. Это помогает поддерживать актуальность отзывов и снижает ручную работу по их добавлению.
Почему важен импорт отзывов с подтверждением
Автоматический импорт без контроля может привести к появлению спама, недостоверных или неподходящих отзывов на сайте. Поэтому необходимо организовать процесс, при котором новые отзывы сначала проходят проверку администратора, а уже после подтверждения публикуются на сайте.
Это особенно актуально для интернет-магазинов, сервисов и бизнесов, где отзывы влияют на доверие и конверсию.
Обзор подходов и нужных инструментов для импорта отзывов
Существует несколько способов автоматизировать импорт:
- Использование готовых плагинов с поддержкой импорта и модерации;
- Создание кастомного решения с помощью WP Cron и обработки данных;
- Интеграция с внешними API через REST;
- Использование плагинов для импорта CSV/XML с добавлением логики подтверждения.
Для примера рассмотрим создание собственного решения с использованием WP Cron и кастомного типа записей для отзывов.
Создание кастомного типа записи для отзывов с полем статуса подтверждения
Для начала регистрируем кастомный тип записи wpdesk_review с дополнительным метаполем wpdesk_confirmed, которое отражает статус подтверждения.
function wpdesk_register_review_cpt() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Поиск отзывов',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'Нет отзывов в корзине',
'menu_name' => 'Отзывы'
);
$args = array(
'labels' => $labels,
'public' => false,
'show_ui' => true,
'capability_type' => 'post',
'supports' => array('title', 'editor', 'author'),
'menu_position' => 20,
'menu_icon' => 'dashicons-format-chat',
'exclude_from_search'=> true
);
register_post_type('wpdesk_review', $args);
}
add_action('init', 'wpdesk_register_review_cpt');
Далее добавим метабокс для статуса подтверждения и сохраним его:
function wpdesk_add_review_metabox() {
add_meta_box('wpdesk_review_confirmed', 'Подтвержден', 'wpdesk_review_confirmed_cb', 'wpdesk_review', 'side');
}
function wpdesk_review_confirmed_cb($post) {
$value = get_post_meta($post->ID, 'wpdesk_confirmed', true);
wp_nonce_field('wpdesk_save_review_confirmed', 'wpdesk_review_confirmed_nonce');
echo '<label><input type="checkbox" name="wpdesk_confirmed" value="1" ' . checked(1, $value, false) . ' /> Подтвержден</label>';
}
function wpdesk_save_review_confirmed($post_id) {
if (!isset($_POST['wpdesk_review_confirmed_nonce']) || !wp_verify_nonce($_POST['wpdesk_review_confirmed_nonce'], 'wpdesk_save_review_confirmed')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpdesk_confirmed'])) {
update_post_meta($post_id, 'wpdesk_confirmed', 1);
} else {
update_post_meta($post_id, 'wpdesk_confirmed', 0);
}
}
add_action('add_meta_boxes', 'wpdesk_add_review_metabox');
add_action('save_post', 'wpdesk_save_review_confirmed');
Реализация импорта отзывов из CSV с добавлением статуса "не подтвержден"
Чтобы не перегружать статью, рассмотрим упрощённый пример импорта из CSV-файла, который можно запускать вручную или по Cron.
function wpdesk_import_reviews_from_csv($file_path) {
if (!file_exists($file_path)) {
return 'Файл не найден';
}
if (($handle = fopen($file_path, 'r')) !== false) {
$row = 0;
while (($data = fgetcsv($handle, 1000, ',')) !== false) {
if ($row === 0) { // Пропускаем заголовок
$row++;
continue;
}
$title = sanitize_text_field($data[0]);
$content = sanitize_textarea_field($data[1]);
$author = sanitize_text_field($data[2]);
// Создаём отзыв с статусом 'черновик'
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
'post_type' => 'wpdesk_review',
'post_author' => 1,
));
if (!is_wp_error($post_id)) {
update_post_meta($post_id, 'wpdesk_confirmed', 0); // Не подтверждён
// Можно добавить логику уведомления админа
}
$row++;
}
fclose($handle);
return 'Импорт завершён';
}
return 'Ошибка при открытии файла';
}
Запускайте функцию с указанием пути к CSV. В реальном проекте лучше подключить WP Cron для регулярного запуска и обрабатывать ошибки.
Вывод на сайт только подтверждённых отзывов с пагинацией
Для отображения отзывов на сайте выведем только те, у которых мета wpdesk_confirmed равна 1.
function wpdesk_get_confirmed_reviews($paged = 1, $posts_per_page = 5) {
$args = array(
'post_type' => 'wpdesk_review',
'post_status' => 'publish',
'meta_key' => 'wpdesk_confirmed',
'meta_value' => 1,
'paged' => $paged,
'posts_per_page' => $posts_per_page
);
$query = new WP_Query($args);
return $query;
}
Пример вывода в шаблоне:
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$reviews_query = wpdesk_get_confirmed_reviews($paged);
if ($reviews_query->have_posts()) :
echo '<ul class="wpdesk-reviews">';
while ($reviews_query->have_posts()) : $reviews_query->the_post();
echo '<li><h3>' . get_the_title() . '</h3>' . get_the_content() . '</li>';
endwhile;
echo '</ul>';
// Пагинация
echo paginate_links(array(
'total' => $reviews_query->max_num_pages,
'current' => $paged,
));
wp_reset_postdata();
else :
echo '<p>Отзывы не найдены.</p>';
endif;
Полезные плагины для автоматизации и улучшения процесса
Если не хочется писать весь код, можно использовать плагины с поддержкой импорта и модерации:
- WPRemark — плагин для отзывов с функциями модерации и импорта;
- WP All Import — мощный инструмент для импорта CSV/XML с поддержкой кастомных полей;
- Clearfy Pro — для оптимизации и безопасности, помогает блокировать спам;
- My Popup — для уведомлений администратора о новых отзывах на модерацию.
Советы по безопасности и производительности
При автоматическом импорте обязательно фильтруйте и валидируйте данные, чтобы не допустить XSS и SQL-инъекций.
Используйте WP Nonces при работе с формами и AJAX. Для больших объёмов данных запускайте импорт через WP Cron, чтобы не блокировать сайт.
Регулярно создавайте резервные копии базы данных перед массовыми операциями.