Как отобразить миниатюру для категории?
В настоящее время у меня есть код в category.php, который проверяет, есть ли у конкретной категории подкатегории, и если они есть, отображает их с помощью wp_list_categories.
Я хотел бы, чтобы эти wp_list_categories отображали миниатюры, поэтому я создал новый Walker, но не могу понять, как отображать миниатюры.
Меня бы устроило отображение featured image последнего поста моего пользовательского типа в этой категории или использование плагина.
Сейчас у меня есть следующий Walker в functions.php:
class Walker_Category_Parents extends Walker_Category {
function start_el(&$output, $category, $depth, $args) {
global $wpdb;
extract($args);
$link2 = ''.$category->slug.'';
$cat_name = esc_attr( $category->name );
$cat_name = apply_filters( 'list_cats', $cat_name, $category );
$link = '<a href="' . esc_attr( get_term_link($category) ) . '" ';
$link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"';
$link .= 'rel="'.$category->slug.'" ';
$link .= '>';
$link .= $cat_name . '</a>';
if ( 'list' == $args['style'] ) {
$output .= "\t<li";
$children = $wpdb->get_results( "SELECT term_id FROM $wpdb->term_taxonomy WHERE parent=".$category->term_id );
$children_count = count($children);
$has_children = ($children_count != 0) ? ' parent-category' : '';
$class = 'cat-item cat-item-' . $category->term_id . $has_children;
if ( !empty($current_category) ) {
$_current_category = get_term( $current_category, $category->taxonomy );
if ( $category->term_id == $current_category )
$class .= ' current-cat';
elseif ( $category->term_id == $_current_category->parent )
$class .= ' current-cat-parent';
}
$output .= ' class="' . $class . '"';
$output .= ">$link\n";
$output .= "<img src='http://localhost/wp-content/themes/vom13/images/producten/";
$output .= "$link2.png'>\n";
} else {
$output .= "\t$link<br />\n";
}
}
}
Как видите, сейчас он ищет изображение в папке, но это абсолютно не идеально, потому что я не единственный, кто добавляет категории, но я не хочу давать всем доступ по FTP.
Есть какие-нибудь решения?
Спасибо!
Есть отличный плагин под названием Taxonomy Images. Он позволяет задать одно изображение для каждой категории, которое затем можно использовать различными способами.
Он немного необычен тем, что использует специальные фильтры для возврата изображений, но документация довольно хорошая, и вы сможете разобраться.
== ОБНОВЛЕНИЕ ==
Вот краткий пример получения изображения по ID (я предполагаю, что у вас уже есть объект $category
, который есть в вашем сниппете):
$images = get_option('taxonomy_image_plugin');
$cat_id = $category->term_taxonomy_id;
if( array_key_exists( $cat_id, $images ) ) {
echo wp_get_attachment_image( $images[$cat_id] );
}
Вот более расширенная версия этого кода на форуме поддержки.

Спасибо! Я изучил этот плагин, но не смог разобраться, как этого добиться, и не был уверен, возможно ли это. Я посмотрю ещё раз.

Ещё раз спасибо за правку! Теперь отображаются все изображения, просто не на тех позициях, где бы мне хотелось. (Но это, наверное, можно легко исправить.)

Не очень круто, что для этого нужно подключать целый плагин. Я знаю, что это старый тред, но рекомендую скачать плагин Taxonomy Images, как предложили выше, открыть его код и скопировать нужные части в свой проект. Так вы избежите всей «тяжеловесности» страницы настроек плагина и прочего. WordPress действительно должен сделать это стандартной функциональностью.

Я считаю, что лучший способ — это дать администратору возможность выбирать изображение записи для категории из медиатеки. Именно так делает WooCommerce для категорий товаров. Я изучил, как это реализовано в WooCommerce (в includes/admin/class-wc-admin-taxonomies.php), и представляю вам переиспользуемый код (его можно добавить в functions.php или ваш собственный плагин). Этот код можно использовать с таксономиями пользовательских типов записей.
<?php
/* Миниатюра изображения для категории */
/* Если это CPT, подключаем скрипты и стили для отображения всплывающего окна медиатеки */
function media_uploader() {
global $post_type;
if( 'YOUR_CUSTOM_POST_TYPE' == $post_type) {
if(function_exists('wp_enqueue_media')) {
wp_enqueue_media();
}
else {
wp_enqueue_script('media-upload');
wp_enqueue_script('thickbox');
wp_enqueue_style('thickbox');
}
}
}
add_action('admin_enqueue_scripts', 'media_uploader');
/* Отображаем поле формы */
add_action( 'YOUR_CUSTOM_POST_TYPE-category_add_form_fields', 'add_image_field', 10, 2 );
add_action( 'YOUR_CUSTOM_POST_TYPE-category_edit_form_fields', 'add_image_field', 10, 2 );
function add_image_field($taxonomy) {
if(is_object($taxonomy)) // редактирование термина, а не добавление
$selectedimgid = get_term_meta( $taxonomy->term_id, 'YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id', true );
?>
<div class="form-field term-thumbnail-wrap">
<label>Миниатюра</label>
<div id="YOUR_CUSTOM_POST_TYPE_cat_thumbnail" style="float: left; margin-right: 10px;"><img src="<?php if(isset($selectedimgid)) echo wp_get_attachment_image_src($selectedimgid)[0]; else echo "PLACEHOLDER-IMAGE-HERE.jpg";?>" width="60px" height="60px" /></div>
<div style="line-height: 60px;">
<input type="hidden" id="YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id" name="YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id" value="<?php if(isset($selectedimgid)) echo $selectedimgid; ?>" />
<button type="button" class="upload_image_button button">Загрузить/Добавить изображение</button>
<button type="button" class="remove_image_button button">Удалить изображение</button>
</div>
<script type="text/javascript">
// Показываем кнопку "Удалить изображение" только при необходимости
if ( ! jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val() ) {
jQuery( '.remove_image_button' ).hide();
}
// Загрузка файлов
var file_frame;
jQuery( document ).on( 'click', '.upload_image_button', function( event ) {
event.preventDefault();
// Если медиафрейм уже существует, просто открываем его
if ( file_frame ) {
file_frame.open();
return;
}
// Создаем медиафрейм
file_frame = wp.media.frames.downloadable_file = wp.media({
title: 'Выберите изображение',
button: {
text: 'Использовать изображение'
},
multiple: false
});
// Когда изображение выбрано, выполняем callback
file_frame.on( 'select', function() {
var attachment = file_frame.state().get( 'selection' ).first().toJSON();
var attachment_thumbnail = attachment.sizes.thumbnail || attachment.sizes.full;
jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val( attachment.id );
jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail' ).find( 'img' ).attr( 'src', attachment_thumbnail.url );
jQuery( '.remove_image_button' ).show();
});
// Открываем модальное окно
file_frame.open();
});
jQuery( document ).on( 'click', '.remove_image_button', function() {
jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail' ).find( 'img' ).attr( 'src', 'PLACEHOLDER-IMAGE-HERE.jpg' );
jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val( '' );
jQuery( '.remove_image_button' ).hide();
return false;
});
jQuery( document ).ajaxComplete( function( event, request, options ) {
if ( request && 4 === request.readyState && 200 === request.status
&& options.data && 0 <= options.data.indexOf( 'action=add-tag' ) ) {
var res = wpAjax.parseAjaxResponse( request.responseXML, 'ajax-response' );
if ( ! res || res.errors ) {
return;
}
// Очищаем поля миниатюры при отправке
jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail' ).find( 'img' ).attr( 'src', 'PLACEHOLDER-IMAGE-HERE.jpg' );
jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val( '' );
jQuery( '.remove_image_button' ).hide();
// Очищаем поле типа отображения при отправке
jQuery( '#display_type' ).val( '' );
return;
}
} );
</script>
<div class="clear"></div>
</div>
<?php
}
