Frage

Ich versuche eine Homepage zu erstellen, auf der es eine Liste von Kategorien mit einem zugehörigen Miniaturbild für jeden ist. Ich würde es mögen, damit es jede Kategorie einmal zurückgibt und das zugehörige Miniaturbild aus dem neuesten Beitrag zurückgibt, oder es erfordert nicht, dass ich jedem Beitrag ein vorgezogenes Bild hinzufügt, sondern den Miniaturbild aus dem Bild des Beitrags mit post_mime_type greift ? Ich bin immer noch weit entfernt, da sie die Kategorie für jeden Beitrag in dieser Kategorie zurückgibt und das Bild dann mit jeder Kategorie verknüpft.

Hier ist die Funktion, mit der ich arbeite:

    function home_filter() {
        if ( is_home() )
        {
        add_filter( 'the_content', 'home_cats' );
        }
    }
    add_action('template_redirect', 'home_filter');
    function home_cats(){
        $args=array(
        'orderby' => 'name',
        'order' => 'ASC',
        );
        $categories=get_categories($args);
           foreach($categories as $category) { 
   echo '<li><a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . get_the_post_thumbnail($page->ID, 'thumbnail') . $category->name.'</a></li> ';
        } 
}

Die Startseite ist einfach:

<ul>
<?php while ( have_posts() ) : the_post(); ?>
<?php the_content();?>
<?php endwhile; ?>
</ul>

Die Ausgabe ist so etwas wie:

<ul>
<li><a href="../?cat=1" title="View all posts in Cat A" ><img src="..image-A.jpg"  />Cat A</a></li> 
<li><a href="../?cat=3" title="View all posts in Cat B" ><img src="..image-A.jpg"  />Cat B</a></li> 
<li><a href="../?cat=1" title="View all posts in Cat A" ><img src="..image-B.jpg"  />Cat A</a></li> 
<li><a href="../?cat=3" title="View all posts in Cat B" ><img src="..image-B.jpg"  />Cat B</a></li>
<li><a href="../?cat=1" title="View all posts in Cat A" ><img src="..image-C.jpg"  />Cat A</a></li> 
<li><a href="../?cat=3" title="View all posts in Cat B" ><img src="..image-C.jpg"  />Cat B</a></li> 
 </ul>

Kann mir bitte jemand helfen Und noch besser kann jemand über eine Möglichkeit nachdenken, dies zu erreichen, ohne jedes Mal das Feature -Bild festlegen zu müssen?

War es hilfreich?

Lösung

Normalerweise Ich mag es, direkte SQL zu empfehlen, aber in Ihrem Anwendungsfall denke ich, dass dies gerechtfertigt ist.

Ich habe dies als direkte SQL -Abfrage codiert. Wie Sie vielleicht bemerken, ist etwas komplex. Sie können den folgenden Code in Ihr Thema kopieren functions.php Datei oder fügen Sie es dem hinzu .php Datei eines Plugins, die Sie möglicherweise schreiben:

function home_cats($max_image_height=150){
  $categories= get_taxonomy_latest_posts_with_attachment('category');
  echo '<h1>Categories</h1>';
  foreach($categories as $category) {
    $category_link = get_category_link( $category->term_id );
    $category_title = sprintf( __( "View all posts with category: '%s'" ),$category->term_name );
    $post_title = get_the_title($category->post_id);
    $post_link = get_permalink($category->post_id);
    $img_html = wp_get_attachment_image( $category->attachment_id, array( 'thumbnail',$max_image_height ) );
    $html = <<<HTML
<div id="category-{$category->term_slug}" class="category">
  <span style="float:right;">{$img_html}</span>
  <span  style="float:left;">
    <h2><a href="{$category_link}" title="{$category_title}">{$category->term_name}</a></h2>
    <p style="float:left;">Latest post: <a href="{$post_link}" title="{$post_title}">$post_title</a></p>
  </span>
</div>
<br clear="both" />
HTML;
    echo $html;
  }
}
function get_taxonomy_latest_posts_with_attachment($taxonomy) {
    global $wpdb;
    $sql =<<<SQL
SELECT
  categorized_posts.rownum,
  categorized_posts.term_id,
  categorized_posts.term_name,
  categorized_posts.term_slug,
  categorized_posts.post_id,
  categorized_posts.post_date,
  categorized_posts.post_title,
  attachments.ID AS attachment_id,
  attachments.post_title AS attachment_title,
  attachments.post_mime_type AS attachment_mime_type,
  attachments.guid AS attachment_guid
FROM
  (
  SELECT
    rownum,
    term_id,
    term_name,
    term_slug,
    post_id,
    post_date,
    post_title,
    post_parent,
    post_name,
    post_type
  FROM (
    SELECT
      IF( @prev <> {$wpdb->terms}.term_id, @rownum := 1, @rownum := @rownum+1 ) AS rownum,
      @prev := {$wpdb->terms}.term_id,
      {$wpdb->terms}.term_id,
      {$wpdb->terms}.name AS term_name,
      {$wpdb->terms}.slug AS term_slug,
      {$wpdb->posts}.ID as post_id,
      {$wpdb->posts}.post_date,
      {$wpdb->posts}.post_title,
      {$wpdb->posts}.post_parent,
      {$wpdb->posts}.post_name,
      {$wpdb->posts}.post_type
    FROM
      {$wpdb->term_taxonomy}
      INNER JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id={$wpdb->terms}.term_id
      INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.term_taxonomy_id={$wpdb->term_taxonomy}.term_taxonomy_id
      INNER JOIN {$wpdb->posts} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
      INNER JOIN (SELECT @rownum := NULL, @prev := 0) AS rownum_initializer ON 1=1
    WHERE 1=1
      AND {$wpdb->posts}.post_type='post'
      AND {$wpdb->posts}.post_status='publish'
      AND {$wpdb->term_taxonomy}.taxonomy='%s'
    ORDER BY {$wpdb->posts}.post_parent DESC, {$wpdb->posts}.post_date DESC
    ) x
  ) categorized_posts
    INNER JOIN (SELECT MAX(ID) AS post_id,post_parent FROM {$wpdb->posts} WHERE post_type='attachment' GROUP BY post_parent) attachment_join ON attachment_join.post_parent=categorized_posts.post_id
    INNER JOIN {$wpdb->posts} attachments ON attachments.ID=attachment_join.post_id
WHERE
  categorized_posts.rownum=1
GROUP BY
  categorized_posts.term_id
ORDER BY
  categorized_posts.term_name
SQL;
  return $wpdb->get_results($wpdb->prepare($sql,$taxonomy));
}

Sie werden feststellen, dass ich die Logik getrennt habe, damit Sie die Liste der Taxonomie und der neuesten Beiträge mit einem Foto erhalten, indem Sie die Anrufe der Taxonomie und ihrer neuesten Beiträge erhalten get_taxonomy_latest_posts_with_attachment() Funktion und übergeben es eine Taxonomie -Kennung wie folgt:

$post_tags = get_taxonomy_latest_posts_with_attachment('post_tags');

Aufgrund der Komplexität der SQL in dieser Funktion werde ich nicht versuchen, es zu erklären (oder ich wäre die ganze Nacht hier) Wenn Sie jedoch spezielle Follow -up -Fragen haben, stellen Sie einfach. Wie auch immer, so sieht der Code auf meiner Testseite mit Testdaten aus:

Screenshot of a WordPress site with the list of Categories and the Latest Post for Each
(Quelle: mikeschinkel.com)

PS Die Leute auf den Fotos sind Freunde von mir und alle arbeiten auf die eine oder andere Weise mit WordPress. Ich hoffe, es macht ihnen nichts aus, dass ich ihre Ähnlichkeit benutze. :)

Andere Tipps

Dieser Haken -Gerät ist ein bisschen chaotisch, warum nicht einfach anrufen home_cats() in der Vorlage?

Versuchen Sie dies (beachten Sie, dass es sich um eine Abfrage pro Kategorie handelt und für die Leistung hässlich werden kann):

function home_cats() {

    $args = array(
        'orderby' => 'name',
        'order' => 'ASC',
    );
    $categories = get_categories($args);

    echo '<ul>';

    foreach ( $categories as $category ) {

        $link = get_category_link($category->term_id);
        $title = sprintf(__("View all posts in %s"), $category->name);

        $posts = get_posts( array(
            'cat' => $category->term_id,
            'numberposts' => 1,
        ) );

        $post = $posts[0];

        $thumbnail =  get_the_post_thumbnail($post->ID);
        echo "<li><a href='{$link}' title='{$title}'>{$thumbnail}{$category->name}</a></li>";
    }

    echo '</ul>';
}

Es gibt verschiedene Möglichkeiten, für Bilder zu meinen, ich gehe normalerweise mit Holen Sie sich das Bild.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top