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

    @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();
            }
        });
    });
    Ответ написан
    Комментировать