Вопрос или проблема
Я пытаюсь сохранить массив в нескольких пользовательских полях при создании записи (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);
Объяснение изменений:
-
Порядок операций: Исправлено сохранение значений в метаполя, теперь функции
update_post_meta()
вызываются только после того, как создаётся пост и вы получаете его ID. Это решает проблему, так как в момент вызова этих функций$post_id
будет уже определено. -
Сохранение массива: Теперь массив
$event_test
будет успешно сохранён в метаполе при вызовеupdate_post_meta()
, потому что передаётся непосредственно, а не как результат функции. -
Проверка успешного создания поста: Добавлена проверка на успешное создание поста перед попытками обновить мета-данные и ассоциации таксономии, что помогает избежать потенциальных ошибок.
С применением вышеописанных исправлений мета-данные должны сохраняться корректно, и массив значений будет доступен в пользовательских полях.