Добавление/удаление пользовательского мета-массива через AJAX

Вопрос или проблема

Я пытаюсь создать простой список “избранных” продуктов. В основном, при просмотре списка продуктов кто-то может нажать кнопку, которая добавляет его в “избранное”.

Идея заключается в том, что они нажимают кнопку, и 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 обновляет или добавляет новые мета-данные для определенного пользователя. Эти функции используются для управления пользовательскими данными, такими как список избранных продуктов.

Ваша задача заключается в добавлении и удалении идентификаторов продуктов из массива, который хранится в мета-данных пользователя. Основная ошибка, вероятно, вызвана некорректным манипулированием массивом, а именно попыткой удаления элемента не с тем индексом.

Пример

Пример вашего кода содержит несколько аспектов, которые могут вызвать проблему:

  1. Инициализация массива: Проверка пустоты массива и его инициализация, если он пуст, выполняются корректно. Это обязательный шаг для предотвращения ошибок при попытке добавить элемент к несуществующему массиву.

  2. Удаление элемента из массива: Проблема, вероятно, заключается здесь. В PHP функция unset удаляет элементы массива, но для ассоциативного массива требуется точное указание ключа. Однако в вашем случае, вероятно, fav_products представляет собой числовой массив (индексами являются числа, а не сами идентификаторы продуктов), потому попытка удаления с использованием unset($fav_products[$product_id]) не соответствует реальной структуре массива.

  3. Проверка прав пользователя: Вы правильно проверяете права пользователя перед обновлением мета-данных. Это важно для безопасности, поскольку изменение данных пользователя не должно быть доступно неавторизованным лицам.

Применение

Чтобы исправить ошибку и правильно реализовать функциональность добавления/удаления из массива избранных, следуйте данным рекомендациям:

  1. Корректное удаление элемента из массива: Вместо использования unset($fav_products[$product_id]), который ожидает, что $product_id является индексом массива, используйте функцию array_search, чтобы найти индекс элемента, который необходимо удалить:
$index = array_search($product_id, $fav_products);
if ($index !== false) {
    unset($fav_products[$index]);
}

Этот подход обеспечит успешное удаление элемента.

  1. Избегайте дублирующих записей: Чтобы предотвратить добавление дубликатов в массив избранных, убедитесь, что продукт не добавлен ранее:
if($meta_value == 'yes'){
    if(!in_array($product_id, $fav_products)) {
        $fav_products[] = $product_id;
    }
}
  1. Окончательная проверка: После изменения массива убедитесь, что изменения действительно сохраняются. Обратите внимание на тип данных, передаваемый в 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();
}

Убедитесь, что данный код соответствует вашему общему подходу к структуре данных. Инспектируйте консоль браузера и журнал ошибок сервера, чтобы выявлять и устранять возможные ошибки.

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

Капча загружается...