Вопрос или проблема
Привет, я новичок на WordPress, не мог бы кто-нибудь сказать, как мне загрузить несколько изображений с помощью wp_handle_upload в цикле
for($i=1;$i<count($_FILES['myfile']['name']);$i++){
$uploadedfile = $_FILES['myfile'].$i;
$upload_overrides = array( 'test_form'.$i => false );
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
if ( $movefile && !isset( $movefile['error'] ) ) {
// echo "Файл действителен и был успешно загружен.\n";
$dir_path= $movefile['url'];
} else {
echo $movefile['error'];
}
}//конец цикла
Вот мой пример, как загрузить несколько изображений:
add_action( 'add_meta_boxes', 'my_test_metabox' );
function my_test_metabox() {
add_meta_box( 'my_test_metabox', 'Загрузка файла', 'my_test_metabox_out', 'post' );
}
add_action('post_edit_form_tag', 'update_edit_form' );
function update_edit_form() {
echo ' enctype="multipart/form-data"';
}
function my_test_metabox_out( $post ) {
$files = get_post_meta( $post->ID, 'my_files', true );
if( ! empty( $files ) ) {
echo 'Загруженные файлы:' . "\r\n";
foreach( $files as $file ) {
echo '<img src="' . $file['url'] . '" width="100" height="100" />';
}
echo "\r\n";
}
echo 'Загрузить файлы:' . "\r\n";
echo '<input type="file" name="my_files[]" multiple />';
}
add_action( 'save_post', 'my_files_save' );
function my_files_save( $post_id ) {
if( ! isset( $_FILES ) || empty( $_FILES ) || ! isset( $_FILES['my_files'] ) )
return;
if ( ! function_exists( 'wp_handle_upload' ) ) {
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
$upload_overrides = array( 'test_form' => false );
$files = $_FILES['my_files'];
foreach ($files['name'] as $key => $value) {
if ($files['name'][$key]) {
$uploadedfile = array(
'name' => $files['name'][$key],
'type' => $files['type'][$key],
'tmp_name' => $files['tmp_name'][$key],
'error' => $files['error'][$key],
'size' => $files['size'][$key]
);
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
if ( $movefile && !isset( $movefile['error'] ) ) {
$ufiles = get_post_meta( $post_id, 'my_files', true );
if( empty( $ufiles ) ) $ufiles = array();
$ufiles[] = $movefile;
update_post_meta( $post_id, 'my_files', $ufiles );
}
}
}
}
Привет, вот код, который я использовал в своем плагине, надеюсь, ты поймешь его, и если возникнут проблемы, ты можешь спросить меня:
if(isset($_FILES))
{
for ($i=1; $i < count($_FILES) ; $i++)
{
$uploadedfile = $_FILES['question_'.$i];
?>
<script type="text/javascript">
$(document).ready(function(){
var nam = <?php echo "question".$i; ?>
var namm = $("."+nam).prev().attr('name');
});
</script>
<?php
$upload_overrides = array( 'test_form' => false );
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
if ( $movefile && !isset( $movefile['error'] ) ) {
//echo "Файл действителен, и был успешно загружен.\n";
$filename = $movefile['file'];
} else {
/**
* Ошибка, вызванная _wp_handle_upload()
* @see _wp_handle_upload() в wp-admin/includes/file.php
*/
echo $movefile['error'];
}
// $filename должен быть путем к файлу в директории загрузки.
//$filename="/path/to/uploads/2013/03/filename.jpg";
// Получить путь к директории загрузки.
$wp_upload_dir = wp_upload_dir();
$url = $wp_upload_dir['url'] . "https://wordpress.stackexchange.com/" . basename( $filename );
echo $url."<br>";
}
}
Вот мой HTML код:-
$question =get_post_meta($trivia->ID,'question',true);
$c = 0;
$id = uniqid();
if ( count( $question ) > 0 ) {
if(is_array($question)){
foreach( $question as $questions ) {
if ( isset( $questions['question'] ) ) {
printf('<p>Вопрос: <input type="text" name="question[%1$s][question]" value="%2$s"> -- <span class="remove_question">%3$s</span><span class="add_answer"> Добавить ответ</span></p>', $c,$questions['question'],__('Удалить вопрос'));
for($i = 1; $i<=count($questions['answers']); $i++)
{
if($questions['answers'][$i]['image'])
{
printf('<p>Опция %5$s <input type="text" value="%1$s" name="question[%4$s][answers][%5$s][answer]"> Статус <input type="text" value="%2$s" name="question[%4$s][answers][%5$s][status]"> Изображение <input type="text" name="question[%4$s][answers][%5$s][image]" value="https://wordpress.stackexchange.com/questions/201676/%6$s"><img src="https://wordpress.stackexchange.com/questions/201676/%6$s" height="100" widht="100"> -- <span class="remove_answer">%3$s</span></p>', $questions['answers'][$i]['answer'] ,$questions['answers'][$i]['status'], __('Удалить ответ'), $c, $i,$questions['answers'][$i]['image']);
}
else
{
printf('<p>Опция %5$s <input type="text" value="%1$s" name="question[%4$s][answers][%5$s][answer]"> Статус <input type="text" value="%2$s" name="question[%4$s][answers][%5$s][status]"> -- <span class="remove_answer">%3$s</span></p>', $questions['answers'][$i]['answer'] ,$questions['answers'][$i]['status'], __('Удалить ответ'), $c, $i);
}
}
$c = $c +1;
}
}
}
}
?>
<span id="question_here"></span>
<span class="add_question"><?php _e('Добавить вопрос'); ?></span>
<script>
var $ =jQuery.noConflict();
$(document).ready(function() {
var count = <?php echo $c; ?>;
var countt = 0;
$(".add_question").click(function() {
count = count + 1;
countt = 0;
$('#question_here').append('<p>Вопрос: <input type="text" name="question['+count+'][question]" value=""> -- <span class="remove_question">Удалить вопрос</span><span class="add_answer"> Добавить ответ</span></p>' );
return false;
});
$(".remove_question").live('click', function() {
$(this).parent().remove();
});
$(".add_answer").live('click',function(){
countt = countt + 1;
$('#question_here').append('<p>Ответ <input type="text" name="question['+count+'][answers]['+countt+'][answer]"> Статус <input type="text" name="question['+count+'][answers]['+countt+'][status]"><input id="question_'+count+'_answers_'+countt+'_image" type="text" size="36" name="question['+count+'][answers]['+countt+'][image]" value="" /><input class="upload_image_button" type="button" value="Загрузить изображение" /><span class="remove_answer">Удалить</span></p>');
})
$('.upload_image_button').live('click',function() {
formfield = $('#upload_image').attr('name');
tb_show('', 'media-upload.php?type=image&TB_iframe=true');
return false;
});
window.send_to_editor = function(html) {
imgurl = $('img',html).attr('src');
$('#question_'+count+'_answers_'+countt+'_image').val(imgurl);
tb_remove();
}
$(".remove_answer").live('click', function() {
$(this).parent().remove();
});
});
</script>
</div><?php
функция обработки загрузки изображения для поля ввода типа файл и имени ’email_image’.
if (!empty($_FILES[’email_image’][‘name’])) {
$uploadedfile = $_FILES[’email_image’];
$upload_overrides = array(‘test_form’ => false);
// Используйте функцию WordPress для обработки загрузки файла
$movefile = wp_handle_upload($uploadedfile, $upload_overrides);
if ($movefile && !isset($movefile['error'])) {
// Сохраните URL изображения
update_option('ccd_email_image', $movefile['url']);
echo '<div class="updated"><p>Данные контакта сохранены!</p></div>';
} else {
echo '<div class="error"><p>' . $movefile['error'] . '</p></div>';
}
}
.
Ответ или решение
Чтобы загрузить несколько изображений с помощью функции wp_handle_upload
в WordPress, необходимо правильно конфигурировать как HTML-форму, так и соответствующие функции обработки загруженных файлов. В этом ответе вы найдете подробное руководство о том, как это сделать.
Шаг 1: Создание формы для загрузки файлов
Для начала вам нужно создать HTML-форму, которая будет позволять пользователям загружать несколько изображений. Убедитесь, что в вашей форме установлен атрибут enctype
равный multipart/form-data
. Это необходимо для правильной работы с файлами.
function my_test_metabox_out( $post ) {
// Отображение загруженных файлов
$files = get_post_meta( $post->ID, 'my_files', true );
if( !empty($files) ) {
echo 'Загруженные файлы:<br>';
foreach( $files as $file ) {
echo '<img src="' . esc_url($file['url']) . '" width="100" height="100" />';
}
echo '<br>';
}
// Поле для загрузки файлов
echo 'Загрузите файлы:<br>';
echo '<input type="file" name="my_files[]" multiple />';
}
Шаг 2: Обработка загрузок файлов
Теперь необходимо обработать загрузку файлов, когда форма отправляется. Вы можете сделать это в обработчике события save_post
.
add_action( 'save_post', 'my_files_save' );
function my_files_save( $post_id ) {
if ( ! isset( $_FILES ) || empty( $_FILES ) || ! isset( $_FILES['my_files'] ) ) return;
// Подключаем необходимые функции
if ( ! function_exists( 'wp_handle_upload' ) ) {
require_once( ABSPATH . 'wp-admin/includes/file.php' );
}
$upload_overrides = array( 'test_form' => false );
$files = $_FILES['my_files'];
foreach ( $files['name'] as $key => $value ) {
if ($files['name'][$key]) {
$uploadedfile = array(
'name' => $files['name'][$key],
'type' => $files['type'][$key],
'tmp_name' => $files['tmp_name'][$key],
'error' => $files['error'][$key],
'size' => $files['size'][$key]
);
// Загрузка файла
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
if ( $movefile && ! isset( $movefile['error'] ) ) {
// Получаем существующие файлы и добавляем новый
$ufiles = get_post_meta( $post_id, 'my_files', true );
if ( empty( $ufiles ) ) $ufiles = array();
$ufiles[] = $movefile; // Добавляем перемещение файла в массив
update_post_meta( $post_id, 'my_files', $ufiles ); // Обновляем мета-данные
}
}
}
}
Шаг 3: Работа с загруженными файлами
Теперь, когда файлы загружены и сохранены, вы можете использовать мета-данные поста, чтобы вывести их где угодно на сайте. Убедитесь, что вы правильно выводите изображения:
$files = get_post_meta( $post->ID, 'my_files', true );
if ( ! empty( $files ) ) {
foreach ( $files as $file ) {
echo '<img src="' . esc_url($file['url']) . '" width="100" height="100" />';
}
}
Заключение
Используя вышеуказанные шаги, вы сможете создать функциональность загрузки нескольких изображений в WordPress с использованием функции wp_handle_upload
. Не забудьте протестировать код и убедиться, что все работает корректно. Если возникнут ошибки, проверьте, правильно ли настроены PHP и разрешения на папки загрузки.
Эта инструкция поможет вам эффективно использовать загрузку файлов в вашем проекте WordPress. Вы также можете адаптировать этот код под более специфические требования вашего проекта.