CODYSHOP
темы и плагины для WordpressСегодня хотел поделиться простым решением для вывода нескольких миниатюр к записи, странице или произвольным типам записей. Иногда это необходимо для создания галерей интерне-магазина, каталога товаров или других задач. Но, в начале, хотел привести ряд решений от других разработчиков:
Вариант 1: Использование стороннего плагина Multiple Post Thumbnails. Тоже неплохой вариант. Удобно, просто, быстро. Минус данного варианта – вы сможете добавить только второе изображение для поста. Конечно, можно слегка отредактировать код и появится возможность добавлять и 3, и 4 дополнительные миниатюры, однако невозможно добавить сразу несколько.
Вариант 2: Ссылка уже не актуальна, поэтому удаляю.
Вариант 3: Идея приведенного ниже решения, собственно, не моя, а взята из одного всеми забытого плагина. Были с ним небольшие проблемы (если оставалась одна миниатюра, не хотел её удалять). В общем, причесал, подправил, и выкладываю. Описывать особо ничего не буду, вся необходимая информация в комментариях к коду. Его нужно добавить в файл functions.php
P.S.: Для добавления нескольких картинок нужно удерживая клавишу CTRL выделять необходимые миниатюры.
P.S.: Данный вариант выводит галерею через шорткод. Думаю, самостоятельно оформить его красиво – уже дело техники.
Шаг 1: Создаем необходимые подключения в админке WordPress
Для начала, создайте javascript файл custom_script.js и разместите его в папке js вашей темы Содержимое файла:
jQuery(document).ready(function(jQuery){ var _custom_media = true, _orig_send_attachment = wp.media.editor.send.attachment; jQuery('#thumbnail_image_upload').click(function(e) { var send_attachment_bkp = wp.media.editor.send.attachment; var button = jQuery(this); var id = button.attr('id').replace('_button', ''); _custom_media = true; wp.media.editor.send.attachment = function(props, attachment){ if ( _custom_media ) { console.log(attachment); //jQuery('#'+id).val(attachment.url); if(jQuery('#image_upload_val').val() == '') jQuery('#image_upload_val').val(attachment.id); else { oldVal = jQuery('#image_upload_val').val(); jQuery('#image_upload_val').val(oldVal+','+attachment.id); } var src_str = attachment.url; jQuery('#image_upload_val').before('<img width=66 height=66 src='+src_str+' data-id='+attachment.id+' class=attachment-66x66 />'); //jQuery('#post').submit(); } else { return _orig_send_attachment.apply( this, [props, attachment] ); }; } wp.media.editor.open(button); return false; }); jQuery('.add_media').on('click', function(){ _custom_media = false; }); jQuery('#thumbnail_sidebar img').live('click',function(){ valArr = jQuery('#image_upload_val').val().split(','); console.log(valArr); alert(jQuery(this).attr('data-id')); var index = valArr.indexOf(jQuery(this).attr('data-id')); if (index > -1) { valArr.splice(index, 1); jQuery(this).remove(); } console.log(valArr); jQuery('#image_upload_val').val(valArr.toString()); }); });
После создания скрипта, подключим его в административной панели.
add_action( 'wp_enqueue_scripts', 'my_scripts_method' ); function my_scripts_method(){ admin_enqueue_script( 'newscript', get_template_directory_uri() . '/js/custom_script.js'); }
Шаг 2: Создаем метабокс
/* Создаем метабокс с возможностью добавления картинок */ add_action( 'add_meta_boxes', 'thumbnail_add_custom_box' ); function thumbnail_add_custom_box() { $post_name = 'page'; // указываем тип записи, можно post, page или custom_post_type add_meta_box('thumbnail_sidebar', 'Other product images', 'thumbnail_render_images', $post_name, 'side', 'default'); }
Выводим содержимое блока с миниатюрками в созданном поле
/* Выводим содержимое блока с миниатюрками в созданном поле */ function thumbnail_render_images() { global $wpdb; global $post; // Используем nonce для проверки wp_nonce_field( plugin_basename( __FILE__ ), 'thumbnail_noncename' ); // Поле для ввода данных // Используем get_post_meta, чтобы получить существующее значение из базы данных и использовать значение для формы $value = get_post_meta($post->ID, '_multi_img_array', true); $temp = explode(",", $value); if ($temp) { foreach ( $temp as $t_val ) { $image_attributes = wp_get_attachment_image_src( $t_val , array(66,66) ); echo '<img src="'.$image_attributes[0].'" width="'.$image_attributes[1].'" height="'.$image_attributes[2].'" data-id="'.$t_val.'">'; } } else { //echo wp_get_attachment_image_src( $value , array(66,66) ); $image_attributes = wp_get_attachment_image_src( $value , array(66,66) ); echo '<img src="'.$image_attributes[0].'" width="'.$image_attributes[1].'" height="'.$image_attributes[2].'" data-id="'.$value.'">'; } //echo '<input type="text" id="thumbnail_image_upload" name="thumbnail_image_upload" value="'.esc_attr($value).'" size="25" />'; echo "<style type='text/css'> #thumbnail_sidebar {padding: 10px;} #thumbnail_sidebar .inside{padding: 5px; border: 2px dashed #e5e5e5;} #thumbnail_sidebar .inside img{margin:5px; border: 2px solid #e5e5e5;} #thumbnail_sidebar .inside img:hover{cursor: pointer; border: 2px solid #ff0000;} #thumbnail_image_upload{width: 100%;} </style>"; echo "<input type='hidden' name='image_upload_val' id='image_upload_val' value='".$value."' />"; echo "<button class='button button-primary' id='thumbnail_image_upload'>Upload Images</button>"; // скрипт можно вывести в отдельный js файл и подключить в админке, но для удобства привожу его сразу здесь echo "<script type='text/javascript'> jQuery(document).ready(function(jQuery){ var _custom_media = true, _orig_send_attachment = wp.media.editor.send.attachment; jQuery('#thumbnail_image_upload').click(function(e) { var send_attachment_bkp = wp.media.editor.send.attachment; var button = jQuery(this); var id = button.attr('id').replace('_button', ''); _custom_media = true; wp.media.editor.send.attachment = function(props, attachment){ if ( _custom_media ) { console.log(attachment); //jQuery('#'+id).val(attachment.url); if(jQuery('#image_upload_val').val() == '') jQuery('#image_upload_val').val(attachment.id); else { oldVal = jQuery('#image_upload_val').val(); jQuery('#image_upload_val').val(oldVal+','+attachment.id); } var src_str = attachment.url; jQuery('#image_upload_val').before('<img width=66 height=66 src='+src_str+' data-id='+attachment.id+' class=attachment-66x66 />'); //jQuery('#post').submit(); } else { return _orig_send_attachment.apply( this, [props, attachment] ); }; } wp.media.editor.open(button); return false; }); jQuery('.add_media').on('click', function(){ _custom_media = false; }); jQuery('#thumbnail_sidebar img').live('click',function(){ valArr = jQuery('#image_upload_val').val().split(','); console.log(valArr); alert(jQuery(this).attr('data-id')); var index = valArr.indexOf(jQuery(this).attr('data-id')); if (index > -1) { valArr.splice(index, 1); jQuery(this).remove(); } console.log(valArr); jQuery('#image_upload_val').val(valArr.toString()); }); }); </script>"; }
Когда мы сохраняем запись, сохраняем данные произвольного поля:
add_action( 'wp_insert_post', 'thumbnail_insert_postdata' ); function thumbnail_insert_postdata( $post_id ) { global $wpdb; // First we need to check if the current user is authorised to do this action. if ( ! current_user_can( 'edit_page', $post_id ) ) return; if ( ! current_user_can( 'edit_post', $post_id ) ) return; // Secondly we need to check if the user intended to change this value. if ( ! isset( $_POST['thumbnail_noncename'] ) || ! wp_verify_nonce( $_POST['thumbnail_noncename'], plugin_basename( __FILE__ ) ) ) return; // Теперь мы можем сохранить значение поля в базе данных // если сохраняем произвольно поле, get post_ID $post_ID = $_POST['post_ID']; // санирование введенных пользователем данных // $mydata = sanitize_text_field( $_POST['myplugin_priceCode'] ); global $mydata; $mydata = $_POST['image_upload_val']; // Do something with $mydata // either using // если значение пустое, то удаляем содержимое из бд if($mydata == '') { delete_post_meta($post_ID, '_multi_img_array', $mydata); } if($mydata) { $cur_data = get_post_meta($post_ID, '_multi_img_array', true); if(!(empty($cur_data))) { //$cur_data .=",".$mydata; update_post_meta($post_ID, '_multi_img_array', $mydata); } else { add_post_meta($post_id, '_multi_img_array', $mydata, true); } } }
Итак, если вы все правильно сделали, дело осталось за малым: необходимо вывести нашу галерею во фронтэнд. Давайте сделаем это через шорткод.
/* Вывод миниатюр через шорткод [product-gallery] или [product-gallery post_id="postid"] */ // Добавляем шорткод function product_gallery_shortcode( $atts ) { // Аттрибуты extract(shortcode_atts( array('post_id' => get_the_ID()), $atts)); $value = get_post_meta($post_id, '_multi_img_array', true); if($value) { $temp = explode(",", $value); ?> <div id="product-gallery"></div> <?php } } add_shortcode( 'product-gallery', 'product_gallery_shortcode' );
Теперь можно вывести миниатюры с помощью шорткода [ product-gallery ]
.
Спасибо за урок, только возник вопрос, как сделать несколько загрузчиков для миниатюры?
Если например хочу сделать не квадрат, а горизонтальную фотку? Вот как тут http://prntscr.com/k6f832
И я увидел, что у вас на gif картинке, на странице, изображение записи тоже gif, как это сделать? насколько я знаю wp режет миниатюры на несколько форматов
Что касается первого вопроса, то не понял его. Размерами изображений можно управлять с помощью функции add_image_size: делать квадратными или прямоугольными с вертикальным или горизонтальным расположением.
Что касается gif анимации, то для работы необходимо вывести полноразмерную картинку. Об этом я как-то писал здесь: https://codyshop.ru/upravlenie-gif-animatsiey-na-js/
То есть если я хочу поставить gif на миниатюру, нужно делать как в вашей статье?
Здравствуйте! прощу прощения просто незнала где спросить. Скажите пожалуйста, как сделать такой вид комментариев как у Вас на сайте!?
Здравствуйте.
Есть задача вывести несколько миниатюр поста в слайдер. При исользовании вашего способа выходит ошибка:
Warning: call_user_func() expects parameter 1 to be a valid callback, function ‘thumbnail_render_images’ not found or invalid function name in /home/sbm5815852/combezza.com/docs/wp-admin/includes/template.php on line 1310
Здравствуйте
Вместо изображения выводит число
Почему так?
Спасибо за код. Это хорошая находка для моих проектов!
Есть “опечатка”. Надо этот кусок:
extract(shortcode_atts( array(‘post_id’ => get_the_ID()), $atts));
Заменить на:
extract(shortcode_atts( array(‘post_id’ => get_the_ID()), $atts));