Limite as categorias get_mostra para mostrar cada categoria uma vez

Estou tentando criar uma página inicial onde é uma lista de categorias com uma miniatura associada para cada uma. Eu gostaria que ele retornasse cada categoria uma vez e retorna a miniatura associada da última postagem, ou ainda melhor não exige que eu adicione uma imagem em destaque para cada publicação, mas sim pegue a miniatura da imagem da postagem, usando o tipo post_mime_type ? Eu ainda estou longe porque está retornando a categoria para cada publicação que está dentro dessa categoria e depois associando a imagem a todas as categorias.

Aqui está a function com a qual estou trabalhando:

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 '
  • term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . get_the_post_thumbnail($page->ID, 'thumbnail') . $category->name.'
  • '; } }

    A página inicial é simplesmente:

     

    O resultado é algo como:

      

    Alguém pode me ajudar a entender como retornar cada categoria apenas uma vez e include o polegar da última postagem nessa categoria? E ainda melhor alguém pode pensar em uma maneira de realizar isso sem ter que configurar a imagem de características de cada vez?

    Solutions Collecting From Web of "Limite as categorias get_mostra para mostrar cada categoria uma vez"

    Normalmente, eu gosto de esquecer de recomendar SQL direto, mas no seu caso de uso, acho que isso é garantido.

    Eu codifiquei isso como uma consulta SQL direta; como você pode notar é um pouco complexo. Você pode copiar o seguinte código para o arquivo functions.php do seu tema ou adicioná-lo ao arquivo .php de um plugin que você pode estar escrevendo:

     function home_cats($max_image_height=150){ $categories= get_taxonomy_latest_posts_with_attachment('category'); echo '

    Categories

    '; 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 = < < {$img_html}

    {$category->term_name}

    Latest post: $post_title


    HTML; echo $html; } } function get_taxonomy_latest_posts_with_attachment($taxonomy) { global $wpdb; $sql =< < {$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)); }

    Você notará que eu separei a lógica para que você possa obter a lista de quaisquer termos de taxonomia e suas postagens com uma foto chamando a function get_taxonomy_latest_posts_with_attachment() e passando-o um identificador de taxonomia, como este:

     $post_tags = get_taxonomy_latest_posts_with_attachment('post_tags'); 

    Por causa da complexidade do SQL nessa function, não vou tentar explicá-lo (ou estaria aqui a noite toda), mas se você tiver perguntas específicas de acompanhamento, basta perguntar. Enfim, aqui está o aspecto do código no lado do teste com os dados do teste:

    Captura de tela de um site WordPress com a lista de categorias e o último post para cada um

    PS As pessoas nas fotos são minhas minhas e todos trabalham com o WordPress de uma forma ou de outra. Espero que eles não se importem com a sua semelhança. 🙂

    Esse engate de gancho é meio confuso, por que não basta chamar home_cats() no modelo?

    Experimente isso (note que é consulta por categoria e pode ficar feio para desempenho):

     function home_cats() { $args = array( 'orderby' => 'name', 'order' => 'ASC', ); $categories = get_categories($args); echo '
      '; 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 "
    • {$thumbnail}{$category->name}
    • "; } echo '
    '; }

    Existem maneiras diferentes de extrair imagens, eu costumo ir com Get The Image .