Afișează Imagine pentru o categorie folosind get_categories sau arată o imagine din orice postare copil
Folosesc get_categories pentru a lista categoriile copil ale unei categorii părinte.
Vreau să adaug o imagine categoriilor copil, folosind rezultatul get_categories.
- Pot fie să preiau imaginea reprezentativă din oricare dintre postările care sunt copii ai categoriei pe care o folosesc cu get_categories, adică nepoții categoriei părinte. Nu vreau să arăt nicio altă informație despre nepoți și aș dori doar o singură imagine reprezentativă din fiecare set de categorii copil.
Codul pe care îl folosesc în prezent este
$args = array('child_of' => 1 );
$categories = get_categories($args);
foreach($categories as $category) {
echo '<p>Categorie:'. $category->name.' </p> ';
echo '<p> Descriere:'. $category->description . '</p>';
echo PUNE IMAGINEA CATEGORIEI AICI;
}
- Sau aș putea adăuga o imagine unei categorii folosind un plugin și să o afișez în rezultatul
foreach($categories as $category)
.
Dar care este cea mai bună (și mai ușoară) modalitate de a implementa acest lucru?

Acest lucru este posibil cu ajutorul unui filtru aplicat pe get_terms
.
function grab_child_image($terms,$taxonomies,$args) {
// var_dump($terms,$taxonomies,$args); // depanare
foreach ($terms as &$term) {
$cp = new WP_Query(
array (
'cat' => $term->term_id,
'fields' => 'ids',
'ignore_sticky_posts' => true
)
);
// var_dump($cp->posts); // depanare
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 = 'altă imagine';
}
}
}
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>Categorie:'. $category->name.' </p> ';
echo '<p> Descriere:'. $category->description . '</p>';
echo $category->image;
}
remove_filter('get_terms','grab_child_image',10,3);
Există mai multe interogări în acest cod, așa că adaugă acest filtru doar când este necesar și elimină-l după utilizare.
Există mai multe funcții înrudite pentru imagini pe care le poți folosi în loc, dacă wp_get_attachment_image()
nu îți satisface nevoile, și poți transmite un parametru $size
către wp_get_attachment_image()
-- al doilea parametru -- pentru a obține dimensiuni diferite ale imaginii. De exemplu, înlocuiește linia de cod cu aceasta:
$term->image = wp_get_attachment_image($attach->posts[0]->ID, $size->full);
Poți modifica în continuare rezultatul funcției wp_get_attachment_image()
aplicând un filtru pe wp_get_attachment_image_attributes
-- de exemplu, pentru a adăuga o clasă așa cum este făcut aici.

funcționează - excelent! 2 întrebări. Se afișează thumbnail-urile. Cum aș putea schimba asta pentru a afișa imaginea principală (featured image), nu versiunea thumbnail? De asemenea, cum aș putea adăuga o clasă la tag-ul img. Mulțumesc

Am adăugat codul funcțional real pentru schimbarea dimensiunii, deoarece nu eram sigur ce să fac până nu am încercat câteva variante.

Referitor la schimbarea clasei - Când faci bucla, trebuie să scoți filtrul de eliminare din funcție și să-l pui după buclă, altfel funcționează doar o singură dată.

Îmi cer scuze, mă refeream la remove_filter('wp_get_attachment_image_attributes','alter_attr_wpse_102158');
din răspunsul tău legat pentru adăugarea clasei. Am pus acel remove împreună cu remove get_terms. Dar răspunsul tău legat necesită puțină ajustare, dacă mai este cineva care citește asta și este blocat.

În loc să folosești get_categories()
, îți sugerez să arunci o privire la wp_list_categories()
. Poți obține același rezultat cu aceasta, dar are avantajul că este foarte personalizabilă.
Există două modalități de personalizare: fie prin intermediul filtrului wp_list_categories
- vezi în sursă - fie prin extinderea clasei Walker_Category
- vezi în sursă. Ultima variantă îți oferă mult mai multe posibilități de personalizare, dar poate fi exagerată pentru modificări minore. Așadar, trebuie să evaluezi ce se potrivește cel mai bine nevoilor tale.
Deoarece acest subiect este deja bine acoperit pe WPSE și SO, îți voi oferi doar o listă scurtă de referințe. În plus, nu ai oferit o descriere suficient de specifică a nevoilor tale, rămânând oarecum vagă, deși se poate înțelege ce dorești. Oricum, resursele de mai jos ar trebui să te ajute să alegi metoda potrivită și să te ajute să o implementezi.
- filtru
wp_list_categories
- clasa
Walker_Category
Încă o observație, personal aș opta aproape întotdeauna pentru extinderea clasei Walker_Category
, cu excepția cazurilor în care modificarea dorită este foarte minoră. Desigur, aceasta este o preferință personală, dar are o bază logică, mai ales din cauza reutilizării, extensibilității și - chiar dacă nu pare așa - deseori este chiar cea mai ușoară metodă pentru a obține rezultatul dorit.
Miniatură din articolul dintr-o categorie copil:
Această metodă îți permite să obții "miniatura categoriei" dintr-un articol aleatoriu care aparține uneia dintre categoriile copil.
Am adăugat comentarii în cod pentru a-l face mai ușor de înțeles, dar ar trebui să fie destul de explicit.
/**
* wpse135208_cat_thumb_from_random_child.
*
* Obține miniatura dintr-un articol aleatoriu care aparține uneia dintre categoriile copil.
*
* @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 ) {
// nu face nimic dacă $c_cat este gol
if( empty($c_cat) ) return;
// get_terms este folosit pentru că avem nevoie doar de ID-uri
$taxonomies = array(
'category'
);
$args = array(
'child_of' => $c_cat,
'fields' => 'ids'
);
// returnează un array de ID-uri
$child_cats = get_terms( $taxonomies, $args );
// folosește pentru depanare
//echo '<pre>'; print_r($child_cats); echo '</pre>';
$args = array(
// folosim numberposts în loc de post_per_page,
// pentru că dacă este folosit filtrul pre_get_posts,
// poate face diferența în acest caz
// vrem doar un articol
'numberposts' => 1,
// dar îl randomizăm
'orderby' => 'rand',
'category__in' => $child_cats,
'fields' => 'ids',
// asigură-te că sunt luate în considerare doar articolele cu imagine reprezentativă
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS'
)
)
);
// returnează un array care conține un ID de articol
$ct_p_id = get_posts( $args );
// folosește pentru depanare
//echo '<pre>'; print_r($ct_p_id); echo '</pre>';
// folosește pentru depanare
//echo '<pre>'; print_r( ( 1 /*schimbă în 0 pentru a afișa informații sursă*/ ) ? 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>';
// acum putem folosi asta pentru a returna miniatura
return get_the_post_thumbnail( $ct_p_id[0], $size, $attr );
}
Utilizare astfel:
echo wpse135208_cat_thumb_from_random_child( '1', 'thumbnail', null );
În codul tău, folosește-o așa cum este arătat mai jos:
$categories = get_categories($args);
foreach($categories as $category) {
echo wpse135208_cat_thumb_from_random_child($category->cat_ID);
}
Miniatură pentru categorie prin plugin:
Acest lucru are avantajul de a avea miniaturi reale pentru categorii.
Am testat rapid plugin-ul - Category Thumbnails - pe care l-am menționat în comentariul de mai sus. Funcționează în general și cred că este o soluție mai bună decât ce propui tu în răspunsul tău, deoarece îți permite să gestionezi miniaturile prin intermediul bibliotecii media WordPress.
Am descoperit o mică eroare, autorul plugin-ului a fost notificat și a răspuns imediat, așa că eroarea va fi remediată în curând. Dacă nu poți aștepta, o poți repara singur astfel:
Cu toate acestea, funcția
the_category_thumbnail();
nu produce nicio ieșire. În codul sursă al versiunii 1.0.3 arată astfel:
function the_category_thumbnail($category_id = null, $sizes = array()) { print get_the_category_thumbnail($cat, $sizes); }
Am reușit să repar problema astfel:
function the_category_thumbnail($category_id = null, $sizes = array()) { print get_the_category_thumbnail($category_id, $sizes); }
Deci, prin egalizarea numelui parametrului/argumentului.
Sau poți folosi direct get_the_category_thumbnail()
, doar că trebuie să îl echo
:
echo get_the_category_thumbnail('1');
O altă mică dezamăgire este că plugin-ul și funcțiile pe care le oferă nu îți dau posibilitatea de a lucra cu dimensiunile imaginilor generate. Ceea ce nu este prea bine, pentru că vrem dimensiunea corectă și nu întotdeauna dimensiunea maximă. Am să notific și autorul despre asta, pentru a-și putea îmbunătăți plugin-ul. Între timp, acest lucru poate fi ușor remediat prin construirea unei funcții personalizate:
/**
* wpse135208_cat_thumb_wrapper.
*
* Funcție wrapper pentru a putea folosi dimensiuni predefinite de imagini prin 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 );
}
Utilizare astfel:
echo wpse135208_cat_thumb_wrapper( '1', 'thumbnail', false, null );
Acest lucru ar trebui să te ajute să obții funcționalitatea dorită. După cum am spus, este preferabil pentru că poți gestiona miniaturile categoriilor prin biblioteca media. În codul tău, folosește-o așa cum este arătat mai jos:
$categories = get_categories($args);
foreach($categories as $category) {
echo wpse135208_cat_thumb_wrapper($category->cat_ID);
}

Vreau să afișez o buclă pentru o singură categorie cu titlul, descrierea și imaginea subcategoriilor, fără informații despre postări, dar să pot folosi orice imagine din orice postare a unui sub-copil pentru imaginea categoriei copil. Am o funcție get_categories care funcționează și foreach face bucla. Am văzut alte postări care folosesc get_categories cu diverse pluginuri pentru a obține o imagine. Nu știu cum au implementat acel plugin. Dar poate că o funcție walker ar funcționa mai bine decât un plugin pentru asta?

"Thumbnail from post in child category" este exact ceea ce căutam. Nu sunt încântat de soluția mea, dar funcționează, însă aceasta este clar mai bună - dar nu obțin niciun rezultat. Am încercat atât echo function( '1', 'thumbnail', null ); cât și folosind $category->cat_ID și $category->term_id, dar nimic.

Da, acum afișează imagini. Dar se pare că repetă aceeași imagine dintr-o singură categorie, nu câte o imagine din fiecare categorie. Soluția lui s_ha_dum funcționează bine. Mulțumesc.

Am înțeles, lecția de aici este să nu faci lucrurile în grabă, am avut o greșală de scriere acolo. În plus, am schimbat post_per_page
în numberposts
, deoarece în acest caz este sau cel puțin poate fi benefic. În afară de asta, folosești orice răspuns ți se potrivește cel mai bine. @Jon

Ei bine, am reușit să fac ceea ce cred că dorești să realizezi folosind Advanced Custom Fields, creând un set nou de câmpuri personalizate cu un câmp personalizat de tip imagine. De acolo, am stabilit regulile de localizare la "Taxonomy Term" > "is equal to" > "Categories" (sau orice taxonomie ai folosi pentru asta).
Odată ce publici acest lucru, ar trebui să actualizeze secțiunea unde editezi taxonomiile cu un câmp nou pentru imagine. Acum, totul se reduce la utilizarea funcției ACF "get_field()" în interiorul buclei tale foreach pentru categorii. Iată cum poți obține câmpul din categorie.
Exemplu:
<?php foreach ( $categories as $category ) {
echo get_field('field_name_for_image', $category->taxonomy . "_" . $category->term_id);
} ?>
Dacă ai folosit setările implicite pentru ACF, ar trebui să obții un array din aceasta, care este obiectul imaginii, iar pentru asta, citește despre Tipurile de câmpuri Imagine din ACF.
Mi-a luat mai puțin de 5 minute să configurez asta, iar plugin-ul este gratuit. Sper că asta e suficient de rapid și ușor pentru tine!
Mult succes!

WordPress are codul - http://codex.wordpress.org/Function_Reference/get_the_category
Afișează imaginile categoriei
Acest cod afișează imaginile categoriilor denumite după cat_ID cu atributul alt setat la cat_name. De asemenea, poți folosi oricare dintre celelalte variabile membre.
<?php
foreach((get_the_category()) as $category) {
echo '<img src="http://example.com/images/' . $category->cat_ID . '.jpg" alt="' . $category->cat_name . '" />';
}
?>
Acest lucru permite configurarea imaginilor în cadrul funcțiilor get_categories. Imaginile trebuie configurate să corespundă funcției. Deci, dacă se folosește $category->name, imaginea trebuie salvată în directorul corect cu numele categoriei corespunzătoare.
