Cum să afișezi thumbnail-uri pentru categorii în WordPress?
În prezent am un cod în category.php care verifică dacă o categorie specifică are subcategorii și, dacă are, le afișează folosind wp_list_categories.
Aș dori ca aceste wp_list_categories să afișeze thumbnail-uri, așa că am creat un walker nou, dar nu reușesc să afișez imaginile.
Aș fi mulțumit să afișez featured image-ul din ultima postare de tip custom în această categorie, sau să folosesc un plugin.
Momentan am următorul walker în 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";
}
}
}
După cum poți vedea, în prezent caută imaginea într-un folder, dar asta nu este ideal deloc, pentru că nu sunt singurul care adaugă categorii, dar nu vreau să ofer tuturor acces FTP.
Există soluții?
Mulțumesc!
Există un plugin excelent numit Taxonomy Images. Acesta vă permite să setați o imagine pentru fiecare categorie, pe care o puteți accesa apoi în diverse moduri.
Este un pic neobișnuit prin faptul că utilizează niște filtre personalizate pentru a returna imaginile, dar documentația este destul de bună și ar trebui să reușiți să vă dați seama cum funcționează.
== ACTUALIZARE ==
Iată un exemplu rapid care obține imaginea pe baza ID-ului (presupun că aveți deja obiectul $category
din fragmentul dvs. de cod):
$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] );
}
Aici găsiți o versiune ușor extinsă a acelui cod pe forumurile de suport.

Mulțumesc! Am analizat acest plugin, dar nu am reușit să înțeleg cum să realizez asta și nu eram sigur dacă este posibil. O să mă uit din nou.

Mulțumesc din nou pentru editare! Acum afișează toate imaginile, doar că nu în poziția în care aș dori să fie. (Dar cred că ar trebui să fie destul de ușor de rezolvat.)

Nu este deloc ok că trebuie să încarci un plugin pentru asta. Știu că acest thread este vechi, dar recomandarea mea este să descarci pluginul Taxonomy Images așa cum a fost sugerat mai sus, să deschizi codul și să copiezi ce ai nevoie în proiectul tău. În acest fel nu ai toată "povara" paginii de setări a pluginului și a altor lucruri. WordPress ar trebui să facă asta implicit / standard.

Cred că cea mai bună metodă este să permiți administratorului să aleagă imaginea reprezentativă pentru o categorie din Biblioteca Media. Exact așa funcționează WooCommerce pentru categoriile de produse. Am verificat cum implementează WooCommerce această funcționalitate (în includes/admin/class-wc-admin-taxonomies.php) și iată codul reutilizabil (poți să-l folosești în functions.php sau într-un plugin personalizat). Poate fi folosit și cu taxonomiile post types personalizate.
<?php
/* Imagine thumbnail pentru categorie */
/* Dacă este un CPT personalizat, folosește scripturile și stilurile pentru afișarea popup-ului Biblioteca Media */
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');
/*afișează câmpul din formular*/
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)) // editare termen, nu adăugare
$selectedimgid = get_term_meta( $taxonomy->term_id, 'YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id', true );
?>
<div class="form-field term-thumbnail-wrap">
<label>Imagine reprezentativă</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">Încarcă/Adaugă imagine</button>
<button type="button" class="remove_image_button button">Șterge imagine</button>
</div>
<script type="text/javascript">
// Afișează butonul "șterge imagine" doar când este necesar
if ( ! jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val() ) {
jQuery( '.remove_image_button' ).hide();
}
// Încărcare fișiere
var file_frame;
jQuery( document ).on( 'click', '.upload_image_button', function( event ) {
event.preventDefault();
// Dacă frame-ul media există deja, redeschide-l
if ( file_frame ) {
file_frame.open();
return;
}
// Creează frame-ul media
file_frame = wp.media.frames.downloadable_file = wp.media({
title: 'Alege o imagine',
button: {
text: 'Folosește imaginea'
},
multiple: false
});
// Când o imagine este selectată, execută 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();
});
// Deschide modalul
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;
}
// Golește câmpurile Thumbnail la trimitere
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();
// Golește câmpul Display type la trimitere
jQuery( '#display_type' ).val( '' );
return;
}
} );
</script>
<div class="clear"></div>
</div>
<?php
}
