Как мне обновить значение мета-поля wp_postmeta в WordPress, которое содержит множество опций?

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

Я работаю над проектом LearnDash, где у меня есть мультисайт WordPress, главная сетевая страница содержит курсы LearnDash, а подсайты являются порталами.

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

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

Курс отображается как записанный в профиле пользователя WordPress, в разделе “Пользователь записан на курсы”. Проблема, с которой я сталкиваюсь, заключается в том, что студент не имеет доступа к курсу, если его идентификатор пользователя не добавлен вручную в список доступа к курсу (при редактировании курса он находится в разделе “Курсы, список доступа к курсам”).

Если курс куплен на главном сайте 1, где находятся курсы, проблем нет, и студент может получить доступ к курсу.

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

Я пытался добавить следующее в functions.php (только для тестирования на моей тестовой системе, чтобы увидеть, смогу ли я обновить meta_value)

`add_action( 'loop_start', 'your_function' );
function your_function() {
$course_id = 1646;
$metas = array( 
    '_sfwd-courses_course_access_list'   => '126',
);
foreach($metas as $key => $value) {
    update_post_meta( $course_id, $key, $value );
}`

но это не работает, в основном потому, что мне не следует пытаться это из functions.php, и также я подозреваю, что потому, что meta_value содержит много параметров, и здесь больше, чем просто добавление строки update_post_meta.

Вот wp_postmeta, meta_value:

a:15:{s:37:”sfwd-courses_course_short_description”;s:0:””;s:29:”sfwd-courses_course_materials”;s:0:””;s:30:”sfwd-courses_course_price_type”;s:4:”open”;s:30:”sfwd-courses_custom_button_url”;s:0:””;s:25:”sfwd-courses_course_price”;s:0:””;s:31:”sfwd-courses_course_access_list”;s:13:”9,11,13,15,14″;s:34:”sfwd-courses_course_lesson_orderby”;s:10:”menu_order”;s:32:”sfwd-courses_course_lesson_order”;s:3:”ASC”;s:40:”sfwd-courses_course_prerequisite_compare”;s:3:”ANY”;s:26:”sfwd-courses_course_points”;s:1:”0″;s:33:”sfwd-courses_course_points_access”;s:1:”0″;s:31:”sfwd-courses_expire_access_days”;s:0:””;s:24:”sfwd-courses_certificate”;s:4:”1565″;s:40:”sfwd-courses_course_prerequisite_enabled”;s:3:”off”;s:32:”sfwd-courses_course_prerequisite”;a:0:{}}

Я нашел место в LearnDash profile.php, где код перечисляет курсы студента, которые они купили, и этот код вызывается в “моем аккаунте”, на информационной панели, где студент нажимает на ссылку для доступа к курсу.

        <?php foreach ( $user_courses as $course_id ) : ?>
            <?php
                $course = get_post( $course_id);

                $course_link = get_permalink( $course_id );

                $progress = learndash_course_progress( array(
                    'user_id'   => $user_id,
                    'course_id' => $course_id,
                    'array'     => true
                ) );

                $status = ( $progress['percentage'] == 100 ) ? 'completed' : 'notcompleted';
            ?>

Мне просто нужно найти метод для обновления meta_value sfwd-courses_course_access_list. Я пытался добавить следующее сразу под $course = get_post( $course_id);

$course_id = 1646;
$metas = array( 
    '_sfwd-courses_course_access_list'   => '126',
);
foreach($metas as $key => $value) {
    update_post_meta( $course_id, $key, $value );
}

Вышеуказанное не работает, и я искал ответ во всех уголках и полностью застрял. Мой вопрос: каков правильный способ обновления meta_value в этой ситуации?

То, что вы пытаетесь сделать, это получить доступ к свойству внутри сериализованного объекта. Что ж, это нельзя сделать напрямую. Данные, которые у вас есть, сериализованы, именно поэтому обновление с помощью _sfwd-courses_course_access_list не сработает, так как это находится только внутри meta_value записи.

Вам нужно десериализовать, обновить и затем сохранить с использованием функции update_post_meta.

Ответ или решение

Чтобы обновить значение meta_value в таблице wp_postmeta, содержащей множество параметров, вам нужно выполнить несколько шагов. В вашем случае meta_value представляет собой сериализованный массив. Приведем подробные инструкции, как это сделать на примере вашего проекта с использованием LearnDash на WordPress.

Шаги для обновления meta_value

  1. Получите текущее значение метаполя: Сначала необходимо извлечь текущее значение метаданных, которое вы хотите обновить. Для этого используйте функцию get_post_meta().

  2. Десериализуйте данные: Так как данные сериализованы, их необходимо десериализовать с помощью функции unserialize(), чтобы вы могли получить доступ к отдельным компонентам массива.

  3. Обновите массив: После того как данные десериализованы, добавьте необходимый ID пользователя в массив доступа к курсу.

  4. Сериализуйте массив обратно: После обновления массива вам нужно будет сериализовать данные обратно с помощью функции serialize().

  5. Сохраните обновлённые данные: Используйте функцию update_post_meta() для сохранения сериализованных данных обратно в базу данных.

Пример кода

Приведем пример кода, который может помочь в решении вашей задачи:

add_action('your_custom_hook', 'update_course_access_list', 10, 2);

function update_course_access_list($user_id, $course_id) {
    // Получаем текущее значение метаполя
    $meta_key = '_sfwd-courses_course_access_list';
    $current_access_list = get_post_meta($course_id, $meta_key, true);

    // Десериализуем текущее значение
    $access_list_array = unserialize($current_access_list);

    // Проверяем, что это массив и добавляем необходимый User ID
    if(is_array($access_list_array)) {
        if(!in_array($user_id, $access_list_array)) {
            $access_list_array[] = $user_id; // Добавляем user_id в массив, если его там нет
        }
    } else {
        // Если по каким-то причинам метаполе не является массивом, инициализируем его
        $access_list_array = array($user_id);
    }

    // Сериализуем массив обратно
    $updated_access_list = serialize($access_list_array);

    // Сохраняем измененные данные метаполя
    update_post_meta($course_id, $meta_key, $updated_access_list);
}

// Пример вызова: передайте ID пользователя и ID курса
update_course_access_list(126, 1646);

Объяснение кода

  • Хук: В коде используется add_action, чтобы добавить функцию к вашему собственному хуку. Вы можете заменить 'your_custom_hook' на конкретный хук, который вам нужен.
  • Получение метаданных: Используем get_post_meta, чтобы извлечь текущее значение доступа к курсу.
  • Десериализация: Функция unserialize помогает преобразовать строку обратно в массив.
  • Проверка и добавление: Используется in_array, чтобы избежать дублирования IDS пользователей.
  • Сериализация и сохранение: Обновленные данные сериализуются и сохраняются с помощью update_post_meta.

Заключение

Следуя вышеизложенным шагам и используя предоставленный код, вы сможете автоматически добавлять User ID в список доступа курса. Это позволит пользователю получать доступ к курсам после их приобретения на портале. Не забудьте протестировать изменения на вашем тестовом окружении, прежде чем внедрять их на живом сайте.

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

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

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