web-dev-qa-db-fra.com

Ajoutez quelques identifiants de poste spécifiques à wp_query

J'ai les arguments suivants pour obtenir les messages récents,

$args = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => 15,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'cat' => '-907,-908,-909'
);

Maintenant, j'ai besoin d'inclure quelques ID spécifiques à la même requête. Alors j'ai essayé de suivre, mais ça ne marche pas

$highlights = array('8308', '8315');

$args = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => 15,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'cat' => '-907,-908,-909',
    'post__in' => $highlights
);

Maintenant, il me donne juste ces deux postes.

2
Janith Chinthana

Voici une autre façon de le faire, spécialement si vous devez travailler avec l'objet de requête. Le problème avec la fusion de requêtes est que vous perdez l'exactitude de l'objet de requête.

Mon idée ici est d'exécuter deux requêtes distinctes, une très maigre pour obtenir l'ID de publication à partir de la requête date_query, puis en fusionnant les deux tableaux d'identificateurs de publication, puis en transmettant ces ID à la requête WP_Query appropriée.

( NOTE: Ce code nécessite au moins PHP 5.4 )

$highlights = [8308, 8315];

$args = [
    'date_query'          => [
        [
            'after'       => '1 week ago' 
        ]
    ],
    'posts_per_page'      => 13,
    'meta_key'            => 'post_views_count',
    'orderby'             => 'meta_value_num',
    'order'               => 'DESC',
    'cat'                 => '-907,-908,-909',
    'post__not_in'        => $highlights,
    'fields'              => 'ids' // ONLY GET POST ID's, VERY LEAN QUERY
];
$q = get_posts( $args );

$merged_ids = array_merge( $highlights, $q );

Notez maintenant que les points saillants sont devant la requête et que les publications de $ q sont classées par date. Si vous devez conserver cette commande, ajoutez simplement 'orderby' => 'post__in', aux arguments de la requête ci-dessous.

if ( $merged_ids ) {
    $args_final = [
        'post__in'            => $merged_ids,
        'posts_per_page'      => -1,
        'orderby'             => 'post__in',
        'ignore_sticky_posts' => 1
    ];
    $query_final = new WP_Query( $args_final );

    // Run your loop
}
4
Pieter Goosen

Je ne suis pas sûr, est-ce le meilleur moyen, mais je réussis à suivre le code.

$highlights = array('8308', '8315');

$args1 = array(
    'post__in' => $highlights
);

$args2 = array(
    'date_query' => array( array( 'after' => '1 week ago' ) ),  
    'posts_per_page' => 13,
    'ignore_sticky_posts' => 1,
    'meta_key' => 'post_views_count',
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'cat' => '-907,-908,-909',
    'post__not_in' => $highlights
);

$query1 = new WP_Query($args1);
$query2 = new WP_Query($args2);

$products = new WP_Query();
$products->posts = array_merge( $query1->posts, $query2->posts );
$products->post_count = $query1->post_count + $query2->post_count;

$products est le tableau final de publication.

2
Janith Chinthana