Ordenar postagens por post_type no modelo category.php

No meu modelo category.php eu quero ordenar as postagens da categoria pela sua dinâmica de tipos de publicação. Meu bloco deve ter essa estrutura

 Restaurant (custom post type) - posts Bars (custom post type) - posts Shops (custom post type) - posts 

Eu preciso saber em primeiro lugar, em que tipos de postagem são as postagens da categoria atual (algo como essa captura de canvas)

captura de tela

Este é um modelo de tema, eu não quero nenhuma consulta personalizada para publicação, então talvez use algum filtro ou algo assim

Solutions Collecting From Web of "Ordenar postagens por post_type no modelo category.php"

Supondo que a sua consulta tenha vários tipos de postagem, você deseja arrancá-los antes de continuar (suponho que você esteja usando $wp_query como seu object WP_Query):

 < ?php $all_post_types = array_map(function($item) { return $item->post_type; }, $wp_query->posts); // Now we get a unique list of post types: $unique_post_types = array_unique($all_post_types); // Use that unique list to drive multiple loops: foreach($unique_post_types as $grouping) { // Build our "title" for each group, using esc_html to sanitize echo sprintf("%s", esc_html($grouping)); //Start from the beginning of the list: rewind_posts(); while(have_posts()) { the_post(); if($post->post_type != $grouping) { // not a match for our current grouping? continue; } echo "

– " . get_the_title() . "

"; } } ?>

Primeiro, pego todos os tipos de postagem de $wp_query , cull para uma lista única, e use isso para executar o loop várias vezes (uma vez para cada tipo de publicação), onde apenas mostramos posts para esse tipo. Este é um exemplo rudimentar, e não lhe dará os nomes “amigáveis” dos seus tipos de publicação ou a saída exata que você provavelmente deseja, mas deve dar pelo menos uma estrutura esquelética em torno da qual for a sua produção.

AVISO PRÉVIO

A opção uma seção um é feita com a outra resposta em mente. A primeira seção é intercambiável e pode ser usada com a outra resposta ou minha abordagem na seção 2 da opção um. Você pode usar minha abordagem aqui ou a abordagem de @JustinBell. A seção importante aqui é a seção 1, que classifica seu loop de acordo com sua ordem predefinida de acordo com o tipo de publicação primeiro.

OPÇÃO 1

SEÇÃO 1

Esta é a seção importante, pois esta classifica as postagens de acordo com o tipo de publicação predefinido por você

Você pode fazer uso de usort para classificar suas postagens usando o the_posts . O código faz uso do seguinte

  • usort – Classificar uma matriz por valores usando uma function de comparação definida pelo usuário

  • the_posts filtro de filtros

  • is_main_query() – avalia se a consulta atual (como no loop) é a consulta principal

  • is_category() – verifica se uma página de arquivo de categoria está sendo exibida

O loop será ordenado primeiro por tipo de publicação, restaurant , depois por bars tipo de publicação, em seguida, shops postagem. O código também manterá postagens no mesmo tipo de publicação ordenadas por post_date

 add_filter( 'the_posts', function( $posts, $q ) { if( $q->is_main_query() && $q->is_category() ) { usort( $posts, function( $a, $b ){ $post_types = array ( 'restaurant' => 1, 'bars' => 2, 'shops' => 3 ); $posts = $post_types[$a->post_type] - $post_types[$b->post_type]; if ($posts === 0){ //same post_type, compare by post_date. return $a->post_date < $b->post_date; }else{ //different post_type, save to ignore the post_date. return $posts; } } ); } return $posts; }, 10, 2 ); 

SEÇÃO 2

Este é o seu loop. Como dito antes, a abordagem da outra resposta também funcionará perfeitamente aqui. Apenas para mostrar outra abordagem, fiz o seguinte

Em primeiro lugar, crie uma nova matriz chamada $posts_reordered . Os nomes dos tipos de postagem serão usados ​​como as chaves da matriz e todas as postagens com o mesmo tipo de publicação serão incluídas sob a respectiva chave. Esta nova matriz será usada para criar o loop. É assim que o loop se parece, isso irá na sua categoria.php. Você só precisa adicionar seu próprio mark-up html e modificar conforme necessário.

 < ?php $posts_reordered = []; foreach ( $posts as $post ) { $posts_reordered[$post->post_type][] = $post; } unset($post); foreach ( $posts_reordered as $key=>$value ) { echo '
    '; echo $key; foreach ( $value as $post ) { setup_postdata($post); ?>
  • < ?php the_title(); ?>
  • < ?php } unset($post); echo '
'; } // PLACE YOUR PAGINATION FUNCTION HERE ?>

Isso renderizará a saída a seguir ( event_type , post e cameras são meus tipos de publicação que estou testando e estão na posição ordenada que eu configurei com o código na seção um )

insira a descrição da imagem aqui

OPÇÃO 2

< --- SCRAPPED --->

O código original com loop_start não trouxe os resultados que eu estava procurando, talvez possa vê-lo novamente no futuro, mas acredito que a Opção Um seja o melhor, pois está funcionando como esperado