web-dev-qa-db-fra.com

Exclure post collant de la requête principale?

J'ai beaucoup de problèmes avec ça. J'utilisais <?php query_posts( array( 'post__not_in' => get_option( 'sticky_posts' ), 'paged' => get_query_var( 'paged' ) ) ); ?> pour exclure les publications de la requête principale de la page d'accueil, car des vignettes adhésives sont utilisées dans le curseur. Je fais ce thème pour wordpress.org et on m'a dit que ce n'était pas recommandé. J'ai ensuite essayé d'ajouter ceci à mon functions.php mais en vain:

/**
 * Excluding sticky posts from home page. Sticky posts are in a slider.
 *
 * @since 0.1
 */
function essential_exclude_sticky( $query ) {

    /* Exclude if is home and is main query. */
    if ( is_home() && $query->is_main_query() )
        $query->set( 'ignore_sticky_posts', true );

}

`

Une idée de ce que je fais mal?

5
Steven

query_posts n'est pas recommandé car son casse des choses .

Vous êtes vraiment proche, mais déclarer simplement que la fonction elle-même ne fonctionnera pas. Vous devez accrocher la fonction à quelque chose. Dans votre cas, ce serait pre_get_posts.

Exemple (avec la fonction "namespaced"):

<?php
// this is key!
add_action('pre_get_posts', 'wpse74620_ignore_sticky');
// the function that does the work
function wpse74620_ignore_sticky($query)
{
    // sure we're were we want to be.
    if (is_home() && $query->is_main_query())
        $query->set('ignore_sticky_posts', true);
}
5
chrisguitarguy

Pour moi, utiliser ignore_sticky_posts empêche les posts collants de s'afficher en haut, mais ils apparaissent toujours dans l'ordre chronologique des autres posts.

J'utilise post__not_in avec get_option('sticky_posts') pour exclure les posts collants de la requête principale.

<?php
/**
 * Exclude sticky posts from home page.
 */
function theme_name_ignore_sticky_posts($query){
  if (is_home() && $query->is_main_query())
    $query->set('post__not_in', get_option('sticky_posts'));
}
add_action('pre_get_posts', 'theme_name_ignore_sticky_posts');
?>
3
Nelu