it-swarm.com.de

Begrenzen Sie den Beitrag für verschiedene benutzerdefinierte Beitragstypen in derselben wp_query

Ich habe drei benutzerdefinierte Beitragstypen:

  • bücher
  • zeitschrift
  • videos

Jetzt möchte ich die Anzahl der Posts für den benutzerdefinierten Post-Typ begrenzen, zum Beispiel:

  • bücher => 3 Post
  • magazin => 2 post
  • videos => 1 Beitrag

Ich habe einen Abfrage-Post wie diesen verwendet:

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

Das Problem ist, dass ich die Anzahl nicht nach benutzerdefiniertem Beitragstyp begrenzen kann. Irgendeine Idee?

Vielen Dank :)

3
rodboc

Ich hasse es, zu schreiben, dass man das nicht kann, aber man kann es nicht. Das ist die strikte Antwort auf Ihre Frage, ob Sie dies mit einem einzigen WP_Query tun können. Sie können die Anzahl der Beitragstypen in derselben Abfrage nicht einzeln mit WP_Query begrenzen. (Sie verwenden tatsächlich query_posts . Bitte nicht. Es ist nicht das richtige Werkzeug für sekundäre Schleifen.)

Selbst in rohem SQL muss man separate Abfragen schreiben und UNION sie zusammen , so würde ich das angehen.

$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);

Führen Sie dann diesen $ids durch einen neuen WP_Query, um die Post-Objekte zu erhalten, die Sie für eine ordnungsgemäße Schleife benötigen.

Sie könnten sogar die SQL in ein Muster aufteilen und es wiederverwenden. So etwas wie...

$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).')';

Vorausgesetzt, ich habe keinen Fehler gemacht (der Code wurde nicht getestet), sollten Sie dann das haben, was Sie wollen - drei Beitragstypen mit jeweils einer bestimmten Anzahl. Sie werden möglicherweise nicht in der von Ihnen gewünschten Reihenfolge ausgegeben, sodass Sie sie möglicherweise in PHP sortieren oder eine noch schwierigere SQL-Abfrage erstellen müssen.

3
s_ha_dum

Sie können dies tun, indem Sie Abfragen zusammenführen:

$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