Как получить элемент флажка внутри метабокса, чтобы он возвращал правильное значение в записи?

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

Я уверен, что этот вопрос задавался много раз, но мне трудно заставить основные принципы работы с флажками корректно работать с метабоксами. В частности, когда я отмечаю значение моего флажка и затем нажимаю “обновить” на моей странице, я не вижу “фактически” отмеченное значение на 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", но и отсутствие значения (когда флажок снят).

Теория

  1. Принцип работы флажков в HTML: Если флажок отмечен, при отправке формы он отправляет своё значение (по умолчанию это "on") на сервер. Если он не отмечен, никакого значения не отправляется.

  2. Обработка данных в WordPress: Чтобы корректно обрабатывать и сохранять данные с форм в WordPress, важно учитывать, что данные могут не отправляться при определённых условиях. Необходимо добавить дополнительные условия для обработки таких случаев.

  3. Проблемы с мета-полями: В Вашем текущем коде, кажется, основной проблемой является обработка и обновление мета-полей так, чтобы корректно отражать состояние флажка.

Пример

Ваш текущий код имеет основную функцию render_meta_box_email_details, отвечающую за вывод метабокса, и функцию save_demo_post_type_meta_data, предназначенную для сохранения данных. Однако, в коде отсутствует логика, позволяющая обрабатывать неотмеченные флажки. Например, флажок, который не отмечен, не будет отправлен в $_POST.

Применение

  1. Модификация 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 . '>';
  1. Обновление функции 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);
}
  1. Безопасность и валидация: Не забывайте о том, чтобы валидировать и санировать данные перед их сохранением. Это можно сделать с помощью sanitize_text_field для текстовых данных и, возможно, других функций в зависимости от типа данных.

Заключение

Используйте описанную выше логику для корректной обработки состояния флажков в вашем метабоксе. Таким образом, даже если флажок не отмечен пользователем, его состояние будет корректно обрабатываться и сохраняться в базе данных. Эту логику можно адаптировать и использовать для других типов полей, нуждающихся в подобной обработке. Надеюсь, это разъяснение поможет Вам избавиться от существующих проблем и улучшить функциональность ваших метабоксов в WordPress.

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

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