web-dev-qa-db-fra.com

Limiter la publication pour différents types de publications personnalisées dans le même wp_query

J'ai trois types de messages personnalisés:

  • livres
  • magazine
  • vidéos

Maintenant, je veux limiter le nombre de messages pour le type de message personnalisé, par exemple:

  • livres => 3 post
  • magazine => 2 post
  • vidéos => 1 message

J'ai utilisé un post de requête comme ceci:

query_posts( array(
    'post_type' => array(
    'books',
    'magazine',
    'videos'
),
'paged' => $paged,
'posts_per_page' => 6, 
));
$counter = 1;
if (have_posts()) :
    while (have_posts()) : the_post();  
if (($counter == 2) || ($counter == 3) || ($counter == 4)) {
        $div = 'alpha';
    } elseif(($counter == 6)) {
        $div = 'omega';
    } else {
        $div = '';
    }

Le problème est que je ne peux pas limiter les nombres par type de message personnalisé. Une idée?

Je vous remercie :)

3
rodboc

Je déteste écrire "vous ne pouvez pas faire ça" répond, mais vous ne pouvez pas. Telle est la réponse stricte à votre question de savoir si vous pouvez le faire avec un seul WP_Query. Vous ne pouvez pas limiter le nombre de types d'articles de manière individuelle dans la même requête à l'aide de WP_Query (vous utilisez actuellement query_posts . Veuillez ne pas. Ce n'est pas le bon outil pour les boucles secondaires.)

Même en SQL brute, vous devez écrire des requêtes séparées et UNION ensemble , c'est ce que je ferais.

$sql = "(SELECT ID FROM {$wpdb->posts} WHERE post_type = 'books' AND post_status = 'publish' LIMIT 3)
UNION ALL
(SELECT ID FROM {$wpdb->posts} WHERE post_type = 'magazines' AND post_status = 'publish' LIMIT 2)
UNION ALL
(SELECT ID FROM {$wpdb->posts} WHERE post_type = 'videos' AND post_status = 'publish' LIMIT 1)";
// be sure to add any other conditions you need
$ids = $wpdb->get_col($sql);

Ensuite, exécutez ces $ids dans un nouveau WP_Query pour obtenir les objets de publication dont vous avez besoin pour une boucle appropriée.

Vous pouvez même décomposer le code SQL en un modèle et le réutiliser. Quelque chose comme...

$sqlpat = "(SELECT ID FROM {$wpdb->posts} WHERE post_type = '%s' AND post_status = 'publish' LIMIT %d)";
$sql = '('.sprintf($sqlpat,'books',3).') UNION ALL ('.sprintf($sqlpat,'magazines',2).') UNION ALL ('.sprintf($sqlpat,'videos',1).')';

En supposant que je n’ai pas fait d’erreur (le code n’est pas testé), vous devriez alors avoir ce que vous voulez - trois types d’envoi, chacun avec un compte particulier. Ils peuvent ne pas apparaître dans l'ordre que vous souhaitez, vous devrez donc peut-être les trier en PHP ou créer une requête SQL encore plus délicate.

3
s_ha_dum

Vous pouvez le faire en fusionnant des requêtes:

$q1 = get_posts(array(
    'post_type' => 'books',
    'posts_per_page' => 3
));

$q2 = get_posts(array(
    'post_type' => 'magazines',
    'posts_per_page' => 2
));

$q3 = get_posts(array(
    'post_type' => 'videos',
    'posts_per_page' => 1
));

$merged = array_merge( $q1, $q2, $q3 );

$post_ids = array();
foreach( $merged as $item ) {
    $post_ids[] = $item->ID;
}

$unique = array_unique($post_ids);

$args = array(
    'post_type' => array(
    'books',
    'magazine',
    'videos'
    ),
    'post__in' => $unique,
    'post_status' => 'publish',
    'posts_per_page' => 6
);

$the_query = new WP_Query( $args );

while ( $the_query->have_posts() ) : $the_query->the_post();
// post stuff here
endwhile;
1
luke