CODYSHOP
темы и плагины для WordpressДля добавления миниатюры к записям, администратор сайта должен сделать 5 кликов, при этом перейти на страницу редактирования поста и опуститься ниже до метабокса “Изображение записи”. В обычных ситуациях, это не составляет большого труда. Однако, если нужно установить большое количество миниатюр, например, если вы редактируете товары в интернет-магазине, это может отнимать довольно много времени. Сегодня я покажу, как можно добавлять миниатюры гораздо быстрее: в 3 клика и без перехода на страницу редактирования поста.
Для реализации этой задумки мы создадим дополнительный столбец в списке записей, с помощью которого мы и будем управлять миниатюрой. Если вы не хотите заморачиваться с кодом, просто установите плагин Easy Featured Images. Именно на его основе сегодняшний пост. Сразу оговорюсь, что для корректной работы в “Настройках медиафайлов”, ширина и высота миниатюр не должны равняться 0. Если все в порядке, начнем.
Добавление нового столбца в списке записей
Воспользуемся хуком manage_(post_type)_posts_columns
для добавления колонки.
add_filter( 'manage_post_posts_columns', 'efi_table_head' ); function efi_table_head( $columns ) { $checkbox = array_slice( $columns , 0, 1 ); $columns = array_slice( $columns , 1 ); $new['_post_thumbnail'] = 'Image'; $columns = array_merge( $checkbox, $new, $columns ); return $columns; }
Заполняем созданную колонку
Заполнение колонки осуществляется путем навешивания на функцию хука manage_[POST_TYPE]_posts_custom_column
. В каждую строку мы добавим по три элемента: отображаемая картинка (миниатюра и её копия больших размеров), поле добавления картинки, и наконец кнопка для удаления картинки. Окончательный PHP будет выглядеть так:
add_action( 'manage_post_posts_custom_column', 'efi_column_content', 10, 2 ); function efi_column_content( $column_slug, $post_id ) { if ( '_post_thumbnail' == $column_slug ) { $nonce = wp_create_nonce( "set_post_thumbnail-" . $post_id ); $no_image = ( has_post_thumbnail( $post_id ) ) ? '' : 'no-image'; echo "<div class='efi-thumbnail " . $no_image . "'>"; echo "<div class='efi-images'>"; if( has_post_thumbnail( $post_id ) ) { echo "<a class='efi-choose-image' data-nonce='" . $nonce . "' href='" . get_edit_post_link( $post_id ) . "'>" . get_the_post_thumbnail( $post_id, 'thumbnail' ) . '</a>'; echo "<a class='efi-choose-image' data-nonce='" . $nonce . "' href='" . get_edit_post_link( $post_id ) . "'>" . get_the_post_thumbnail( $post_id, 'medium' ) . '</a>'; } else { echo "<a class='efi-choose-image' data-nonce='" . $nonce . "' href='" . get_edit_post_link( $post_id ) . "'> <i class='dashicons dashicons-plus'></i> <br> add image</a>"; } echo '</div>'; echo "<a href='" . get_edit_post_link( $post_id ) . "' data-nonce='" . $nonce . "' class='efi-remove-image'><i class='dashicons dashicons-no'></i> remove</a>"; echo '</div>'; } }
Если вы внимательно присмотретесь к коду, может возникнуть вопрос: если мы будем работать с JavaScript, зачем оборачивать миниатюры в ссылку? Очень просто. Если что-то пойдет не так, эти ссылки перенаправляют пользователей на страницу редактирования поста. Такое может случиться, если с JS выключен (довольно большая редкость) или если другой плагин конфликтует с нашим JavaScript.
Оформление колонки
Без стилей наш столбик выглядит довольно уныло. Давайте исправим это подключением наших стилей, воспользуемся хуком admin_enqueue_scripts
.
add_action( 'admin_enqueue_scripts', 'efi_enqueue_assets' ); function efi_enqueue_assets( $page ) { if ( 'edit.php' != $page ) { return; } wp_enqueue_style( 'efi_styles', plugin_dir_url( __FILE__ ) . '/style.css' ); }

Параметр admin_enqueue_scripts
позволяет нам выводить наши стили только на страницах административной части WordPress. Содержимое подключаемого файла:
/* Maximum column width */ .manage-column.column-_post_thumbnail { width:72px; } /* Makes sure large images can be laid over the table */ ._post_thumbnail.column-_post_thumbnail { overflow:visible; } /* Makes sure that absolutely positioned elements within are aligned to this element */ .efi-thumbnail { position:relative; } /* Maximum thumbnail size */ .efi-thumbnail .attachment-thumbnail { max-width:72px; max-height:72px; } /* Positioning of the medium size image display */ .efi-thumbnail .attachment-medium { position:absolute; top:0px; left:0px; display:none; } /* Show larger image when hovering over the smaller one */ .efi-images:hover .attachment-medium { display:block; z-index:4000; } /* No image styling */ .efi-thumbnail.no-image a.efi-choose-image { display:block; height:70px; width:70px; border:1px dashed #aaa; font-size:11px; text-align:center; display: table-cell; vertical-align:middle; color:#aaa; -webkit-transition: all .1s ease-in 0; transition: all .1s ease-in 0; } .efi-thumbnail.no-image a.efi-choose-image:hover { color:#0074a2; border-color: #0074a2; } .efi-thumbnail.no-image a.efi-choose-image .dashicons { transition:none; -webkit-transition: none; } /* Image removal link style */ .efi-remove-image { font-size:11px; color: #aaa; } .efi-remove-image .dashicons { font-size:10px; width:10px; height:10px; line-height:11px; vertical-align:middle; } .efi-remove-image:hover { color: #aa0000; } .efi-thumbnail.no-image .efi-remove-image{ display:none; }
Подключаем JavaScript
Для добавления картинок без перезагрузки, нам необходимо не только прописать путь js файлу, но и указать где располагается наш admin-ajax.php файл.
function efi_enqueue_assets( $page ) { if ( 'edit.php' != $page ) { return; } wp_enqueue_style( 'efi_styles', plugin_dir_url( __FILE__ ) . '/style.css' ); wp_enqueue_script( 'efi_scripts', plugin_dir_url( __FILE__ ) . '/scripts.js' ); wp_enqueue_media(); wp_localize_script( 'efi_scripts', 'efi_strings', array( 'browse_images' => __( 'Browse Or Upload An Image', 'easy-featured-images' ), 'select_image' => __( 'Set featured image', 'easy-featured-images' ), 'ajaxurl' => admin_url( 'admin-ajax.php' ) )); }
Содержимое скрипта:
(function( $ ) { 'use strict'; var file_frame, post_id, nonce, efi_thumbnail; jQuery(document).on('click', '.efi-choose-image', function( event ){ post_id = $(this).parents('tr:first').attr('id').replace( 'post-', '' ); nonce = $(this).data('nonce'); efi_thumbnail = $(this).parents( '.efi-thumbnail' ); if ( undefined !== file_frame ) { file_frame.open(); return false; } file_frame = wp.media.frames.file_frame = wp.media({ title: efi_strings.browse_images, button: { text: efi_strings.select_image }, multiple: false }); file_frame.on( 'select', function() { var image_data = file_frame.state().get( 'selection' ).first().toJSON(); var thumbnail = image_data.sizes.thumbnail; var medium = image_data.sizes.medium; if( efi_thumbnail.hasClass( 'no-image' ) ) { efi_thumbnail.removeClass( 'no-image' ); var link = efi_thumbnail.find('a.efi-choose-image'); link.html('').clone().insertAfter(link); var thumbnail_image = $('<img>').attr({ width: thumbnail.width, height : thumbnail.height, class : 'attachment-thumbnail wp-post-image', src : thumbnail.url, alt : image_data.alt }) var medium_image = $('<img>').attr({ width: medium.width, height : medium.height, class : 'attachment-medium wp-post-image', src : medium.url, alt : image_data.alt }) efi_thumbnail.find('a.efi-choose-image:first').html( thumbnail_image ); efi_thumbnail.find('a.efi-choose-image:last').html( medium_image ); efi_thumbnail.find('a.efi-choose-image').wrapAll( "<div class='efi-images' />"); } else { efi_thumbnail.find('.attachment-thumbnail').attr( 'src', thumbnail.url ); efi_thumbnail.find('.attachment-medium').attr( 'src', medium.url ); } $.post( efi_strings.ajaxurl, { _ajax_nonce: nonce, post_id : post_id, thumbnail_id : image_data.id, action: 'set-post-thumbnail' }) }); // Now display the actual file_frame file_frame.open(); return false; }); // удаляем картинку из блока миниатюры $(document).on( 'click', '.efi-remove-image', function() { efi_thumbnail = $(this).parents( '.efi-thumbnail' ); nonce = $(this).data('nonce'); var url = $(this).attr('href'); var post_id = parseInt( efi_thumbnail.parents('tr:first').attr('id').replace( 'post-', '' ) ); efi_thumbnail.addClass( 'no-image' ); var choose_image = $('<a>').attr({ href : url, 'data-nonce' : nonce, class : 'efi-choose-image' }).html("<i class='dashicons dashicons-plus'></i> <br> " + efi_strings.add_image + "</a>") efi_thumbnail.find('.efi-images').html(choose_image); $.post( efi_strings.ajaxurl, { _ajax_nonce: nonce, post_id : post_id, thumbnail_id : -1, action: 'set-post-thumbnail' }) return false; }) })( jQuery );
На этом пожалуй все. Если вы все сделали верно, теперь вы сможете легко и быстро добавлять-удалять миниатюры записей.
Добрый день, а как добавить кастомные типи записей? Ну что бы в них тоже была возможность вывода картинки