web-dev-qa-db-fra.com

wp_query pour le premier post-it, puis affiche le reste des posts à l'exclusion du premier post-it

Je lisais ceci par @nacin et découvrais wp_query au lieu de query_posts que j’avais l'habitude d'utiliser.

Ce que je veux c'est:

  1. mettre ceci dans un fichier template

  2. pour interroger tous les messages de cette catégorie, dans le cas présent '3'

  3. pour afficher, le cas échéant, le premier résultat sur la page, le dernier post collant

  4. après le premier post-it, s'il y en a un, affiche le reste des posts en excluant ce post-it s'il a été mis

Les problèmes que j'ai vus sont les suivants: - si je fais posts_per_page = 1 sur la boucle collante, je ne peux pas faire posts_per_page = -1 sur le reste de la boucle de publications. Pour résoudre ce problème, je viens de définir le nombre à 999.

Je devrais dire maintenant que le code que j'ai fonctionne . Cependant, c'est pour un site à très fort trafic, et je veux m'assurer que c'est la meilleure façon de le faire, et je ne suis pas sûr d'utiliser wp_query comme il convient pour le faire car les requêtes d'origine sont essentiellement les mêmes. un autre avec et sans poteaux collants.

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; 

Merci pour toute aide les gars.

1
davebowker

vous pouvez utiliser wp_list_pluck();

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

Voici le moyen très simple de le faire.

$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();
  • Pas besoin d'utiliser global $wp_query; surtout 2x.
  • Pas besoin de faire écho aux balises br ... plusieurs fois si vous utilisez la <?php post_class(); Utilisez CSS, de cette façon vous obtiendrez automatiquement une classe appelée .sticky!
  • Utilisez un meilleur nom pour votre requête.

Voici une mise à jour utilisant 2 requêtes pour adresser les détails que j'ai manqués, car ce sera assez sûr.

// **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

Je vois 2 problèmes majeurs. a) Vous ne devriez pas modifier directement une variable globale & b) Vous ne devriez pas utiliser query_posts. Voici un exemple retravaillé

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

}

dans le fichier modèle

$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