Snippets

Willy Bahuaud Améliorer la fonctionnalité des « contenus à la une » de WordPress / Improve WordPress “Sticky Posts” feature

You are viewing an old version of this snippet. View the current version.
Revised by Willy Bahuaud d5a0b0f
<?php

add_filter( 'query_vars', 'sticky_offset_query_var' );
function sticky_offset_query_var( $vars ) {
    $vars[] = 'ppp_include_sticky';
    return $vars;
}

add_filter( 'pre_get_posts', 'w_sticky_posts' );
function w_sticky_posts($q) {
    if ( is_home() ) {
        $q->set('ppp_include_sticky',true);
    }
    return $q;
}

add_filter( 'the_posts', 'sticky_count_offset', 10, 2 );
function sticky_count_offset( $posts, $q ) {
    if ( $q->get( 'ppp_include_sticky' )
      && 0 < $q->get( 'posts_per_page' )
      && false == $q->get( 'ignore_sticky_posts' ) ) {
        $posts = array_slice( $posts, 0, $q->get( 'posts_per_page' ) );
    }
    return $posts;
}

function is_paged_home_with_sticky( $q ) {
    return $q->is_home()
      && $q->get( 'ppp_include_sticky' )
      && $q->is_paged()
      && false == $q->get( 'ignore_sticky_posts' );
}

add_filter( 'pre_get_posts', 'sticky_count_on_paged', 20 );
function sticky_count_on_paged( $q ) {
    if ( is_paged_home_with_sticky( $q ) ) {
        $q->set('post__not_in', get_option( 'sticky_posts', array() ) );
        $offset = count( get_option( 'sticky_posts', array() ) );
        $page_offset = $q->get( 'posts_per_page', get_option( 'posts_per_page' ) ) * ( $q->get( 'paged' ) -1 ) - $offset;
        $q->set( 'offset', $page_offset );
    }
    return $q;
}

add_filter( 'found_posts', 'sticky_adjust_offset_pagination', 1, 2 );
function sticky_adjust_offset_pagination( $found_posts, $q ) {
    if ( is_paged_home_with_sticky( $q ) ) {
        $offset = count( get_option( 'sticky_posts', array() ) );
        return $found_posts + $offset;
    }
    return $found_posts;
}
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.