Вопрос или проблема
Я пытаюсь создать простой список “избранных” продуктов. В основном, при просмотре списка продуктов кто-то может нажать кнопку, которая добавляет его в “избранное”.
Идея заключается в том, что они нажимают кнопку, и ajax добавляет productID в массив в пользовательских метаданных. В следующий раз, когда они нажимают ту же кнопку, она должна удалить productID из пользовательских метаданных.
У меня все настроено с ajax, и при первом нажатии кнопки добавляется productID. Однако, если я нажимаю ее снова, я получаю ошибку вместо удаления ID из пользовательских метаданных. Ошибка просто: “Ошибка обновления метаданных пользователя.”
Я полагаю, что ошибка происходит из unset($fav_products[$product_id]);
Вот PHP функция, вызываемая ajax
function update_user_meta_ajax() {
$user_id = isset( $_POST['user_id'] ) ? intval( $_POST['user_id'] ) : 0;
$product_id = isset( $_POST['product_id'] ) ? sanitize_text_field( $_POST['product_id'] ) : '';
$meta_key = isset( $_POST['meta_key'] ) ? sanitize_text_field( $_POST['meta_key'] ) : '';
$meta_value = isset( $_POST['meta_value'] ) ? sanitize_text_field( $_POST['meta_value'] ) : '';
// Получение сохраненного массива
$fav_products = get_user_meta($user_id, 'fav_products', true);
// Проверка, пуст ли массив
if (empty($fav_products)) {
$fav_products = array();
}
// Добавление или удаление элемента из массива
if($meta_value == 'yes'){
$fav_products[] = $product_id;
}else{
unset($fav_products[$product_id]);
}
if (! current_user_can('edit_user', $user_id)) {
wp_send_json_error(array('message' => 'Недостаточно прав.'));
}
if (update_user_meta($user_id, $meta_key, $fav_products)) {
wp_send_json_success();
} else {
wp_send_json_error(array('message' => 'Не удалось обновить метаданные пользователя.'));
}
wp_die();
}
Ответ или решение
Создание списка избранных продуктов — это популярная функция на многих платформах электронной коммерции, позволяющая пользователям сохранять интересующие их продукты для будущего просмотра. Проблема, с которой вы столкнулись при разработке такой функции с использованием AJAX и мета-данных пользователей, заключается в удалении идентификатора продукта из массива избранных. Давайте подробно разберем эту задачу и рассмотрим возможные решения, чтобы устранить возникшую ошибку.
Теория
Во-первых, важно понять, как работает механизм сохранения и обновления мета-данных пользователей в WordPress. Функция get_user_meta
используется для извлечения мета-данных пользователя, которые хранятся в виде сериализованных данных, если речь идет об массиве. Функция update_user_meta
обновляет или добавляет новые мета-данные для определенного пользователя. Эти функции используются для управления пользовательскими данными, такими как список избранных продуктов.
Ваша задача заключается в добавлении и удалении идентификаторов продуктов из массива, который хранится в мета-данных пользователя. Основная ошибка, вероятно, вызвана некорректным манипулированием массивом, а именно попыткой удаления элемента не с тем индексом.
Пример
Пример вашего кода содержит несколько аспектов, которые могут вызвать проблему:
-
Инициализация массива: Проверка пустоты массива и его инициализация, если он пуст, выполняются корректно. Это обязательный шаг для предотвращения ошибок при попытке добавить элемент к несуществующему массиву.
-
Удаление элемента из массива: Проблема, вероятно, заключается здесь. В PHP функция
unset
удаляет элементы массива, но для ассоциативного массива требуется точное указание ключа. Однако в вашем случае, вероятно,fav_products
представляет собой числовой массив (индексами являются числа, а не сами идентификаторы продуктов), потому попытка удаления с использованиемunset($fav_products[$product_id])
не соответствует реальной структуре массива. -
Проверка прав пользователя: Вы правильно проверяете права пользователя перед обновлением мета-данных. Это важно для безопасности, поскольку изменение данных пользователя не должно быть доступно неавторизованным лицам.
Применение
Чтобы исправить ошибку и правильно реализовать функциональность добавления/удаления из массива избранных, следуйте данным рекомендациям:
- Корректное удаление элемента из массива: Вместо использования
unset($fav_products[$product_id])
, который ожидает, что$product_id
является индексом массива, используйте функциюarray_search
, чтобы найти индекс элемента, который необходимо удалить:
$index = array_search($product_id, $fav_products);
if ($index !== false) {
unset($fav_products[$index]);
}
Этот подход обеспечит успешное удаление элемента.
- Избегайте дублирующих записей: Чтобы предотвратить добавление дубликатов в массив избранных, убедитесь, что продукт не добавлен ранее:
if($meta_value == 'yes'){
if(!in_array($product_id, $fav_products)) {
$fav_products[] = $product_id;
}
}
- Окончательная проверка: После изменения массива убедитесь, что изменения действительно сохраняются. Обратите внимание на тип данных, передаваемый в
update_user_meta
. Поскольку это массив, он автоматически сериализуется функцией.
Пример кода после исправлений:
function update_user_meta_ajax() {
$user_id = isset( $_POST['user_id'] ) ? intval( $_POST['user_id'] ) : 0;
$product_id = isset( $_POST['product_id'] ) ? sanitize_text_field( $_POST['product_id'] ) : '';
$meta_key = 'fav_products'; // Предполагаем, что используем фиксированный ключ
$meta_value = isset( $_POST['meta_value'] ) ? sanitize_text_field( $_POST['meta_value'] ) : '';
// Получаем существующий массив избранных продуктов
$fav_products = get_user_meta($user_id, $meta_key, true);
// Инициализируем массив, если он пуст
if ( !is_array( $fav_products ) ) {
$fav_products = array();
}
// Добавляем или удаляем продукт из массива
if( $meta_value == 'yes' ) {
if ( !in_array( $product_id, $fav_products ) ) {
$fav_products[] = $product_id;
}
} else {
$index = array_search($product_id, $fav_products);
if ($index !== false) {
unset($fav_products[$index]);
}
}
// Проверка прав текущего пользователя
if ( !current_user_can( 'edit_user', $user_id ) ) {
wp_send_json_error( array( 'message' => 'Недостаточно прав.' ) );
}
// Обновление мета-данных пользователя
if ( update_user_meta($user_id, $meta_key, $fav_products) ) {
wp_send_json_success();
} else {
wp_send_json_error( array( 'message' => 'Ошибка обновления мета-данных пользователя.' ) );
}
wp_die();
}
Убедитесь, что данный код соответствует вашему общему подходу к структуре данных. Инспектируйте консоль браузера и журнал ошибок сервера, чтобы выявлять и устранять возможные ошибки.