CODYSHOP
темы и плагины для WordpressОчень часто, для работы с произвольными полями вебмастера используют блоки произвольных полей в метабоксах. Это очень удобно, так как позволяет разработчикам предопределить, какие поля будут добавляться и в каком количестве. Однако, такой способ использования произвольных полей лишен некоторой гибкости, так как произвольные поля в этом случае заранее определены. Например, что если, пользователю необходимы вариации? В таком случае придется обратиться вновь к исходному коду.
Сегодня я покажу, как можно добавить несколько или даже бесконечное количество произвольных полей в записях на 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);
}
}Краткие пояснения к коду
- С помощью add_meta_boxes создаем метабокс в записи, а save_post используем, чтобы сохранить данные. Здесь же можно указать, для какого типа записи будет создан блок, можно использовать post, page или произвольный тип записи.
- Функция employee_details_init генерирует сведения о сотруднике и отображает, если он уже сохранен.
- Динамическое добавление и удаление пары полей имя-биография происходит с помощью jQuery, метод remove.
Ну и осталось последнее. Для вывода сохраненных данных на сайт как массив, используйте:
$employeeDetails = get_post_meta($post->ID,'employeeDetails',true);
По мере возможностей, данный код будет дорабатываться новыми возможностями.
Код для загрузки файла, а не добавления полей