@vladimiraurelius

Как сделать загрузку картинок в запись вордпресс без плагинов?

Добрый день. Добавил метабокс для загрузки изображения в запись вордпресс. Применял код из https://misha.agency/wordpress/uploader-metabox-op... . Хочу разобраться как переделать код из данного примера, что бы можно было загружать сразу несколько изображений
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
@vladimiraurelius Автор вопроса
Спасибо огромное Владимиру Брумеру за подсказку. Сделал мульти-загрузку изображений. Очень топорно, поскольку php и jquery не изучал. Единственный баг когда выбираю изображение и тут же удаляю происходит перезагрузка страницы. Выложу что получилось, может кому-нибуть будет полезно.

вот что у меня получилось в function.php
add_action( 'admin_enqueue_scripts', 'true_include_myuploadscript' ); 
function true_include_myuploadscript( $hook ) {
	
	if ( ! did_action( 'wp_enqueue_media' ) ) {
		wp_enqueue_media();
	}	
 	wp_enqueue_script( 'myuploadscript', get_stylesheet_directory_uri() . '/js/upload.js', array('jquery'), null, false );
}

function true_image_uploader_field( $args ) {

	$value = $args[ 'value' ];	
			
	$default = get_stylesheet_directory_uri() . '/placeholder.png';
 
	if( $value ) {
		$image_id_arr = explode(",", $value);
		foreach ($image_id_arr as $image_id) {
			$img_attribute = wp_get_attachment_image_src($image_id, 'medium', false);
			$img_src = $img_attribute[0];
			echo '
			<div>
				<img src="' . $img_src . '" width="150" />
				<button data-id="' . $image_id . '" type="submit" class="remove_image_button button">×</button>				
			</div>
			';
		}
	} else {
		$src = $default;
	}
	echo '
	<div class="trueimg">
		<div>
			<input type="hidden" name="' . $args[ 'name' ] . '" id="' . $args[ 'name' ] . '" value="' . $value . '" />
			<button type="submit" class="upload_image_button button">Загрузить</button>			
		</div>
	</div>
	';
	
}

//  Добавляем метабокс
add_action( 'add_meta_boxes', 'true_meta_boxes_u' );
 
function true_meta_boxes_u() {
	add_meta_box( 'truediv', 'Фотографии', 'true_print_box_u', 'model_profile', 'normal', 'high' );
}

//  Заполняем метабокс
function true_print_box_u( $post ) {
	if( function_exists( 'true_image_uploader_field' ) ) {
		true_image_uploader_field( array(
			'name' => 'uploader_custom',			
			'value' => get_post_meta( $post->ID, 'uploader_custom', true ),			
		) );		
	}
} 

//  Сохраняем данные произвольного поля 
add_action('save_post', 'true_save_box_data_u');
function true_save_box_data_u( $post_id ) {
	 
	if( isset( $_POST[ 'uploader_custom' ] ) ) {
		update_post_meta( $post_id, 'uploader_custom',  $_POST[ 'uploader_custom' ]  );	
	}
	return $post_id; 
}


В upload.js получился такой код
jQuery(function ($) {
    var button = $('.upload_image_button');

    $('.upload_image_button').click(function (e) {
        e.preventDefault();

        var custom_uploader = wp
            .media({
                title: 'Выбрать изображение',
                button: {
                    text: 'Выбрать изображение',
                },
                multiple: true, // Тут и нужно установить true для мультизагрузки
            })
            .on('select', function () {
                var value = $(button).prev().val();
                var attachment = custom_uploader.state().get('selection').toJSON();
                var img_id_arr = $.map(attachment, (obj) => {
                    return obj.id;
                });

                if (value) {
                    var current_arr = JSON.parse('[' + value + ']');
                    img_id_arr.forEach((element) => {
                        current_arr.unshift(element);
                    });
                } else {
                    current_arr = img_id_arr.reverse();
                }

                var upload_str = current_arr.join(',');
                $(button).prev().val(upload_str);

                $.map(attachment, (obj) => {
                    var new_div = $('<div>');
                    var new_img = $('<img>');
                    var new_btn = $('<button>');

                    $(new_img).attr('src', obj.url);
                    $(new_img).attr('width', 150);

                    $(new_btn).addClass('remove_image_button button');
                    $(new_btn).attr('type', 'submit');
                    $(new_btn).attr('data-id', obj.id);
                    $(new_btn).text('×');

                    $(new_div).append(new_img);
                    $(new_div).append(new_btn);
                    $('.trueimg').parent().prepend(new_div);
                });
            })
            .open();
    });

    $('.remove_image_button').click(function (event) {
        event.preventDefault();
        var value = $(button).prev().val();
        var old_arr = JSON.parse('[' + value + ']');

        if (true) {
            var current_arr = $.map(old_arr, (item) => {
                if (item != $(this).attr('data-id')) {
                    return item;
                }
            });
            var upload_str = current_arr.join(',');
            $(button).prev().val(upload_str);

            $(this).parent().remove();
        }
    });
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы