Пользовательское мета-поле повторяемого типа

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

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

введите описание изображения здесь

Вот мой код, добавленный в functions.php:

function dikka_cmb_meoxes( array $meta_boxes ) {
    $prefix = 'dikka_';
    $meta_boxes['details_meox'] = array(
        'id'         => 'details_meox',
        'title'      => __( 'Детали проекта', 'dikka' ),
        'pages'      => array( 'portfolio', ), // Тип записи
        'context'    => 'normal',
        'priority'   => 'high',
        'show_names' => true, // Показать имена полей слева
        'fields'     => array(
            array(
                'name'     => __( 'Клиент', 'dikka' ),
                'desc'     => __( 'Добавьте имя клиента', 'dikka' ),
                'id'       => $prefix . 'add_client',
                'type'     => 'text',
            ),
            array(
                'name'     => __( 'Навыки', 'dikka' ),
                'desc'     => __( 'Добавьте навыки', 'dikka' ),
                'id'       => $prefix . 'skills',
                'type'     => 'text',
            ),
            array(
                'name'     => __( 'Дата выпуска', 'dikka' ),
                'desc'     => __( 'Добавьте дату выхода проекта', 'dikka' ),
                'id'       => $prefix . 'add_releasedate',
                'type'     => 'text_date',
            ),
        )
    );
    return $meta_boxes;
}

Похоже, вы используете CMB (Пользовательские мета-боксы и поля для WordPress) для создания ваших мета-боксов.
CMB уже предоставляет опцию группирования и повторения мета-блока, которую вы можете использовать. Вы можете проверить эту ссылку

Что касается вашего кода, он должен выглядеть так:

function dikka_cmb_meoxes( array $meta_boxes ) {
    $prefix = 'dikka_';
        $meta_boxes['details_meox'] = array(
        'id'          => $prefix . 'details_meox',
        'type'        => 'group',
        'pages'      => array( 'portfolio', ), // Тип записи
        'description' => __( 'Детали проекта', 'dikka' ),
        'options'     => array(
            'group_title'   => __( 'Запись {#}', 'dikka' ), // с версии 1.1.4, {#} заменяется на номер строки
            'add_button'    => __( 'Добавить еще одну запись', 'dikka' ),
            'remove_button' => __( 'Удалить запись', 'dikka' ),
            'sortable'      => true, // бета
        ),
        // Массив полей работает так же, за исключением того, что id должны быть уникальными только для этой группы. Приставка не нужна.
        'fields'     => array(
            array(
                'name'     => __( 'Клиент', 'dikka' ),
                'desc'     => __( 'Добавьте имя клиента', 'dikka' ),
                'id'       => $prefix . 'add_client',
                'type'     => 'text',
            ),
            array(
                'name'     => __( 'Навыки', 'dikka' ),
                'desc'     => __( 'Добавьте навыки', 'dikka' ),
                'id'       => $prefix . 'skills',
                'type'     => 'text',
            ),
            array(
                'name'     => __( 'Дата выпуска', 'dikka' ),
                'desc'     => __( 'Добавьте дату выхода проекта', 'dikka' ),
                'id'       => $prefix . 'add_releasedate',
                'type'     => 'text_date',
            ),
        ),
    ),

    return $meta_boxes;
}

Надеюсь, это поможет!

**Пользовательский мета-бокс с повторяющимися полями **

Функция мета-бокса с скриптом

function question_creation_meta_box() {
    global $post;

    wp_nonce_field( basename( __FILE__ ), 'bsw_our_nonce' );

    ?>
    <div class="row">
    <?php
    global $post;
    // $post_id=$post->ID;
    $post_id=$_GET['post'];
    $i=1;
    $countQuestions=get_post_meta($post_id,'countQuestions',true);
    // echo '<pre>';print_r($countQuestions);echo '</pre>';
   $count= count($countQuestions);
    if($post_id){   
      while($i<=$count)
      {
          $question=  get_post_meta($post_id,'questions'.$i,true);
          $correctAnswer=get_post_meta($post_id,'correctAnswer'.$i.'1',true);
          $countAnswers=get_post_meta($post_id,'countAnswers'.$i,true);
           // if($count==1):
          ?>
          <div class="questions_blocks col-sm-12 col-md-12" id="questions_blocks-<?php echo $i; ?>">
              <div class="questions col-sm-12 col-md-12" id="questions-<?php echo $i;?>">
                  <lable>Введите вопросы</lable><input type="text" value="<?php echo $question[0]; ?>" name="questions1[]">
              </div>
              <?php
                $j=1;
                while($j<=$countAnswers)
                {
                   $answer= get_post_meta($post_id,'answer'.$i.''.$j,true);
                   $answerText= get_post_meta($post_id,'answerText'.$i.''.$j,true);
                   ?>
                    <div class="answer col-md-12 col-sm-12 border-top-0" id="answer-<?php echo $j;?>">
                        <h1 class="">Ответ <?php echo $j;?></h1>
                        <div class="col-md-12 col-sm-12">
                            <div class="col-md-4 col-sm-4">
                            <input type="radio" name="correctAnswer<?php echo $i; ?>1[]" value="1" class="correct_incorrect" <?php if($correctAnswer[0] == $j ) echo 'checked' ?>>Правильный<br>
                            <input type="radio" name="correctAnswer<?php echo $i; ?>1[]" value="0" class="correct_incorrect">Неправильный
                            </div>
                            <div class="col-sm-8 col-md-8">
                            <lable>Введите ответ</lable><input type="text" value="<?php echo $answer[0];?>" name="answer1<?php echo $j; ?>[]">
                            <lable>Введите текст отображаемого ответа</lable> <input type="text" value="<?php echo  $answerText[0]?>" name="answerText1<?php echo $j; ?>[]">
                            </div>
                        </div>
                        <input type="hidden" value="1" name="countAnswers1[]">
                        <?php if($j == $countAnswers): ?>
                        <label class="right-label">Добавить еще один ответ</label><a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_answer(this)" class="add_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>
                        <a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="remove_answer(this)" class="remove_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/remove.png'?>"></a>
                      <?php endif;?>
                    </div>
                   <?php
                   $j++;
                }
              ?>
              <input type="hidden" value="1" name="countQuestions[]">
              <?php if($count == $i ): ?>
              <label class="right-label">Добавить еще один вопрос</label>
              <a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_question(this)" class="add_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>
              <a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="remove_question(this)" class="remove_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/remove.png'?>"></a>
            <?php endif;?>
          </div>
        <?
            $i++;
      }
    }
    else{
    ?>
    <!-- мой пользовательский ввод значения -->
      <div class="questions_blocks col-sm-12 col-md-12" id="questions_blocks-1">
          <div class="questions col-sm-12 col-md-12" id="questions-1">
              <lable>Введите вопросы</lable><input type="text" value="" name="questions1[]">
          </div>
          <div class="answer col-md-12 col-sm-12 border-top-0" id="answer-1">
              <h1 class="">Ответ 1</h1>
              <div class="col-md-12 col-sm-12">
                  <div class="col-md-4 col-sm-4">
                  <input type="radio" name="correctAnswer11[]" value="1" class="correct_incorrect">Правильный<br>
                  <input type="radio" name="correctAnswer11[]" value="0" class="correct_incorrect">Неправильный
                  </div>
                  <div class="col-sm-8 col-md-8">
                  <lable>Введите ответ</lable><input type="text" value="" name="answer11[]">
                  <lable>Введите текст отображаемого ответа</lable> <input type="text" name="answerText11[]">
                  </div>
              </div>
              <input type="hidden" value="1" name="countAnswers1[]">
              <label class="right-label">Добавить еще один ответ</label><a href=javascript:void(0)" onclick="add_answer(this)" class="add_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a></a>
          </div>
          <input type="hidden" value="1" name="countQuestions[]">
          <label class="right-label">Добавить еще один вопрос</label><a href=javascript:void(0)" onclick="add_question(this)" class="add_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a></a>
      </div>
      <?php
      }
      ?>
    </div>
    <script type="text/javascript">
      function add_answer(obj)
      {
        var parentID=jQuery(obj).parents('.answer').attr('id');
        var questionParentId=jQuery(obj).parent('.answer').parent('.questions_blocks').attr('id');
        var answerLenght=jQuery('#'+questionParentId +' .answer').length;
        var questionParent=jQuery(obj).parent('.answer').parent('.questions_blocks').length;
        var countQuestion=questionParentId.split('-');
        // alert(countQuestion);
        var newLenght=parseInt(answerLenght)+1;
        var html="<div class="answer col-md-12 col-sm-12 border-top-0" id="answer-"+newLenght+'"><h1 class="">Ответ '+newLenght+'</h1>';
          html+='<div class="col-md-12 col-sm-12 bsw_answer_block">';
          html+='<div class="col-md-4 col-sm-4 correctblock">';
          html+='<input type="radio" name="correctAnswer'+countQuestion[1]+'1[]" value="'+newLenght+'" class="correct_incorrect">Правильный<br>';
          html+='<input type="radio" name="correctAnswer'+countQuestion[1]+'1[]" value="0" class="correct_incorrect">Неправильный</div>';
          html+='<div class="col-sm-8 col-md-8">';
          html+='<lable>Введите ответ</lable><input type="text" value="" name="answer'+countQuestion[1]+''+newLenght+'[]">';
          html+='<lable>Введите текст отображаемого ответа</lable> <input type="text" name="answerText'+countQuestion[1]+''+newLenght+'[]"">';
          html+='</div>';
          html+='</div>';

          html+=' <input type="hidden" value="1" name="countAnswers'+countQuestion[1]+'[]"><label class="right-label">Добавить еще один ответ</label><a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_answer(this)" class="add_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>';
         html+=' <a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="remove_answer(this)" class="remove_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/remove.png'?>"></a>';
         html+='</div>';
         jQuery('#'+questionParentId+' #'+parentID+' .right-label').remove();
         jQuery('#'+questionParentId+' #'+parentID+' .add_answer').remove();
         jQuery('#'+questionParentId+' #'+parentID+' .remove_answer').remove();
         jQuery('#'+questionParentId+' #'+parentID).after(html);
      }
      function add_question(obj)
      {
        var parentID=jQuery(obj).parents('.questions_blocks').attr('id');
        var questions_blocksLenght=jQuery('.row .questions_blocks').length;
        var newLenght=parseInt(questions_blocksLenght)+1;
        var html="";
          html+='<div class="questions_blocks col-sm-12 col-md-12" id="questions_blocks-'+newLenght+'">';
          html+='<div class="questions col-sm-12 col-md-12" id="questions-'+newLenght+'">';
          html+='<lable>Введите вопросы</lable><input type="text" value="" name="questions'+newLenght+'[]">';
          html+='</div>';
          html+='<div class="answer col-md-12 col-sm-12 border-top-0" id="answer-1"><h1 class="">Ответ 1</h1>';
          html+='<div class="col-md-12 col-sm-12 bsw_answer_block">';
          html+='<div class="col-md-4 col-sm-4 correctblock">';
          html+='<input type="radio" name="correctAnswer'+newLenght+'1[]" value="1" class="correct_incorrect">Правильный<br>';
          html+='<input type="radio" name="correctAnswer'+newLenght+'1[]" value="0" class="correct_incorrect">Неправильный</div>';
          html+='<div class="col-sm-8 col-md-8">';
          html+='<lable>Введите ответ</lable><input type="text" value="" name="answer'+newLenght+'1[]">';
          html+='<lable>Введите текст отображаемого ответа</lable> <input type="text" name="answerText'+newLenght+'1[]">';
          html+='</div>';
          html+='</div>';

          html+=' <input type="hidden" value="1" name="countAnswers'+newLenght+'[]"><label class="right-label">Добавить еще один ответ</label><a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_answer(this)" class="add_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>';
         html+='</div>';
         html+='<input type="hidden" value="1" name="countQuestions[]"><label class="right-label">Добавить еще один вопрос</label><a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_question(this)" class="add_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>';
         html+='<a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="remove_question(this)" class="remove_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/remove.png'?>"></a>';
         html+='</div>';
         jQuery('#'+parentID).after(html);
         jQuery('#'+parentID+ ' .remove_question').remove();
         jQuery('#'+parentID+ ' .add_question').remove();
         jQuery('#'+parentID+ ' .right-label').remove();
      }
      function remove_question(obj)
      {
        var parentID=jQuery(obj).parents('.questions_blocks').attr('id');
        var countQustBlock=parentID.split('-');
        var newParent=countQustBlock[1]-1;
        jQuery('#'+parentID).remove();
        var html="";
        if(newParent>1)
        {
          html+='<a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="remove_question(this)" class="remove_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/remove.png'?>"></a>';
        }else;
          html+='<label class="right-label">Добавить еще один вопрос</label><a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_question(this)" class="add_question"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>';

          jQuery('#questions_blocks-'+newParent).append(html);

      }
      function remove_answer(obj)
      {
          var parentID=jQuery(obj).parents('.answer').attr('id');
          var questionParentId=jQuery(obj).parent('.answer').parent('.questions_blocks').attr('id');
          var answerLenght=jQuery('#'+questionParentId +' .answer').length;
          var questionParent=jQuery(obj).parent('.answer').parent('.questions_blocks').length;
          var countAnsBlock=parentID.split('-');
          var newParent=countAnsBlock[1]-1;
          var html="";
          if(newParent > 1)
          {
             html+=' <a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="remove_answer(this)" class="remove_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/remove.png'?>"></a>';
          }else;
           html+='<label class="right-label">Добавить еще один ответ</label><a href="https://wordpress.stackexchange.com/questions/181907/javascript:void(0)" onclick="add_answer(this)" class="add_answer"><img src="<?php echo plugin_dir_url( __FILE__ ) .'img/plus.png'?>"></a>';

          jQuery('#'+questionParentId+' #'+parentID).remove();
          jQuery('#'+questionParentId+' #answer-'+newParent).append(html);
        }
    </script>
    <?php
}

Сохранить мета-бокс

function bsw_save_meta_fields( $post_id ) {

  if (!isset($_POST['bsw_our_nonce']) || !wp_verify_nonce($_POST['bsw_our_nonce'], basename(__FILE__)))
      return 'nonce не проверен';

  if ( wp_is_post_autosave( $post_id ) )
      return 'автосохранение';

  if ( wp_is_post_revision( $post_id ) )
      return 'ревизия';

  if ( 'bws_quiz' == $_POST['post_type'] ) {
      if ( ! current_user_can( 'edit_page', $post_id ) )
          return 'не удалось отредактировать страницу';
      } elseif ( ! current_user_can( 'edit_post', $post_id ) ) {
          return 'не удалось отредактировать запись';
  }
  $bws_question_count=$_POST['countQuestions'];
  update_post_meta($post_id,'countQuestions',$bws_question_count);
  $count= count($bws_question_count);
  $i=1;
  while($i<=$count)
  {
    $Questvalue=$_POST['questions'.$i];
   // print_r($Questvalue);
    $bws_correct_answer=$_POST['correctAnswer'.$i.'1'];
    update_post_meta($post_id,'correctAnswer'.$i.'1',$bws_correct_answer);
    $bws_ans_value = $_POST['countAnswers'.$i];
    $bws_ans_count= count($bws_ans_value);
    $j=1;

  //  echo 'Ответ ';
    while ( $j<= $bws_ans_count) {
       $answervalue=$_POST['answer'.$i.''.$j];
      // print_r($answervalue);
        $answertextvalue=$_POST['answerText'.$i.''.$j];
         update_post_meta($post_id,'answer'.$i.''.$j,$answervalue);
         update_post_meta($post_id,'answerText'.$i.''.$j,$answertextvalue);
     //  print_r($answertextvalue);
       $j++;
    }
    update_post_meta($post_id,'questions'.$i,$Questvalue);
    update_post_meta($post_id,'correctAnswer'.$i.'1',$bws_correct_answer);
    update_post_meta($post_id,'countAnswers'.$i, $bws_ans_count);
    $i++;
  }

  //просто нужно сохранить данные сейчас
}
add_action( 'save_post', 'bsw_save_meta_fields' );
add_action( 'new_to_publish', 'bsw_save_meta_fields' );

.

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

Повторяющиеся поля в настраиваемых мета-боксах WordPress

Если вы хотите добавить повторяющиеся поля в ваш настраиваемый мета-бокс в WordPress, то использование библиотеки Custom Metaboxes and Fields for WordPress (CMB) обеспечит вам необходимую функциональность. Это позволит вам динамически добавлять несколько записей для одних и тех же полей, как, например, для "Клиента", "Навыков" и "Даты выпуска", которые вы указали в вашем коде.

Настройка мета-бокса с повторяющимися полями

Вот как вы можете адаптировать ваш существующий код для включения повторяющихся полей, используя функционал группы в CMB:

1. Определение мета-бокса

В файле functions.php добавьте следующую функцию для создания вашего мета-бокса:

function dikka_cmb_metaboxes( array $meta_boxes ) {
    $prefix = 'dikka_';

    $meta_boxes['details_meox'] = array(
        'id' => 'details_meox',
        'title' => __( 'Проектные детали', 'dikka' ),
        'pages' => array( 'portfolio' ), // Тип поста
        'context' => 'normal',
        'priority' => 'high',
        'show_names' => true,
        'fields' => array(
            array(
                'id' => $prefix . 'client_group',
                'type' => 'group',
                'description' => __( 'Добавьте информацию о клиенте', 'dikka' ),
                'options' => array(
                    'group_title'   => __( 'Клиент {#}', 'dikka' ),
                    'add_button'    => __( 'Добавить клиента', 'dikka' ),
                    'remove_button' => __( 'Удалить клиента', 'dikka' ),
                    'sortable'      => true,
                ),
                'fields' => array(
                    array(
                        'name' => __( 'Имя клиента', 'dikka' ),
                        'id' => 'client_name',
                        'type' => 'text',
                    ),
                    array(
                        'name' => __( 'Навыки', 'dikka' ),
                        'id' => 'client_skills',
                        'type' => 'text',
                    ),
                    array(
                        'name' => __( 'Дата выпуска', 'dikka' ),
                        'id' => 'release_date',
                        'type' => 'text_date',
                    ),
                ),
            ),
        ),
    );

    return $meta_boxes;
}

add_filter( 'cmb2_init', 'dikka_cmb_metaboxes' );

2. Подключение скриптов

Убедитесь, что у вас есть подключение необходимых скриптов и стилей для обработки мета-боксов. CMB2 сам по себе уже включает необходимый JavaScript для работы с группами полей.

3. Сохранение данных мета-бокса

Для сохранения данных, добавьте следующий код для обработки данных формы при сохранении поста:

function dikka_save_metabox_data( $post_id ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if ( ! isset( $_POST['dikka_nonce'] ) || ! wp_verify_nonce( $_POST['dikka_nonce'], basename( __FILE__ ) ) ) return;

    // Сохраняем данные группы мета-бокса
    $client_group = isset( $_POST['dikka_client_group'] ) ? $_POST['dikka_client_group'] : array();
    update_post_meta( $post_id, 'dikka_client_group', $client_group );
}
add_action( 'save_post', 'dikka_save_metabox_data' );

Заключение

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

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

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

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