Создание персонализированных функций, таких как «Список Желаний» (Wishlist), является ключевым элементом для повышения вовлеченности пользователей и улучшения конверсии на любом ресурсе, основанном на WordPress. Когда речь идет о том, чтобы позволить пользователю сохранить определенные объекты (товары, статьи, недвижимость и т.д.) в свой личный, уникальный список, стандартные механизмы хранения данных могут оказаться недостаточными.
В этой статье мы рассмотрим, как реализовать базовый функционал добавления объектов в Wishlist, используя правильный механизм хранения данных в WordPress – User Meta – в сочетании с AJAX для обеспечения динамичности и удобства.
User Meta vs. Post Meta: Выбор Хранилища
Для большинства данных, связанных с конкретным контентом (например, дополнительная информация о товаре, посте или типе записи Property), мы используем Post Meta (таблица wp_postmeta). Однако Wishlist — это данные, привязанные не к объекту, а к конкретному пользователю.
Для таких задач WordPress предоставляет механизм User Meta (таблица wp_usermeta).
Вместо того чтобы хранить список желаний в метаданных поста, мы должны собрать массив ID всех выбранных пользователем объектов и хранить этот массив как одну или несколько записей, привязанных к его уникальному User ID.
Это фундаментальное архитектурное решение позволяет:
- У каждого зарегистрированного пользователя будет свой, изолированный список.
- Данные хранятся в предназначенной для этого таблице
wp_usermeta, что соответствует стандартам WordPress.
Разработка Back-end: PHP-Класс и AJAX-Хуки
Для управления логикой Wishlist мы создадим отдельный PHP-класс, например, Property_Wishlist, который будет инкапсулировать все необходимые методы. Поскольку добавление и удаление объектов должно происходить без перезагрузки страницы, мы будем использовать AJAX.
1. Подготовка Класса
В классе Property_Wishlist необходимо инициализировать экземпляр и зарегистрировать AJAX-хуки. Поскольку функционал актуален только для авторизованных пользователей (тех, у кого есть User ID), достаточно использовать только хук для залогиненных:
PHP
add_action( 'wp_ajax_ali_property_add', [ $this, 'add_property_to_wishlist' ] );
add_action( 'wp_ajax_ali_property_remove', [ $this, 'remove_property_from_wishlist' ] );
Здесь ali_property_add и ali_property_remove — это названия наших AJAX-действий.
2. Добавление объекта: add_property_to_wishlist
Основная задача этого метода — получить из AJAX-запроса ID объекта (property_id) и ID пользователя (user_id), а затем сохранить их.
Мы используем функцию add_user_meta(), которая принимает три обязательных параметра:
- User ID (
$user_id). - Meta Key (ключ метаданных), который мы сами придумываем, например,
ali_property_wishlist. - Meta Value (значение), которое в нашем случае будет ID объекта (
$property_id).
Важно отметить: если нам нужно хранить массив ID, который может расти, использование add_user_meta позволит нам добавить несколько мета-записей с одним и тем же meta_key, но с разными meta_value.
// Упрощенная логика
function add_property_to_wishlist() {
// 1. Получаем и проверяем property_id и user_id
$property_id = intval( $_POST['property_id'] );
$user_id = intval( $_POST['user_id'] );
if ( $property_id > 0 && $user_id > 0 ) {
// 2. Добавляем мета-данные пользователя
$result = add_user_meta( $user_id, 'ali_property_wishlist', $property_id );
if ( $result ) {
// Успех
} else {
// Ошибка добавления
}
} else {
// Ошибка: некорректные ID
}
wp_die(); // Обязательно завершаем AJAX-ответ
}
3. Удаление объекта: remove_property_from_wishlist
Для удаления объекта используется аналогичный метод и функция delete_user_meta(). Эта функция позволяет удалить конкретную запись метаданных, указав все три параметра: User ID, Meta Key и Meta Value (ID объекта).
Таким образом, мы нацеливаемся на удаление только того ID, который был передан в запросе, сохраняя при этом другие объекты в списке желаний.
Проверка Статуса: В Wishlist или Нет?
Функционал Wishlist на фронтенде требует проверки: должен ли пользователь видеть кнопку «Добавить в Wishlist» или «Удалить из Wishlist»?
Для этого необходим отдельный метод is_property_in_wishlist, который выполнит запрос к базе данных, чтобы проверить наличие конкретного ID объекта в метаданных конкретного пользователя.
Для прямого запроса к таблице wp_usermeta используется глобальный объект $wpdb.
function is_property_in_wishlist( $user_id, $property_id ) {
global $wpdb;
// Ищем строку в wp_usermeta, где user_id, meta_key и meta_value совпадают
$query = $wpdb->prepare(
"SELECT * FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s AND meta_value = %s",
$user_id,
'ali_property_wishlist',
$property_id
);
$result = $wpdb->get_results( $query );
return ! empty( $result );
}
Этот метод затем используется на странице архива объектов: если is_property_in_wishlist возвращает true, показываем кнопку удаления, иначе — добавления.
Заключение
Использование User Meta для хранения данных, привязанных к конкретному пользователю, является правильным и масштабируемым подходом в WordPress. В сочетании с AJAX для динамического взаимодействия мы создали надежный back-end для Wishlist.
В следующей части мы рассмотрим реализацию фронтенд-части: как использовать JavaScript (jQuery) для отправки AJAX-запросов и как динамически обновлять кнопки на странице после успешного добавления или удаления объекта, чтобы пользовательский опыт был максимально комфортным.