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

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

Рассмотрим ситуацию, когда вам нужно добавить несколько имен и краткую биографию. Сгенерируем пары имени и биографии. На скриншоте ниже показано, что мы хотим сделать.

Для реализации этой задумки используйте следующий сниппет. Если вы не знаете, куда его добавить, смело вставляйте его в function.php своей темы.

    add_action('post_edit_form_tag', 'update_edit_form');

    function update_edit_form() {
      echo ' enctype="multipart/form-data"';
      } // end update_edit_form

    add_action('add_meta_boxes', 'the_upload_metabox'); 
   
    function the_upload_metabox() {  
        // Define the custom attachment for posts  
        add_meta_box(  
            'wp_custom_attachment',  
            'Upload File',  
            'wp_custom_file_attachment'    
        );   
    } 

    // The custom file attachment function
    function wp_custom_file_attachment() {  
      
      global $post;
      $theFILE=  get_post_meta($post->ID,'wp_custom_attachment',true);
      wp_nonce_field(plugin_basename(__FILE__), 'wp_custom_attachment_nonce');  
      $html = '
<p class="description">'; $html .= 'Upload the File.'; if(count($theFILE)>0 && is_array($theFILE)){ $html.="Uploaded File:".$theFILE[0]['url']; }
$html .= '</p>';
$html .= '<input id="wp_custom_attachment" title="select file" multiple="multiple" name="wp_custom_attachment[]" size="25" type="file" value="" />';  

    echo $html; 
      
    } 
     add_action('save_post', 'save_custom_meta_data');
    // Saving the uploaded file details
    function save_custom_meta_data($id) {  
        /* --- security verification --- */  
        if(isset($_POST['wp_custom_attachment_nonce']))
        if(!wp_verify_nonce($_POST['wp_custom_attachment_nonce'], plugin_basename(__FILE__))) {  
          return $id;  
        } // end if  
            
        if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {  
          return $id;  
        } // end if  
         if(isset($_POST['post_type']))   
        if('page' == $_POST['post_type']) {  
          if(!current_user_can('edit_page', $id)) {  
            return $id;  
          } // end if  
        } else {  
            if(!current_user_can('edit_page', $id)) {  
                return $id;  
            } // end if  
        } // end if  
        /* - end security verification - */  
     
        // Make sure the file array isn't empty  
        if(!empty($_FILES['wp_custom_attachment']['name'])) {                         
            // Get the file type of the upload  
             $flag=0;
            for($i=0;$i<count($_FILES['wp_custom_attachment']['name']);$i++){
                if(!empty($_FILES['wp_custom_attachment']['name'][$i])){
                    $flag=1;
                // Use the WordPress API to upload the multiple files
                $upload[] = wp_upload_bits($_FILES['wp_custom_attachment']['name'][$i], null, file_get_contents($_FILES['wp_custom_attachment']['tmp_name'][$i]));  
                }
                }
                if($flag==1)
                update_post_meta($id, 'wp_custom_attachment', $upload);       
             
        } 
          
    }

Краткие пояснения к коду

  1. С помощью add_meta_boxes создаем метабокс в записи, а save_post используем, чтобы сохранить данные. Здесь же можно указать, для какого типа записи будет создан блок, можно использовать post, page или произвольный тип записи.
  2. Функция employee_details_init генерирует сведения о сотруднике и отображает, если он уже сохранен.
  3. Динамическое добавление и удаление пары полей имя-биография происходит с помощью jQuery, метод remove.

Ну и осталось последнее. Для вывода сохраненных данных на сайт как массив, используйте:

$employeeDetails = get_post_meta($post->ID,'employeeDetails',true);

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

1 комментарий к записи

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