it-swarm.com.de

Zeigen Sie mit get_categories ein Bild für eine Kategorie an oder zeigen Sie ein Bild aus einem beliebigen untergeordneten Beitrag an

Ich verwende get_categories, um die untergeordneten Kategorien einer übergeordneten Kategorie aufzulisten.

Ich möchte den untergeordneten Kategorien mithilfe der Ausgabe get_categories ein Bild hinzufügen.

  • Ich kann entweder das vorgestellte Bild von jedem der Beiträge nehmen, die Kinder der Kategorie sind, für die ich get_categories verwende, IE das Enkelkind der Elternkategorie. Ich möchte keine weiteren Informationen zu Enkelkindern anzeigen und möchte nur ein Bild von jedem Satz von Kindern aus der Kategorie.

Der Code, den ich derzeit benutze, ist

$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;
     } 
  • Oder ich könnte mit einem Plugin ein Bild zu einer Kategorie hinzufügen und es in der Ausgabe von foreach($categories as $category) anzeigen.

Aber wie lässt sich das am besten (und einfachsten) umsetzen?

3
Jon

Dies ist mit einem Filter für get_terms möglich.

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);

Dort gibt es mehrere Abfragen. Fügen Sie diesen Filter also nur dann hinzu, wenn Sie ihn benötigen, und entfernen Sie den Filter anschließend.

Es gibt eine Reihe verwandter Bildfunktionen die Sie stattdessen verwenden können, wenn wp_get_attachment_image() nicht Ihren Anforderungen entspricht, und Sie können einen $size-Parameter an wp_get_attachment_image()-- second parameter-- übergeben, um unterschiedliche Bildgrößen zu erhalten. Ersetzen Sie beispielsweise die Codezeile durch Folgendes:

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

Sie können die Ausgabe von wp_get_attachment_image() weiter ändern, indem Sie einen Filter auf wp_get_attachment_image_attributes anwenden, um beispielsweise eine Klasse wie hier hinzuzufügen.

4
s_ha_dum

Anstatt get_categories() zu verwenden, schlage ich vor, dass Sie sich wp_list_categories() ansehen. Sie können dieselbe Ausgabe damit erhalten, aber es hat den Vorteil, dass es hochgradig anpassbar ist.

Es gibt zwei Möglichkeiten zur Anpassung, entweder über den Filter-Hook wp_list_categories - siehe in source - oder durch Erweitern des Walker_Category class - siehe in source . Letzteres bietet Ihnen viel mehr Möglichkeiten zum Anpassen, ist jedoch möglicherweise bei geringfügigen Änderungen übertrieben. Sie müssen also abschätzen, was Ihren Anforderungen am besten entspricht.

Da dieses Thema in WPSE und SO eigentlich ziemlich gut behandelt wird, gebe ich Ihnen nur eine kurze Liste mit Referenzen. Abgesehen davon, dass Sie nicht genau genug Ihre Bedürfnisse beschrieben haben, bleibt es ein bisschen vage, obwohl man wissen kann, was Sie wollen. Auf jeden Fall sollten die unten aufgeführten Ressourcen Ihnen bei der Auswahl der für Sie geeigneten Methode helfen und Sie sollten darüber hinaus in die Lage versetzen, diese zu erreichen.

  1. filter Hook wp_list_categories
  2. Walker_Category class

Noch eine Bemerkung: Ich persönlich würde mich fast immer für die Erweiterung der Klassenmethode Walker_Category entscheiden, aber für Fälle, in denen die von Ihnen gewünschte Änderung sehr gering ist. Dies ist natürlich eine persönliche Präferenz, hat aber einige Hintergründe, insbesondere aufgrund der Wiederverwendbarkeit, Erweiterbarkeit und - auch wenn es nicht notwendig erscheint - ist es doch oft - vielleicht sogar die meiste Zeit - die einfacher Weg, um die benutzerdefinierte Ausgabe zu erreichen.


Thumbnail vom Beitrag in der Kindkategorie:

Auf diese Weise können Sie Ihre "Kategorie-Miniaturansicht" aus einem zufälligen Beitrag abrufen, der zu einer der untergeordneten Kategorien gehört.

Ich habe den Code kommentiert, um Ihnen verständlich zu machen, wie das gemacht wird, außerdem sollte er ziemlich selbsterklärend sein.

/**
 * 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 );
}

Verwendung wie folgt:

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

In Ihrem Code verwenden Sie es wie unten gezeigt:

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



Kategorie Thumbnail über Plugin:

Dies hat den Vorteil, dass die Miniaturansichten der Kategorien aktuell sind.

Ich habe dem Plugin - Kategorie Thumbnails -, das ich im Kommentar oben erwähnt habe, einen Schnelltest gegeben. Es funktioniert im Allgemeinen und ist meiner Meinung nach eine bessere Lösung als das, was Sie in Ihrer Antwort vorschlagen, da Sie die Miniaturansichten über die WordPress-Medienbibliothek verwalten können.

Ich habe einen kleinen Fehler entdeckt, der Autor des Plugins wurde benachrichtigt und hat sofort geantwortet, daher wird der Fehler bald behoben. Wenn Sie nicht warten können, können Sie es wie folgt selbst beheben:

Jedoch die funktion

the_category_thumbnail();

erzeugt keine Ausgabe. so sieht es im quellcode der version 1.0.3 aus:

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

Ich konnte das Problem folgendermaßen beheben:

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

Also, indem Sie den Namen des Parameters/Arguments gleich machen.

Oder du verwendest stattdessen einfach get_the_category_thumbnail(), du musst es einfach echo:

echo get_the_category_thumbnail('1');

Eine weitere kleine Enttäuschung ist, dass das Plugin und die Funktionen, die es bietet, Ihnen nicht die Möglichkeit geben, mit den generierten Bildgrößen zu arbeiten. Was nicht so gut ist, weil wir die richtige Größe und nicht immer die volle Größe wollen. Ich werde den Autor auch darüber informieren, damit er sein Plugin weiter verbessern kann. In der Zwischenzeit kann dies zum Glück einfach behoben werden, indem eine benutzerdefinierte Funktion erstellt wird:

/**
 * 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 );
}

Verwendung wie folgt:

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

Dies sollte Ihnen helfen, dies zum Laufen zu bringen. Wie ich bereits sagte, ist es vorzuziehen, weil Sie Ihre Kategorie-Miniaturansicht über die Medienbibliothek verwalten können. In Ihrem Code verwenden Sie es wie unten gezeigt:

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

Nun, ich habe es geschafft, mit Advanced Custom Fields das zu tun, was ich glaube, und mit einem image custom field einen neuen Satz von benutzerdefinierten Feldern zu erstellen. Setzen Sie die Regeln vor Ort auf "Taxonomiebegriff"> "ist gleich"> "Kategorien" (oder für welche Taxonomie Sie dies auch immer verwendet haben).

Sobald Sie dies veröffentlichen, sollte es aktualisiert werden, wo Sie die Taxonomien mit einem neuen Feld für ein Bild bearbeiten. Jetzt müssen Sie nur noch die ACF-Funktion "get_field ()" in Ihrer foreach-Schleife der Kategorie verwenden. Hier ist, wie Sie Feld aus der Kategorie bekommen.

Beispiel:

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

Wenn Sie die Standardeinstellungen für ACF verwendet haben, sollten Sie ein Array aus diesem, dem Bildobjekt, abrufen und dazu Bildfeldtypen von ACF nachlesen.

Ich habe <5 Minuten gebraucht, um das einzurichten, und das Plugin ist kostenlos. Ich hoffe, das geht schnell und einfach für Sie!

Viel Glück!

1
socki03

Wordpress hat den 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 . '" />'; 
} 
?>

Dies ermöglicht das Einrichten von Bildern innerhalb einer get_categories-Funktion. Die Bilder müssen entsprechend der Funktion eingerichtet werden. Wenn also $ category-> name verwendet wird, muss das Bild im richtigen Ordner mit dem passenden Namen der Kategorie gespeichert werden.

0
Jon