Вопрос или проблема
Я уверен, что этот вопрос задавался много раз, но мне трудно заставить основные принципы работы с флажками корректно работать с метабоксами. В частности, когда я отмечаю значение моего флажка и затем нажимаю “обновить” на моей странице, я не вижу “фактически” отмеченное значение на POST. Не имеет значения, помечаю я флажок физически или нет… я не получаю корректного возвращаемого значения поста. Он всегда показывает “on”.
Моя текущая настройка
- Я добавляю метабокс
add_meta_box(
'_demo_meta_box_email',
'Demo - Email Manager',
array($this, 'render_meta_box_email_details'),
'demowebforms',
'normal',
'high',
array('foo' => 'bar')
);
- Затем я создаю свою функцию рендеринга
public function render_meta_box_email_details($post) {
//определение хранилища для ключей на пост
$getInputSelections = [];
if (isset($post->ID)) {
$getInputSelections = get_post_meta($post->ID);
//отладка
//нет изменений в посте, независимо от того, отмечен мой флажок ниже или нет
$mcheckbox = get_post_meta($post->ID, '_email_Showvalidationcodeviaemail', false);
echo '<pre>' . var_export($mcheckbox, true) . '</pre>';
//он всегда показывает это на экране, независимо от того...
//array (
//0 => 'on',
//)
}
$emailItems = [
"Show validation code via email" => "Yes",
//....другие элементы...
];
foreach ($emailItems as $key => $val) {
$keyname = str_replace(' ', '', $key);
if ($key == "Show validation code via email") {
echo '<input type="checkbox" id="email_' . $keyname . '" name="email_' . $keyname . '" aria-label="' . esc_attr($key) . '" >';
}
}
}
- Затем я пытаюсь сохранить пост
public function save_demo_post_type_meta_data($post_id)
{
//WORDPRESS AUTOSAVING ENABLED? ВЫХОД ИЗ ПРОЦЕССА
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
{
return;
}
//ПРОВЕРКА ПО МНОЖЕСТВУ ПАРАМЕТРОВ (КЛЮЧЕЙ) ДЛЯ НАШИХ ПОСТОВ И СОХРАНЕНИЕ СОДЕРЖИМОГО
foreach ($_POST as $key => $val)
{
//МЫ ЗАБОТИМСЯ ТОЛЬКО О МЕТАБОКСЕ EMAIL НА ДАННЫЙ МОМЕНТ...
if ((strpos($key, 'email') === 0))
{
// ОБРАБОТКА ВСЕГО СОДЕРЖИМОГО И СПИСОК ЭЛЕМЕНТОВ ПОСТА
if (isset($_POST[$key]))
{
//СЕРИАЛИЗАЦИЯ
$mSerialize = maybe_serialize($_POST[$key]);
//САНИТАЙЗ
$mSanitize = sanitize_text_field($mSerialize);
//СОХРАНЕНИЕ
update_post_meta($post_id, '_' . $key, $mSanitize);
}
return $post_id;
}
}
}
Что я упускаю или делаю неправильно, чтобы мой флажок показывал отмеченное или неотмеченное значение на посте?
Большое спасибо
Ответ или решение
Для решения проблемы с получением корректного значения флажка в метабоксе при сохранении поста, важно понимать основное поведение HTML-флажков и способы обработки данных в метабоксе в контексте WordPress. Флажки в HTML имеют особенность: если они не отмечены, браузер не отправляет их значение при отправке формы. Это может создавать трудности при обработке данных на сервере, где важно знать не только значение "on", но и отсутствие значения (когда флажок снят).
Теория
-
Принцип работы флажков в HTML: Если флажок отмечен, при отправке формы он отправляет своё значение (по умолчанию это "on") на сервер. Если он не отмечен, никакого значения не отправляется.
-
Обработка данных в WordPress: Чтобы корректно обрабатывать и сохранять данные с форм в WordPress, важно учитывать, что данные могут не отправляться при определённых условиях. Необходимо добавить дополнительные условия для обработки таких случаев.
-
Проблемы с мета-полями: В Вашем текущем коде, кажется, основной проблемой является обработка и обновление мета-полей так, чтобы корректно отражать состояние флажка.
Пример
Ваш текущий код имеет основную функцию render_meta_box_email_details
, отвечающую за вывод метабокса, и функцию save_demo_post_type_meta_data
, предназначенную для сохранения данных. Однако, в коде отсутствует логика, позволяющая обрабатывать неотмеченные флажки. Например, флажок, который не отмечен, не будет отправлен в $_POST
.
Применение
- Модификация
render_meta_box_email_details
: Убедитесь, что ваши флажки отображают правильное текущее состояние, когда форма отображается:
$mcheckbox = get_post_meta($post->ID, '_email_Showvalidationcodeviaemail', true);
$checked = $mcheckbox ? 'checked' : '';
echo '<input type="checkbox" id="email_' . $keyname . '" name="email_' . $keyname . '" aria-label="' . esc_attr($key) . '" ' . $checked . '>';
- Обновление функции
save_demo_post_type_meta_data
: Чтобы обрабатывать флажки, которые не были отмечены, установите значение по умолчанию. Например:
if ((strpos($key, 'email') === 0)) {
// Установите значение по умолчанию для флажков, которые могли бы отсутствовать в $_POST
$isChecked = isset($_POST[$key]) ? 'on' : 'off';
// Сохраните корректное значение
update_post_meta($post_id, '_' . $key, $isChecked);
}
- Безопасность и валидация: Не забывайте о том, чтобы валидировать и санировать данные перед их сохранением. Это можно сделать с помощью
sanitize_text_field
для текстовых данных и, возможно, других функций в зависимости от типа данных.
Заключение
Используйте описанную выше логику для корректной обработки состояния флажков в вашем метабоксе. Таким образом, даже если флажок не отмечен пользователем, его состояние будет корректно обрабатываться и сохраняться в базе данных. Эту логику можно адаптировать и использовать для других типов полей, нуждающихся в подобной обработке. Надеюсь, это разъяснение поможет Вам избавиться от существующих проблем и улучшить функциональность ваших метабоксов в WordPress.