¿Mostrar miniaturas para categorías?
Actualmente tengo un código donde, en mi category.php, verifica si la categoría específica tiene subcategorías y, si las tiene, las muestra usando wp_list_categories.
Me encantaría que estos wp_list_categories mostraran miniaturas, así que creé un nuevo walker, pero no puedo averiguar cómo mostrar las miniaturas.
Me conformaría con mostrar la imagen destacada de mi último tipo de publicación personalizada en esta categoría, o usar un plugin.
Actualmente tengo el siguiente walker en mi 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";
}
}
}
Como puedes ver, actualmente busca la imagen en una carpeta, pero esto no es ideal, porque no soy el único que agrega categorías, pero no quiero dar acceso FTP a todos.
¿Alguna solución?
¡Gracias!

Hay un excelente plugin llamado Taxonomy Images. Te permite establecer una imagen por categoría que luego puedes acceder de diversas formas.
Es un poco peculiar ya que utiliza algunos filtros personalizados para devolver las imágenes, pero la documentación es bastante buena y deberías poder entenderlo.
== ACTUALIZACIÓN ==
Aquí un ejemplo rápido que obtiene la imagen basada en el ID (asumo que ya tienes el objeto $category
que mencionas en tu fragmento):
$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] );
}
Aquí hay una versión ligeramente ampliada de ese código en los foros de soporte.

¡Gracias! He revisado este plugin, pero no pude averiguar cómo lograr esto y no estaba seguro si era posible. Lo revisaré nuevamente.

¡Gracias nuevamente por la edición! Ahora muestra todas las imágenes, solo que no en la posición que me gustaría que estuvieran. (Pero esto debería ser bastante fácil de solucionar, supongo.)

Realmente no es genial que tengas que cargar un plugin para hacer esto. Sé que este es un hilo antiguo, pero mi recomendación es descargar el plugin Taxonomy Images como se sugirió anteriormente, abrir el código y copiar lo que necesites en tu proyecto. De esta manera no tendrás todo el "peso" de la página de configuración del plugin y demás. WordPress realmente debería hacer esto por defecto/estándar.

Creo que la mejor forma es permitir que el administrador elija la imagen destacada para una categoría desde la Biblioteca Multimedia. Esto es lo que hace WooCommerce para las categorías de productos. Revisé cómo lo hace WooCommerce (en includes/admin/class-wc-admin-taxonomies.php) y aquí está el código reutilizable (úsalo en functions.php o en tu plugin personalizado). Se puede usar con taxonomías de tipos de contenido personalizados.
<?php
/* Imagen en miniatura para categoría */
/* Si es este CPT, usa scripts y estilos para mostrar el popup de la Biblioteca Multimedia */
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');
/*mostrar el campo del formulario*/
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)) // editar término no agregar término
$selectedimgid = get_term_meta( $taxonomy->term_id, 'YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id', true );
?>
<div class="form-field term-thumbnail-wrap">
<label>Miniatura</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">Subir/Añadir imagen</button>
<button type="button" class="remove_image_button button">Eliminar imagen</button>
</div>
<script type="text/javascript">
// Solo mostrar el botón "eliminar imagen" cuando sea necesario
if ( ! jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val() ) {
jQuery( '.remove_image_button' ).hide();
}
// Subiendo archivos
var file_frame;
jQuery( document ).on( 'click', '.upload_image_button', function( event ) {
event.preventDefault();
// Si el marco de medios ya existe, reabrirlo.
if ( file_frame ) {
file_frame.open();
return;
}
// Crear el marco de medios.
file_frame = wp.media.frames.downloadable_file = wp.media({
title: 'Elegir una imagen',
button: {
text: 'Usar imagen'
},
multiple: false
});
// Cuando se selecciona una imagen, ejecutar un 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();
});
// Finalmente, abrir el modal.
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;
}
// Limpiar campos de miniatura al enviar
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();
// Limpiar campo de tipo de visualización al enviar
jQuery( '#display_type' ).val( '' );
return;
}
} );
</script>
<div class="clear"></div>
</div>
<?php
}
