Создание плагина WordPress для лайков постов с использованием AJAX и отдельной таблицы в базе данных

от автора

в
Время чтения: 4 мин.

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


Что мы будем делать?

  1. Создадим таблицу в базе данных для хранения лайков.
  2. Реализуем функционал добавления лайков с использованием AJAX.
  3. Добавим кнопку лайка в контент поста.
  4. Обеспечим безопасность и удобство использования.

Шаг 1: Создание структуры плагина

Создайте папку для плагина, например, my-post-likes, и внутри нее создайте файл my-post-likes.php. Это будет основной файл плагина.

<?php
/*
Plugin Name: My Post Likes
Description: Плагин для добавления лайков к постам для авторизованных пользователей.
Version: 1.0
Author: Ваше Имя
*/

// Безопасность
if (!defined('ABSPATH')) {
    exit;
}

Шаг 2: Создание таблицы в базе данных

При активации плагина создадим таблицу wp_my_post_likes, где будем хранить post_id и user_id.

// Создание таблицы в БД при активации плагина
register_activation_hook(__FILE__, 'my_create_likes_table');

function my_create_likes_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'my_post_likes'; // Используем префикс my
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        post_id bigint(20) NOT NULL,
        user_id bigint(20) NOT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY (post_id, user_id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

Шаг 3: Подключение скриптов

Для работы с AJAX подключим JavaScript-файл и передадим в него необходимые данные.

// Подключение скриптов
add_action('wp_enqueue_scripts', 'my_enqueue_likes_scripts');

function my_enqueue_likes_scripts() {
    wp_enqueue_script('my-post-likes', plugin_dir_url(__FILE__) . 'my-post-likes.js', array('jquery'), null, true);
    wp_localize_script('my-post-likes', 'my_likes_ajax', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('my_likes_nonce')
    ));
}

Шаг 4: Обработка AJAX-запроса

Добавим обработчик для добавления лайков.

// Обработка AJAX-запроса для добавления лайка
add_action('wp_ajax_my_add_like', 'my_handle_add_like');

function my_handle_add_like() {
    if (!is_user_logged_in()) {
        wp_send_json_error('Только авторизованные пользователи могут ставить лайки.');
    }

    check_ajax_referer('my_likes_nonce', 'nonce');

    $post_id = intval($_POST['post_id']);
    $user_id = get_current_user_id();

    if (!$post_id || !$user_id) {
        wp_send_json_error('Ошибка данных.');
    }

    global $wpdb;
    $table_name = $wpdb->prefix . 'my_post_likes';

    // Проверяем, не ставил ли пользователь уже лайк
    $existing_like = $wpdb->get_row($wpdb->prepare(
        "SELECT id FROM $table_name WHERE post_id = %d AND user_id = %d",
        $post_id, $user_id
    ));

    if ($existing_like) {
        wp_send_json_error('Вы уже ставили лайк этому посту.');
    }

    // Добавляем лайк
    $wpdb->insert(
        $table_name,
        array(
            'post_id' => $post_id,
            'user_id' => $user_id
        ),
        array('%d', '%d')
    );

    // Получаем количество лайков
    $likes_count = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM $table_name WHERE post_id = %d",
        $post_id
    ));

    wp_send_json_success(array('likes_count' => $likes_count));
}

Шаг 5: Вывод кнопки лайка

Добавим функцию для отображения кнопки лайка и количества лайков.

// Вывод кнопки лайка и количества лайков
function my_display_likes_button($post_id) {
    if (!is_user_logged_in()) {
        return;
    }

    global $wpdb;
    $table_name = $wpdb->prefix . 'my_post_likes';

    $likes_count = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM $table_name WHERE post_id = %d",
        $post_id
    ));

    $user_id = get_current_user_id();
    $user_liked = $wpdb->get_row($wpdb->prepare(
        "SELECT id FROM $table_name WHERE post_id = %d AND user_id = %d",
        $post_id, $user_id
    ));

    $liked_class = $user_liked ? 'liked' : '';

    ob_start();
    ?>
    <div class="my-post-likes">
        <button class="my-like-button <?php echo $liked_class; ?>" data-post-id="<?php echo $post_id; ?>">
            Нравится (<span class="my-likes-count"><?php echo $likes_count; ?></span>)
        </button>
    </div>
    <?php
    return ob_get_clean();
}

// Добавляем кнопку лайка в контент поста
add_filter('the_content', 'my_add_likes_button_to_content');

function my_add_likes_button_to_content($content) {
    if (is_single() && is_user_logged_in()) {
        $content .= my_display_likes_button(get_the_ID());
    }
    return $content;
}

Шаг 6: JavaScript для обработки кликов

Создайте файл my-post-likes.js в папке плагина:

jQuery(document).ready(function($) {
    $('.my-like-button').on('click', function(e) {
        e.preventDefault();

        var button = $(this);
        var post_id = button.data('post-id');

        if (button.hasClass('liked')) {
            return;
        }

        $.ajax({
            url: my_likes_ajax.ajax_url,
            type: 'POST',
            data: {
                action: 'my_add_like',
                post_id: post_id,
                nonce: my_likes_ajax.nonce
            },
            success: function(response) {
                if (response.success) {
                    button.addClass('liked');
                    button.find('.my-likes-count').text(response.data.likes_count);
                } else {
                    alert(response.data);
                }
            },
            error: function() {
                alert('Ошибка при отправке запроса.');
            }
        });
    });
});

Шаг 7: Активация плагина

  1. Загрузите папку плагина в директорию wp-content/plugins/.
  2. Активируйте плагин в админке WordPress.

Заключение

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

Удачи в разработке! 🚀


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 4 + 7?