wp_insert_post($post), добавьте массив значений с помощью update_post_meta.

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

Я пытаюсь сохранить массив в нескольких пользовательских полях при создании записи (wp_insert_post).
Массив – это $event_test, а ключ – event_test в meta_input.

При отправке формы пользовательское поле отображается, но оно пустое.

// Форма для поста Quform
add_filter('quform_post_process_1', function (array $result, Quform_Form $form) {    

    // Данные по умолчанию для поста   
    $content = $form->getValue('quform_1_30'); 

    // Пользовательские поля из формы
    $event = $form->getValue('quform_1_3');
    $event_standort = $form->getValue('quform_1_4');
    $event_budget = $form->getValue('quform_1_5');
    $event_date = $form->getValueText('quform_1_9');
    $event_time_from = $form->getValue('quform_1_10');
    $event_time_to = $form->getValue('quform_1_11');
    $event_plz = $form->getValue('quform_1_25');
    $event_stadt = $form->getValue('quform_1_24');
    $event_gaeste = $form->getValue('quform_1_26');
    $event_musiker = $form->getValue('quform_1_31');
    $event_musikstil = $form->getValue('quform_1_21');
    $event_email = $form->getValue('quform_1_28');
    $event_test = array('Value1', 'Value2', 'Value3');


    // Сохранить все пользовательские данные в массиве поста
    $post = array(
        'post_title' => $event . ' в ' . $event_standort . ' (' . $event_plz . ' ' . $event_stadt . ')',
        // 'post_content' => $content,
        'post_excerpt' => $content,
        'post_type' => 'events',
        'post_status' => 'publish',

        'meta_input' => array(                          
                            // Пользовательские поля
                            'event_budget' => $event_budget,
                            'event_date' => $event_date,
                            'event_date_timestamp' => strtotime($event_date),
                            'event_time_from' => $event_time_from,
                            'event_time_to' => $event_time_to,
                            'event_plz' => $event_plz,
                            'event_stadt' => $event_stadt,
                            'event_gaeste' => $event_gaeste,
                            'event_musikstil' => update_post_meta($post_id, "event_musikstil", $event_musikstil),
                            'event_email' => $event_email,
                            'event_test' => update_post_meta($post_id, "event_test", $event_test),

                            // Названия таксономий
                            'event' => $event,
                            'event_standort' => $event_standort,
                            'event_musiker' => $event_musiker
                        )
    );


    // Получить ID поста для вставки в таксономии и вставки всех полей в пост (создать пост)
    $post_id = wp_insert_post($post);



    // Вставить значения таксономий из формы
    wp_set_post_terms( $post_id, $event, 'leweb_ct_event_musiker', true ); // установить таксономию Musiker из значения формы
    wp_set_post_terms( $post_id, $event_standort, 'leweb_ct_standort', true ); // установить таксономию Standort из значения формы
    wp_set_post_terms( $post_id, $event_musiker, 'leweb_ct_musiker', true ); // установить таксономию Musiker из значения формы

    return $result;
}, 10, 2);

Я бы предложил включить отладку ошибок. Это, вероятно, покажет вам некоторые ошибки PHP в приведенном выше коде.

Похоже, что в массиве meta_input вы вызываете такие функции, как update_post_meta(), ещё до того, как пост существует. В этих функциях вы вызываете переменную $post_id, которая также, похоже, не существует.

Кроме того, функция update_post_meta() вернёт булевое значение (вероятно, true), если сможет вставить, или false (пустое), если не сможет обновить метаданные поста.

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

Чтобы исправить вашу проблему с сохранением массива значений в нескольких пользовательских полях при создании поста с помощью функции wp_insert_post(), необходимо внести несколько изменений в ваш код. Основная проблема в вашем коде заключается в том, что вы вызываете функцию update_post_meta() перед тем, как пост будет фактически создан, а поэтому переменная $post_id ещё не существует в момент вызова.

Вот исправленная версия вашего кода:

// Form to Post Quform
add_filter('quform_post_process_1', function (array $result, Quform_Form $form) {

    // Default Post Data   
    $content = $form->getValue('quform_1_30'); 

    // Custom Fields from the form
    $event = $form->getValue('quform_1_3');
    $event_standort = $form->getValue('quform_1_4');
    $event_budget = $form->getValue('quform_1_5');
    $event_date = $form->getValueText('quform_1_9');
    $event_time_from = $form->getValue('quform_1_10');
    $event_time_to = $form->getValue('quform_1_11');
    $event_plz = $form->getValue('quform_1_25');
    $event_stadt = $form->getValue('quform_1_24');
    $event_gaeste = $form->getValue('quform_1_26');
    $event_musiker = $form->getValue('quform_1_31');
    $event_musikstil = $form->getValue('quform_1_21');
    $event_email = $form->getValue('quform_1_28');
    $event_test = array('Value1', 'Value2', 'Value3');

    // Store all custom Data in the Posts Array
    $post = array(
        'post_title' => $event . ' в ' . $event_standort . ' (' . $event_plz . ' ' . $event_stadt . ')',
        'post_excerpt' => $content,
        'post_type' => 'events',
        'post_status' => 'publish',
        'meta_input' => array(
            'event_budget' => $event_budget,
            'event_date' => $event_date,
            'event_date_timestamp' => strtotime($event_date),
            'event_time_from' => $event_time_from,
            'event_time_to' => $event_time_to,
            'event_plz' => $event_plz,
            'event_stadt' => $event_stadt,
            'event_gaeste' => $event_gaeste,
            'event_musikstil' => $event_musikstil,
            'event_email' => $event_email,
            // Сохраняем массив значений в пользовательское поле
            'event_test' => $event_test,
            'event' => $event,
            'event_standort' => $event_standort,
            'event_musiker' => $event_musiker
        )
    );

    // Вставляем пост и получаем его ID
    $post_id = wp_insert_post($post);

    // Проверяем, было ли успешно создано запись
    if ($post_id) {
        // Обновляем мета-данные после создания поста
        update_post_meta($post_id, 'event_musikstil', $event_musikstil);
        update_post_meta($post_id, 'event_test', $event_test); // Массив будет сохранен автоматически

        // Вставляем значения таксономий из формы
        wp_set_post_terms($post_id, $event, 'leweb_ct_event_musiker', true);
        wp_set_post_terms($post_id, $event_standort, 'leweb_ct_standort', true);
        wp_set_post_terms($post_id, $event_musiker, 'leweb_ct_musiker', true);
    }

    return $result;
}, 10, 2);

Объяснение изменений:

  1. Порядок операций: Исправлено сохранение значений в метаполя, теперь функции update_post_meta() вызываются только после того, как создаётся пост и вы получаете его ID. Это решает проблему, так как в момент вызова этих функций $post_id будет уже определено.

  2. Сохранение массива: Теперь массив $event_test будет успешно сохранён в метаполе при вызове update_post_meta(), потому что передаётся непосредственно, а не как результат функции.

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

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

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

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