Visualizzare un'immagine per una categoria usando get_categories o mostrare un'immagine da qualsiasi post figlio

19 feb 2014, 18:59:09
Visualizzazioni: 70.5K
Voti: 5

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?

7
Commenti

Per prima cosa dovresti decidere quale di queste due cose vuoi. Poi potresti aggiungere qualsiasi codice che potresti già avere.

kraftner kraftner
19 feb 2014 19:04:03

Preferirei prendere un'immagine in evidenza da un post, ma se quella soluzione è macchinosa e l'altra è semplice allora opterei per la soluzione più semplice

Jon Jon
20 feb 2014 08:36:31

A proposito, se stai cercando un plugin, ce n'è uno chiamato Category Thumbnails che potrebbe fare al caso tuo. Non l'ho testato personalmente, ma l'utilizzo è abbastanza intuitivo - ed è descritto nella repository del plugin.

Nicolai Grossherr Nicolai Grossherr
25 feb 2014 17:08:00

ma avrei bisogno di chiamarlo in una funzione get_categories o simile, e questa parte non è molto chiara

Jon Jon
25 feb 2014 17:10:09

Dovresti decidere quale delle due opzioni vuoi, altrimenti questa non è una domanda, ma 3 domande. Come faccio X, Come faccio Y, e, Dovrei usare X o Y

Tom J Nowell Tom J Nowell
1 mar 2014 18:43:34

Sospetto anche che tu non abbia capito come funzionano i post e i termini gerarchici, un termine contiene automaticamente tutti i post assegnati ai termini figli e nipoti. Ad esempio, tutte le canzoni nel sottogenere dance pop fanno ancora parte del genere principale Pop, e lo stesso vale per i termini gerarchici in WordPress. Questa parte conterebbe come una 4a domanda

Tom J Nowell Tom J Nowell
1 mar 2014 18:46:36

Credo che tu non veda la foresta per gli alberi. La domanda è come faccio A. X e Y sembrano i modi per farlo. Usando il più semplice tra X o Y, come faccio A. Rileggilo

Jon Jon
1 mar 2014 19:37:53
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 4
6

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.

1 mar 2014 18:29:13
Commenti

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

Jon Jon
1 mar 2014 20:11:59

@Jon: vedi la modifica.

s_ha_dum s_ha_dum
1 mar 2014 20:30:19

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

Jon Jon
2 mar 2014 13:42:03

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.

Jon Jon
2 mar 2014 14:06:15

remove_filter() è dopo il loop foreach nel mio codice.

s_ha_dum s_ha_dum
2 mar 2014 15:49:08

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.

Jon Jon
2 mar 2014 16:27:45
Mostra i restanti 1 commenti
6

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.

  1. hook filter wp_list_categories
  2. 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); 
} 
23 feb 2014 19:57:28
Commenti

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?

Jon Jon
23 feb 2014 20:41:23

"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

Jon Jon
1 mar 2014 19:58:17

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

Jon Jon
2 mar 2014 13:29:33

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

Nicolai Grossherr Nicolai Grossherr
2 mar 2014 15:32:06

Grazie per la soluzione, e ho imparato molto dalla funzione

Jon Jon
2 mar 2014 15:35:30

È stato un piacere, tra l'altro seguire le risposte di s_ha_dum non è mai una cattiva idea, perché è incredibilmente bravo in questo. @Jon

Nicolai Grossherr Nicolai Grossherr
2 mar 2014 15:49:48
Mostra i restanti 1 commenti
1

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!

25 feb 2014 16:50:10
Commenti

Darò un'occhiata e vedrò se riesco a farlo funzionare. Grazie

Jon Jon
25 feb 2014 16:53:56
0

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.

26 feb 2014 18:27:59