web-dev-qa-db-fra.com

Afficher une image pour une catégorie à l'aide de get_categories ou afficher une image à partir de tout message enfant

J'utilise get_categories pour lister les catégories enfants d'une catégorie parent.

Je souhaite ajouter une image aux catégories enfants à l'aide de la sortie get_categories.

  • Je peux soit prendre l’image présentée dans l’un des articles qui sont des enfants de la catégorie sur laquelle j’utilise get_categories, IE le petit-enfant de la catégorie parent. Je ne souhaite montrer aucune autre information relative au grand enfant et je voudrais juste une image sélectionnée de chaque ensemble d'enfants de la catégorie.

Le code que j'utilise actuellement est

$args = array('child_of'  => 1  );
$categories = get_categories($args);
  foreach($categories as $category) { 
    echo '<p>Category:'. $category->name.' </p> ';
    echo '<p> Description:'. $category->description . '</p>';
    echo PUT CAT IMAGE HERE;
     } 
  • Ou je pourrais ajouter une image à une catégorie en utilisant un plugin et la montrer dans la sortie foreach($categories as $category).

Mais quel est le meilleur moyen (et le plus simple) de mettre cela en œuvre?

3
Jon

Ceci est possible avec un filtre sur 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 = 'some other image';
      }
    }
  }
  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>Category:'. $category->name.' </p> ';
  echo '<p> Description:'. $category->description . '</p>';
  echo $category->image;
} 

remove_filter('get_terms','grab_child_image',10,3);

Il y a plusieurs requêtes, donc ajoutez ce filtre uniquement lorsque vous en avez besoin, puis supprimez-le.

Il existe un certain nombre de fonctions d'image connexes que vous pouvez utiliser à la place, si wp_get_attachment_image() ne fonctionne pas pour vos besoins et que vous pouvez passer un paramètre $size à wp_get_attachment_image()-- second paramètre-- pour obtenir différentes tailles d'image. Par exemple, remplacez la ligne de code par ceci:

$term->image = wp_get_attachment_image($attach->posts[0]->ID, $size->full);

Vous pouvez modifier davantage la sortie de wp_get_attachment_image() en appliquant un filtre à wp_get_attachment_image_attributes--, par exemple, pour ajouter une classe comme effectué ici .

4
s_ha_dum

Au lieu d'utiliser get_categories() , je vous suggère de jeter un coup d'œil à wp_list_categories() . Vous pouvez obtenir le même résultat avec, mais cela présente l'avantage d'être hautement personnalisable.

Il existe deux manières de personnalisation, soit via le filtre hook wp_list_categories - voir dans source -, soit en développant le Walker_Category class - voir dans source . Ce dernier vous donne beaucoup plus de possibilités de personnalisation, mais peut être excessif pour des modifications mineures. Vous devez donc évaluer ce qui correspond le mieux à vos besoins.

Comme ce sujet est en fait assez bien couvert sur WPSE et SO, je vais vous donner une courte liste de références. Outre que vous n'avez pas donné une description suffisamment précise de vos besoins, cela reste un peu vague, même si on peut savoir ce que vous voulez. Quoi qu'il en soit, les ressources ci-dessous devraient vous aider à choisir la méthode qui vous convient et, en plus, vous permettre de l’atteindre.

  1. crochet de filtre wp_list_categories
  2. Walker_Category class

Encore une remarque, personnellement, je préférerais presque toujours étendre la méthode de la classe Walker_Category, mais dans les cas où le changement souhaité est très mineur. C’est bien sûr un peu une préférence personnelle, mais elle a quelques antécédents, notamment en raison de sa réutilisation, de son extensibilité et - même si cela ne semble pas nécessaire - après tout, souvent - peut-être même la plupart du temps - moyen plus facile d’atteindre la sortie personnalisée.


Vignette du post dans la catégorie enfant:

_ {Vous pourrez ainsi récupérer votre "vignette de catégorie" dans une publication aléatoire appartenant à l'une des catégories enfants.

J'ai commenté le code pour le rendre compréhensible pour vous comment cela est fait, outre qu'il devrait être assez explicite.

/**
 * wpse135208_cat_thumb_from_random_child.
 *
 * Get the thumbnail from a random post belonging to one of the child categories.
 *
 * @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 ) {
    // do nothing if $c_cat is empty
    if( empty($c_cat) ) return;
    // get_terms is used because we only need ids
    $taxonomies = array(
        'category'
        );
    $args = array(
        'child_of' => $c_cat,
        'fields' => 'ids'
        );
    // returns an array of ids
    $child_cats = get_terms( $taxonomies, $args );
    // use this for debugging
    //echo '<pre>'; print_r($child_cats); echo '</pre>';

    $args = array(
        // we use numberposts instead of post_per_page,
        // because if the pre_get_posts filter is used,
        // it can make a difference in this case 
        // we only want one post
        'numberposts' => 1,
        // but we randomize this
        'orderby' => 'Rand',
        'category__in' => $child_cats,
        'fields' => 'ids',
        // make sure only posts with featured image are considered
        'meta_query' => array(
            array(
                'key' => '_thumbnail_id',
                'compare' => 'EXISTS'
            )
        )
        );
    // returns an array containing one post id
    $ct_p_id = get_posts( $args );
    // use this for debugging
    //echo '<pre>'; print_r($ct_p_id); echo '</pre>';

    // use this for debugging
    //echo '<pre>'; print_r( ( 1 /*change to 0 to show src info*/ ) ? 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>'; 
    // now we can use this to return our thumbnail
    return get_the_post_thumbnail( $ct_p_id[0], $size, $attr );
}

Utilisation comme ceci:

echo wpse135208_cat_thumb_from_random_child( '1', 'thumbnail', null );

Dans votre code, utilisez-le comme indiqué ci-dessous:

$categories = get_categories($args);
foreach($categories as $category) { 
    echo wpse135208_cat_thumb_from_random_child($category->cat_ID); 
} 



Vignette de la catégorie via le plugin:

_ {Cela présente l'avantage d'avoir des vignettes de catégories réelles.} _

J'ai donné le plugin - Catégorie Vignettes - J'ai mentionné dans le commentaire ci-dessus un test rapide. Cela fonctionne généralement et je pense que c'est une meilleure solution que ce que vous proposez dans votre réponse, car elle vous permet de gérer les vignettes via la médiathèque wordpress.

J'ai découvert un bogue mineur, l'auteur du plug-in est notifié et j'ai répondu instantanément, le bogue sera donc bientôt corrigé. Si vous ne pouvez pas attendre, vous pouvez le réparer vous-même comme ceci:

Cependant la fonction

the_category_thumbnail();

ne produit pas de sortie. cela ressemble à ceci dans le code source de la version 1.0.3:

function the_category_thumbnail($category_id = null, $sizes = array()) {
    print get_the_category_thumbnail($cat, $sizes);
}

J'ai réussi à résoudre le problème comme ceci:

function the_category_thumbnail($category_id = null, $sizes = array()) {
    print get_the_category_thumbnail($category_id, $sizes);
}

Donc, en rendant le paramètre/nom de l'argument égal.

Ou vous utilisez simplement get_the_category_thumbnail() à la place, il vous suffit de echo le:

echo get_the_category_thumbnail('1');

Une autre déception mineure est que le plugin et les fonctions qu’il offre ne vous permettent pas de travailler avec les tailles d’image générées. Ce qui n’est pas très bon, car nous voulons la taille correcte et pas toujours la taille complète. Je vais également en informer l'auteur afin qu'il puisse améliorer davantage son plugin. En attendant, cela peut heureusement être facilement résolu en construisant une fonction personnalisée:

/**
 * wpse135208_cat_thumb_wrapper.
 *
 * Wrapper function to have the ability to use predefined image sizes via 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 );
}

Utilisation comme ceci:

echo wpse135208_cat_thumb_wrapper( '1', 'thumbnail', false, null );

Cela devrait vous aider à faire fonctionner cela. Comme je l’ai dit, c’est préférable, car vous pouvez gérer la vignette de votre catégorie via la médiathèque. Dans votre code, utilisez-le comme indiqué ci-dessous:

$categories = get_categories($args);
foreach($categories as $category) { 
    echo wpse135208_cat_thumb_wrapper($category->cat_ID); 
} 
2
Nicolai

Eh bien, j'ai réussi à faire ce que je pense que vous voulez faire en utilisant Champs personnalisés avancés , en créant un nouvel ensemble de champs personnalisés avec un champ image personnalisé. À partir de là, définissez les règles relatives à l'emplacement sur "Terme de taxonomie"> "est égal à"> "Catégories" (ou quelle que soit la taxonomie pour laquelle vous l'utilisiez).

Une fois que vous avez publié cela, il devrait être mis à jour à l'endroit où vous éditez les taxonomies avec un nouveau champ pour une image. Maintenant, il suffit d'utiliser la fonction ACF "get_field ()" dans votre boucle for category. Voici comment vous obtenez le champ de la catégorie.

Exemple:

<?php foreach ( $categories as $category ) {
    echo get_field('field_name_for_image', $category->taxonomy . "_" . $category->term_id);
} ?>

Si vous avez utilisé les paramètres par défaut pour ACF, vous devriez en extraire un tableau, l’objet image, et pour cela, consultez/ Types de champs d’image à partir d’ACF.

Cela m'a pris <5 minutes pour l'installer et le plugin est gratuit. J'espère que c'est rapide et facile pour vous!

Bonne chance!

1
socki03

Wordpress a le code - http://codex.wordpress.org/Function_Reference/get_the_category

     Show Category Images
This outputs category images named after the cat_ID with the alt attribute set to cat_name. You can also use any of the other member variables instead.

<?php 
foreach((get_the_category()) as $category) { 
    echo '<img src="http://example.com/images/' . $category->cat_ID . '.jpg" alt="' . $category->cat_name . '" />'; 
} 
?>

Cela permet de configurer des images dans les fonctions get_categories. Les images doivent être configurées pour correspondre à la fonction. Donc, si $ category-> name est utilisé, l'image doit être enregistrée dans le bon dossier avec le nom correspondant à la catégorie.

0
Jon