Combinando consultas com diferentes argumentos por tipo de postagem

11

Estou criando uma seção em um site onde estou mesclando dois diferentes tipos de post em um loop e exibindo-os aleatoriamente. O problema é que estou tendo dificuldades em encontrar uma maneira de limitar a quantidade de posts por tipo.

Veja o que tentei:

  • Uma consulta com vários tipos de postagem pode ser obtida com uma matriz:

    $args = array( 'post_type' => array( 'photos', 'quotes' ), ...
    

    ... mas não pode se limitar a um determinado número de postagens por tipo.

  • Mesclando duas matrizes de argumentos de consulta antes de executar WP_Query :

    $photos = array( 'post_type' => 'photos', 'posts_per_page' => 15, 'orderby' => 'rand' );
    $quotes = array( 'post_type' => 'quotes', 'posts_per_page' => 5, 'orderby' => 'rand' );
    
    $args = $photos + $quotes;
    // Also tried array_merge( $photos, $quotes );
    

    Sem sorte nisso. O que acontece é a última variável $quotes sobrescreve $photos e mostra apenas as aspas.

  • Mesclando dois objetos WP_Query juntos por meio de typecasting:

    $photos_query = new WP_Query( $photos );
    $quotes_query = new WP_Query( $quotes );
    $result = (object)array_merge( (array)$photos_query, (array)$quotes_query );
    

... e assim por diante.

Eu provavelmente poderia usar uma consulta SQL diretamente para o banco de dados, mas preciso para poder combinar esses dois tipos de postagem separados para um loop, organizados aleatoriamente E limitados a uma certa quantidade de posts por tipo.

Obrigado pela sua ajuda!

    
por Andy Merskin 05.11.2012 / 08:31

2 respostas

15

Uma maneira é personalizar a consulta SQL executada usando posts_clauses ou outros filtros desse tipo. Para encontrá-los, pesquise posts_clauses em "wp-includes / query.php" & veja a série de filtros logo antes desta linha. Estes juntos são capazes de personalizar qualquer parte da consulta

Outra coisa que você pode fazer é mesclar manualmente as postagens consultadas nos objetos

$photos_query = new WP_Query( $photos );
$quotes_query = new WP_Query( $quotes );
$result = new WP_Query();

// start putting the contents in the new object
$result->posts = array_merge( $photos_query->posts, $quotes_query->posts );

// here you might wanna apply some sort of sorting on $result->posts

// we also need to set post count correctly so as to enable the looping
$result->post_count = count( $result->posts );
    
por Mridul Aggarwal 05.11.2012 / 09:04
5

@midual aggarwal sua resposta é muito boa, mas infelizmente não é realmente combinando o 2 wp_query é apenas mostra as mensagens de ambos em arranjar quero dizer 5 posts do primeiro & 5 do segundo, mas não classificado em um só, então eu tenho essa solução & exatamente alcançou o objetivo para mim mesmo pelo menos

<?php
$term = get_term_by( 'slug', get_query_var( 'tag' ), "post_tag" );
$tagslug = $term->slug;
$post_types = get_post_types('','names');
?>
<?php
//first query
$blogposts = get_posts(array(
    'tag' => $tagslug, //first taxonomy
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
//second query
$authorposts = get_posts(array(
    'bookauthor' => $tagslug, //second taxonomy
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
$mergedposts = array_merge( $blogposts, $authorposts ); //combine queries

$postids = array();
foreach( $mergedposts as $item ) {
$postids[]=$item->ID; //create a new query only of the post ids
}
$uniqueposts = array_unique($postids); //remove duplicate post ids

$posts = get_posts(array(
        //new query of only the unique post ids on the merged queries from above
    'post__in' => $uniqueposts,  
    'post_type' => $post_types,
    'post_status' => 'publish',
    ));
foreach( $posts as $post ) :
setup_postdata($post);
?>
// posts layout
<?php endforeach; ?>
<?php wp_reset_postdata();?>
    
por adnan 28.10.2013 / 14:26