it-swarm.com.de

wp_query für den ersten Sticky, dann den Rest der Posts ohne den ersten Sticky anzeigen

Ich habe dies von @nacin gelesen und mich mit wp_query über query_posts beschäftigt, die ich früher verwendet habe.

Was ich will ist:

  1. um dies in eine Vorlagendatei zu schreiben

  2. um alle Beiträge dieser Kategorie abzufragen, in diesem Fall '3'

  3. um, falls verfügbar, das erste Ergebnis auf der Seite des letzten Kurzbeitrags anzuzeigen

  4. zeigen Sie nach dem ersten Sticky, falls einer festgelegt ist, den Rest der Posts an, mit Ausnahme des Sticky, falls dieser festgelegt wurde

Probleme, die ich gesehen habe, sind: - Wenn ich posts_per_page = 1 in der Sticky-Schleife mache, kann ich posts_per_page = -1 in der restlichen Post-Schleife nicht machen. Um dies zu umgehen, habe ich die Nummer auf 999 gesetzt.

Ich sollte jetzt sagen, dass der Code, den ich habe funktioniert . Dies ist jedoch eine Website mit sehr hohem Datenverkehr. Ich möchte sicherstellen, dass dies der beste Weg ist, und ich bin nicht sicher, ob ich wp_query richtig verwende, um dies zu tun, da die ursprünglichen Abfragen im Wesentlichen dieselben sind ein anderer nur mit und ohne klebrige Pfosten.

global $wp_query;
$wp_query = new WP_Query(array(
    'post_type' => 'post',
    'posts_per_page' => 1,
    'category__in' => 3,
    'post__in'  => get_option( 'sticky_posts' )
));
while ($wp_query->have_posts()) : $wp_query->the_post();
    $exclude_featured = $post->ID;
    echo the_title();
    echo '<br />';
endwhile; 

echo '<br />';
echo '<br />';

global $wp_query;
$args = array_merge(
    $wp_query->query_vars,
    array(
        'post__in' => null,
        'posts_per_page' => 999,
        'ignore_sticky_posts' => 1,
        'post__not_in' => array($exclude_featured)
    )
);
query_posts( $args );
while ($wp_query->have_posts()) : $wp_query->the_post(); 
    if ( $exclude_featured == get_the_ID() )
        continue;
        echo the_title();
        echo '<br />';
endwhile; 

Vielen Dank für jede Hilfe Jungs.

1
davebowker

du könntest wp_list_pluck(); benutzen

if ( $exclude_featured )
    $args['post__not_in'] = wp_list_pluck( $exclude_featured->posts, 'ID' );
    $args['posts_per_page'] = 999;
    query_posts( $args );
endif;
while ( have_posts() ) : the_post();
...
1
mirage

Hier ist der wirklich einfache Weg, es zu tun.

$args = array(
          'posts_per_page' => -1,
          'category__in' => 3,
          'ignore_sticky_posts' => 0
       );

$my_custom_query = new WP_Query( $args );

while ( $my_custom_query->have_posts() ) :$my_custom_query->the_post();

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
//Your Stuff

endwhile;

// Reset Post Data
wp_reset_postdata();
  • global $wp_query; muss nicht verwendet werden, insbesondere 2x.
  • br Tags müssen nicht wiederholt werden ... wenn Sie die <?php post_class(); verwenden, verwenden Sie CSS. Auf diese Weise erhalten Sie automatisch eine Klasse mit dem Namen .sticky!
  • Verwenden Sie einen besseren Namen für Ihre Abfrage.

Hier ist ein Update mit 2 Abfragen, um die Details zu beheben, die ich verpasst habe, da es etwas sicherer sein wird.

// **Loop 1** get the first sticky only 

$sticky = get_option( 'sticky_posts' );

$the_query = new WP_Query( 'p=' . $sticky[0]);

while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

// your content

<?php endwhile; wp_reset_postdata(); ?>

//////////////
//**Loop 2** exclude the sticky from the Loop 1

$args = array(
        'posts_per_page' => -1,
        'ignore_sticky_posts' => 1,
        'post__not_in' => array($sticky[0])

);

$super_query = new WP_Query($args);

while ( $super_query->have_posts() ) : $super_query->the_post(); ?>

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

// your content

<?php endwhile; wp_reset_postdata(); ?>
2
Wyck

Ich sehe 2 Hauptprobleme. a) Sie sollten eine globale Variable nicht direkt ändern & b) Sie sollten query_posts nicht verwenden. Hier ist ein überarbeitetes Beispiel

functions.php

add_action('pre_get_posts', 'customize_query');
function customize_query($query) {
    if(!$query->is_main_query() || !is_page_template('template-file-name.php'))
        return;

    $wp_query = new WP_Query(array(
        'post_type' => 'post',
        'posts_per_page' => 1,
        'category__in' => 3,
        'post__in'  => get_option( 'sticky_posts' )
    ));

    $query->set('posts_per_page', -1);
    $query->set('ignore_sticky_posts', 1);
    if(!empty($wp_query->posts))
        $query->set('post__not_in', array($wp_query->posts[0]->ID));

}

in der Vorlagendatei

$query = new WP_Query(array(
    'post_type' => 'post',
    'posts_per_page' => 1,
    'category__in' => 3,
    'post__in'  => get_option( 'sticky_posts' )
));
while ($query->have_posts()) : $query->the_post();
    echo the_title();
    echo '<br />';
endwhile; 

echo '<br />';
echo '<br />';

while (have_posts()) : the_post(); 
        echo the_title();
        echo '<br />';
endwhile;
1
Mridul Aggarwal