wpcompany.ru wordpress WPCompany

Как сделать отзывы с рейтингом в WordPress без плагинов

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

Почему стоит создавать отзывы вручную, а не использовать плагины

Плагины для отзывов часто имеют массу лишнего функционала, который не нужен для ваших задач. Они могут замедлять сайт, конфликтовать с другими расширениями и ограничивать кастомизацию. Создавая систему отзывов самостоятельно, вы получаете полный контроль над структурой, дизайном и функционалом.

Кроме того, ручная реализация позволяет легко интегрировать отзывы в любую тему и дизайн, а также хранить данные в удобном формате.

Создаем кастомный тип записей «Отзывы» и мета-поля для рейтинга

Для начала зарегистрируем кастомный тип записей, который будет хранить отзывы. Добавим этот код в файл functions.php вашей темы или в отдельный плагин:

function wpcompany_register_reviews_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' => true,
        'has_archive' => true,
        'supports' => array('title', 'editor'),
        'menu_position' => 20,
        'menu_icon' => 'dashicons-star-filled',
    );
    register_post_type('wpcompany_review', $args);
}
add_action('init', 'wpcompany_register_reviews_cpt');

Теперь добавим мета-поле для рейтинга от 1 до 5. Для простоты воспользуемся стандартным сохранением мета-данных при сохранении записи. Добавим мета-бокс с рейтингом:

function wpcompany_add_review_meta_box() {
    add_meta_box('wpcompany_review_rating', 'Рейтинг', 'wpcompany_review_rating_callback', 'wpcompany_review', 'side');
}
add_action('add_meta_boxes', 'wpcompany_add_review_meta_box');

function wpcompany_review_rating_callback($post) {
    $rating = get_post_meta($post->ID, '_wpcompany_review_rating', true);
    if (!$rating) $rating = 0;
    echo '<label for="wpcompany_review_rating_field">Оценка (1-5):</label>';
    echo '<input type="number" id="wpcompany_review_rating_field" name="wpcompany_review_rating_field" min="1" max="5" value="' . esc_attr($rating) . '" style="width: 50px;" />';
}

function wpcompany_save_review_rating($post_id) {
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (isset($_POST['wpcompany_review_rating_field'])) {
        $rating = intval($_POST['wpcompany_review_rating_field']);
        if ($rating < 1) $rating = 1;
        if ($rating > 5) $rating = 5;
        update_post_meta($post_id, '_wpcompany_review_rating', $rating);
    }
}
add_action('save_post', 'wpcompany_save_review_rating');

Теперь при добавлении отзыва в админке можно ставить оценку.

Создаем форму добавления отзывов на фронтенде с AJAX

Чтобы посетители могли оставлять отзывы прямо на сайте, создадим форму с полями: имя, текст отзыва и рейтинг. Отправка будет через AJAX, чтобы не перезагружать страницу.

Добавим шорткод для вывода формы:

function wpcompany_review_form_shortcode() {
    ob_start();
    ?>
    <form id="wpcompany-review-form" method="post">
        <p><label for="wpcompany_review_name">Имя:</label><br />
        <input type="text" id="wpcompany_review_name" name="wpcompany_review_name" required /></p>

        <p><label for="wpcompany_review_text">Отзыв:</label><br />
        <textarea id="wpcompany_review_text" name="wpcompany_review_text" rows="5" required></textarea></p>

        <p><label for="wpcompany_review_rating">Рейтинг (1-5):</label><br />
        <input type="number" id="wpcompany_review_rating" name="wpcompany_review_rating" min="1" max="5" value="5" required /></p>

        <button type="submit">Отправить отзыв</button>
        <div id="wpcompany-review-message" style="margin-top:10px;color:green;"></div>
    </form>
    <script>
    document.getElementById('wpcompany-review-form').addEventListener('submit', function(e) {
        e.preventDefault();
        var form = this;
        var data = new FormData(form);
        data.append('action', 'wpcompany_submit_review');

        fetch(' + JSON.stringify(admin_url('admin-ajax.php')) + ', {
            method: 'POST',
            credentials: 'same-origin',
            body: data
        }).then(response => response.json()).then(json => {
            var messageEl = document.getElementById('wpcompany-review-message');
            if(json.success) {
                messageEl.style.color = 'green';
                messageEl.textContent = 'Спасибо за ваш отзыв!';
                form.reset();
            } else {
                messageEl.style.color = 'red';
                messageEl.textContent = json.data || 'Ошибка при отправке отзыва.';
            }
        });
    });
    </script>
    <?php
    return ob_get_clean();
}
add_shortcode('wpcompany_review_form', 'wpcompany_review_form_shortcode');

Теперь добавим обработчик AJAX на сервере:

function wpcompany_handle_submit_review() {
    // Проверяем поля
    $name = isset($_POST['wpcompany_review_name']) ? sanitize_text_field($_POST['wpcompany_review_name']) : '';
    $text = isset($_POST['wpcompany_review_text']) ? sanitize_textarea_field($_POST['wpcompany_review_text']) : '';
    $rating = isset($_POST['wpcompany_review_rating']) ? intval($_POST['wpcompany_review_rating']) : 0;

    if(empty($name) || empty($text) || $rating < 1 || $rating > 5) {
        wp_send_json_error('Пожалуйста, заполните все поля корректно.');
    }

    // Создаем новый отзыв
    $new_review = array(
        'post_title' => 'Отзыв от ' . $name,
        'post_content' => $text,
        'post_status' => 'pending', // сначала на модерацию
        'post_type' => 'wpcompany_review'
    );
    $post_id = wp_insert_post($new_review);

    if(is_wp_error($post_id) || !$post_id) {
        wp_send_json_error('Ошибка при сохранении отзыва.');
    }

    update_post_meta($post_id, '_wpcompany_review_rating', $rating);

    wp_send_json_success();
}
add_action('wp_ajax_wpcompany_submit_review', 'wpcompany_handle_submit_review');
add_action('wp_ajax_nopriv_wpcompany_submit_review', 'wpcompany_handle_submit_review');

Таким образом, посетители смогут отправлять отзывы, которые будут сохраняться и попадать на модерацию в админку.

Отображение отзывов с рейтингом на сайте

Чтобы вывести отзывы с рейтингом, напишем функцию-шорткод, которая выведет последние отзывы со звездочками рейтинга:

function wpcompany_display_reviews_shortcode($atts) {
    $atts = shortcode_atts(array('count' => 5), $atts, 'wpcompany_display_reviews');
    $args = array(
        'post_type' => 'wpcompany_review',
        'post_status' => 'publish',
        'posts_per_page' => intval($atts['count']),
        'orderby' => 'date',
        'order' => 'DESC'
    );
    $reviews = get_posts($args);

    if(empty($reviews)) {
        return '<p>Отзывы еще не добавлены.</p>';
    }

    ob_start();
    echo '<div class="wpcompany-reviews">';
    foreach($reviews as $review) {
        $rating = get_post_meta($review->ID, '_wpcompany_review_rating', true);
        $rating = intval($rating);

        echo '<div class="wpcompany-review" style="border:1px solid #ccc; padding:10px; margin-bottom:10px;">';
        echo '<h3>' . esc_html($review->post_title) . '</h3>';
        echo '<div class="wpcompany-review-rating">' . wpcompany_get_stars_html($rating) . '</div>';
        echo '<div class="wpcompany-review-content">' . wpautop(esc_html($review->post_content)) . '</div>';
        echo '</div>';
    }
    echo '</div>';
    return ob_get_clean();
}
add_shortcode('wpcompany_display_reviews', 'wpcompany_display_reviews_shortcode');

function wpcompany_get_stars_html($count) {
    $max = 5;
    $html = '';
    for($i = 1; $i <= $max; $i++) {
        if($i <= $count) {
            $html .= '<span style="color:gold; font-size:18px;">★</span>';
        } else {
            $html .= '<span style="color:#ccc; font-size:18px;">☆</span>';
        }
    }
    return $html;
}

Теперь на странице или в записи можно вставлять шорткод [wpcompany_display_reviews count="3"], чтобы вывести последние 3 отзыва с рейтингом.

Советы по улучшению и безопасности

1. Добавьте nonce-поля в форму и проверяйте их в обработчике AJAX для защиты от CSRF.

2. Реализуйте капчу или ограничение по частоте отправки отзывов, чтобы избежать спама.

3. Настройте уведомления на почту администратору о новых отзывах для быстрой модерации.

4. Можно добавить пользовательские поля, например, Email или URL сайта автора.

5. Для улучшения внешнего вида используйте CSS и иконки из библиотек, например, FontAwesome.

Заключение по внедрению отзывов с рейтингом без плагинов

Создание системы отзывов с рейтингом в WordPress без плагинов — задача вполне решаемая с помощью кастомных типов записей, мета-полей и AJAX. Такой подход дает гибкость, позволяет полностью контролировать функциональность и дизайн, а также уменьшает нагрузку на сайт.

Если вы хотите расширить функционал, можно интегрировать этот код с плагинами из WPShop.ru, например, с Expert Review для более продвинутых возможностей модерации и выводов.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше