Visualizzare un'immagine per una categoria usando get_categories o mostrare un'immagine da qualsiasi post figlio
Sto usando get_categories per elencare le categorie figlie di una categoria padre.
Voglio aggiungere un'immagine alle categorie figlie, utilizzando l'output di get_categories.
- Posso prendere l'immagine in evidenza da uno qualsiasi dei post che sono figli della categoria su cui sto usando get_categories, cioè il nipote della categoria padre. Non voglio mostrare altre informazioni sui nipoti e vorrei solo un'immagine in evidenza da ogni set di categorie figlie.
Il codice che uso attualmente è
$args = array('child_of' => 1 );
$categories = get_categories($args);
foreach($categories as $category) {
echo '<p>Categoria:'. $category->name.' </p> ';
echo '<p>Descrizione:'. $category->description . '</p>';
echo INSERISCI IMMAGINE CATEGORIA QUI;
}
- Oppure potrei aggiungere un'immagine a una categoria utilizzando qualche plugin e mostrarla nell'output del
foreach($categories as $category)
.
Ma qual è il modo migliore (e più semplice) per implementare questo?

Ciò è possibile con un filtro su get_terms
.
function grab_child_image($terms,$taxonomies,$args) {
// var_dump($terms,$taxonomies,$args); // debug
foreach ($terms as &$term) {
$cp = new WP_Query(
array (
'cat' => $term->term_id,
'fields' => 'ids',
'ignore_sticky_posts' => true
)
);
// var_dump($cp->posts); // debug
if ($cp->have_posts()) {
$attach = new WP_Query(
array (
'post_parent__in' => $cp->posts,
'post_type' => 'attachment',
'post_status' => 'inherit',
'ignore_sticky_posts' => true,
'posts_per_page' => 1
)
);
if ($attach->have_posts()) {
$term->image = wp_get_attachment_image($attach->posts[0]->ID);
} else {
$term->image = 'un'altra immagine';
}
}
}
return $terms;
}
add_filter('get_terms','grab_child_image',10,3);
$args = array('child_of' => 1 );
$categories = get_categories($args);
foreach($categories as $category) {
echo '<p>Categoria:'. $category->name.' </p> ';
echo '<p> Descrizione:'. $category->description . '</p>';
echo $category->image;
}
remove_filter('get_terms','grab_child_image',10,3);
Ci sono diverse query qui, quindi aggiungi quel filtro solo quando ne hai bisogno e rimuovilo dopo.
Ci sono una serie di funzioni correlate alle immagini che potresti usare invece, se wp_get_attachment_image()
non funziona per le tue esigenze, e puoi passare un parametro $size
a wp_get_attachment_image()
-- secondo parametro-- per ottenere diverse dimensioni dell'immagine. Ad esempio, sostituisci la riga di codice con questa:
$term->image = wp_get_attachment_image($attach->posts[0]->ID, $size->full);
Puoi ulteriormente modificare l'output di wp_get_attachment_image()
applicando un filtro a wp_get_attachment_image_attributes
-- ad esempio, per aggiungere una classe come fatto qui.

funziona - eccellente! 2 domande. Sta recuperando le miniature. Come posso cambiarlo per ottenere l'immagine in evidenza, non la versione miniatura? Inoltre, come potrei aggiungere una classe al tag img. Grazie

Ho aggiunto il codice effettivamente funzionante per il cambio dimensione poiché non ero sicuro di cosa fare finché non ho provato alcune opzioni.

Riguardo al cambiamento di classe - Quando fai il loop devi togliere il remove filter dalla funzione e metterlo dopo il loop, altrimenti funziona solo una volta.

scusa mi riferivo al remove_filter('wp_get_attachment_image_attributes','alter_attr_wpse_102158'); dalla tua risposta linkata per aggiungere la classe. Io ho messo quel remove insieme al remove get_terms. Ma la tua risposta linkata ha bisogno di qualche modifica, se qualcun altro sta leggendo e rimane bloccato.

Invece di usare get_categories()
, ti suggerirei di dare un'occhiata a wp_list_categories()
. Puoi ottenere lo stesso output con questa funzione, ma ha il vantaggio di essere altamente personalizzabile.
Ci sono due modi per personalizzarla, tramite l'hook filter wp_list_categories
- vedi nel codice sorgente - oppure estendendo la classe Walker_Category
- vedi nel codice sorgente. Quest'ultima opzione ti offre molte più possibilità di personalizzazione, ma potrebbe essere eccessiva per modifiche minori. Quindi devi valutare quale metodo si adatta meglio alle tue esigenze.
Poiché questo argomento è già ben trattato su WPSE e SO, mi limiterò a fornirti una breve lista di riferimenti. Inoltre, non hai fornito una descrizione abbastanza specifica delle tue esigenze, rimane un po' vaga, anche se si può intuire cosa desideri. Comunque, le risorse qui sotto dovrebbero aiutarti a scegliere il metodo più adatto a te e inoltre dovrebbero permetterti di realizzarlo.
- hook filter
wp_list_categories
Walker_Category
class
Un'ulteriore osservazione, personalmente opterei quasi sempre per il metodo di estendere la classe Walker_Category
, tranne nei casi in cui la modifica che desideri è molto minore. Questo è ovviamente un po' una preferenza personale, ma ha alcune motivazioni, in particolare per la riutilizzabilità, l'estendibilità e - anche se non sembra necessariamente così - alla fine spesso - forse anche nella maggior parte dei casi - è il modo più semplice per ottenere l'output personalizzato.
Thumbnail da un post in una sottocategoria:
In questo modo puoi recuperare la tua "thumbnail di categoria" da un post casuale appartenente a una delle sottocategorie.
Ho commentato il codice per renderti chiaro come viene fatto, oltre a ciò dovrebbe essere abbastanza autoesplicativo.
/**
* wpse135208_cat_thumb_from_random_child.
*
* Ottiene la thumbnail da un post casuale appartenente a una delle sottocategorie.
*
* @version 0.1
*
* @link https://wordpress.stackexchange.com/q/135208/22534
*
* @param integer $c_cat (default: '')
* @param string/array $size (default: 'post-thumbnail')
* @param string/array $attr (default: null)
*
* @return string
*/
function wpse135208_cat_thumb_from_random_child( $c_cat = '', $size = 'post-thumbnail', $attr = null ) {
// non fare nulla se $c_cat è vuoto
if( empty($c_cat) ) return;
// get_terms è usato perché abbiamo solo bisogno degli id
$taxonomies = array(
'category'
);
$args = array(
'child_of' => $c_cat,
'fields' => 'ids'
);
// restituisce un array di id
$child_cats = get_terms( $taxonomies, $args );
// usa questo per il debug
//echo '<pre>'; print_r($child_cats); echo '</pre>';
$args = array(
// usiamo numberposts invece di post_per_page,
// perché se viene usato il filter pre_get_posts,
// può fare la differenza in questo caso
// vogliamo solo un post
'numberposts' => 1,
// ma lo randomizziamo
'orderby' => 'rand',
'category__in' => $child_cats,
'fields' => 'ids',
// assicurati che solo i post con featured image siano considerati
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS'
)
)
);
// restituisce un array contenente un id di post
$ct_p_id = get_posts( $args );
// usa questo per il debug
//echo '<pre>'; print_r($ct_p_id); echo '</pre>';
// usa questo per il debug
//echo '<pre>'; print_r( ( 1 /*cambia in 0 per mostrare le info src*/ ) ? get_the_post_thumbnail( $ct_p_id[0], $size, $attr ) : wp_get_attachment_image_src( get_post_thumbnail_id( $ct_p_id[0] ) ) ); echo '</pre>';
// ora possiamo usare questo per restituire la nostra thumbnail
return get_the_post_thumbnail( $ct_p_id[0], $size, $attr );
}
Utilizzo in questo modo:
echo wpse135208_cat_thumb_from_random_child( '1', 'thumbnail', null );
Nel tuo codice usalo come mostrato sotto:
$categories = get_categories($args);
foreach($categories as $category) {
echo wpse135208_cat_thumb_from_random_child($category->cat_ID);
}
Thumbnail di categoria tramite plugin:
Questo ha il vantaggio di avere vere e proprie thumbnail per le categorie.
Ho testato rapidamente il plugin - Category Thumbnails - che ho menzionato nel commento sopra. Funziona generalmente bene e ritengo che sia una soluzione migliore rispetto a quella che proponi nella tua risposta, perché ti permette di gestire le thumbnail tramite la libreria media di WordPress.
Ho scoperto un bug minore, l'autore del plugin è stato avvisato e ha risposto immediatamente, quindi il bug verrà presto risolto. Se non puoi aspettare puoi risolverlo tu stesso in questo modo:
Tuttavia la funzione
the_category_thumbnail();
non produce un output. nel codice sorgente della versione 1.0.3 appare così:
function the_category_thumbnail($category_id = null, $sizes = array()) { print get_the_category_thumbnail($cat, $sizes); }
Ho risolto il problema in questo modo:
function the_category_thumbnail($category_id = null, $sizes = array()) { print get_the_category_thumbnail($category_id, $sizes); }
Quindi, rendendo uguali i nomi dei parametri/argomenti.
Oppure puoi semplicemente usare get_the_category_thumbnail()
invece, devi solo fare echo
:
echo get_the_category_thumbnail('1');
Un'altra piccola delusione è che il plugin e le funzioni che offre non ti danno la possibilità di lavorare con le dimensioni delle immagini generate. Il che non è così buono, perché vogliamo la dimensione corretta e non sempre la dimensione completa. Avviserò anche l'autore riguardo a questo, così potrà migliorare ulteriormente il suo plugin. Nel frattempo, fortunatamente, questo può essere facilmente risolto costruendo una funzione personalizzata:
/**
* wpse135208_cat_thumb_wrapper.
*
* Funzione wrapper per avere la possibilità di usare dimensioni predefinite delle immagini tramite wp_get_attachment_image().
*
* @version 0.1
*
* @link https://wordpress.stackexchange.com/q/135208/22534
*
* @param integer $category_id (default: null)
* @param string/array $size (default: 'thumbnail')
* @param boolean $icon (default: false)
* @param string/array (default: null)
*
* @return string
*/
function wpse135208_cat_thumb_wrapper( $category_id = null, $size = 'thumbnail', $icon = false, $attr = null ) {
$category_thumbnail_obj = get_the_category_data( $category_id );
return wp_get_attachment_image( $category_thumbnail_obj->id, $size, $icon, $attr );
}
Utilizzo in questo modo:
echo wpse135208_cat_thumb_wrapper( '1', 'thumbnail', false, null );
Questo dovrebbe aiutarti a far funzionare tutto. Come ho detto, è preferibile perché puoi gestire la tua thumbnail di categoria tramite la libreria media. Nel tuo codice usalo come mostrato sotto:
$categories = get_categories($args);
foreach($categories as $category) {
echo wpse135208_cat_thumb_wrapper($category->cat_ID);
}

Voglio un loop di una singola categoria con titolo, descrizione e immagine delle sottocategorie, senza informazioni sui post, ma che possa prendere qualsiasi immagine da qualsiasi post discendente per l'immagine della categoria figlia. Ho già una funzione get_categories funzionante e il foreach che fa il loop. Ho visto altri post che usano get_categories con vari plugin per ottenere un'immagine. Non so come hanno implementato il loro plugin. Ma forse una funzione walker potrebbe funzionare meglio di un plugin per questo?

"Thumbnail from post in child category" è esattamente quello che cercavo. Non sono innamorato della mia soluzione ma funziona, però questa è chiaramente migliore - ma non riesco a ottenere un output. Ho provato sia echo function( '1', 'thumbnail', null ); che usando $category->cat_ID e $category->term_id ma niente

Sì, ora mostra le immagini. Ma sembra ripetere la stessa immagine da una singola categoria, non un'immagine da ogni categoria. La soluzione di s_ha_dum funziona bene. Grazie

Capisco, la lezione qui è: non fare le cose di fretta, avevo un errore di battitura. Inoltre ho cambiato post_per_page
in numberposts
, perché in questo caso è o almeno può essere vantaggioso. A parte questo, puoi usare la risposta che ti si addice di più. @Jon

Bene, sono riuscito a fare quello che credo tu voglia fare utilizzando Advanced Custom Fields, creando un nuovo set di campi personalizzati con un campo personalizzato di tipo immagine. Da lì, ho impostato le regole di visualizzazione su "Taxonomy Term" > "is equal to" > "Categories" (o qualsiasi tassonomia tu stia utilizzando per questo scopo).
Una volta pubblicato, questo dovrebbe aggiornare la pagina di modifica delle tassonomie con un nuovo campo per l'immagine. Ora, si tratta solo di utilizzare la funzione ACF "get_field()" all'interno del tuo ciclo foreach delle categorie. Ecco come ottenere il campo dalla categoria.
Esempio:
<?php foreach ( $categories as $category ) {
echo get_field('field_name_for_image', $category->taxonomy . "_" . $category->term_id);
} ?>
Se hai utilizzato le impostazioni predefinite di ACF, dovresti ottenere un array da questo, che è l'oggetto immagine, e per quello, leggi la documentazione sui Tipi di Campo Immagine di ACF.
Mi ci sono voluti meno di 5 minuti per impostare tutto, e il plugin è gratuito. Spero che sia rapido e semplice per te!
Buona fortuna!

WordPress ha il codice - http://codex.wordpress.org/Function_Reference/get_the_category
Mostrare Immagini delle Categorie
Questo codice produce immagini delle categorie nominate in base al cat_ID con l'attributo alt impostato su cat_name. Puoi anche usare qualsiasi altra variabile membro al loro posto.
<?php
foreach((get_the_category()) as $category) {
echo '<img src="http://example.com/images/' . $category->cat_ID . '.jpg" alt="' . $category->cat_name . '" />';
}
?>
Questo permette di impostare delle immagini all'interno delle funzioni get_categories. Le immagini devono essere configurate per corrispondere alla funzione. Quindi se viene usato $category->name, l'immagine deve essere salvata nella cartella corretta con il nome corrispondente alla categoria.
