Tuesday, 2 October 2018

wordpress stciky post on archieve page with pagination

I have category page which is redirect to archieve.php.

you can see here : https://www.dealfinder.lk/category/dining/

There is two sticky post comes at top.

1) Up to 25% OFF at &Co Pub and Kitchen with COMBANK Cards

2) 20% OFF at Robata – Movenpick Hotel Colombo for all HSBC Credit Cards

My pagination is 10 per post

Right now, it shows me 12 posts.

Here is my code :

function yell_category_sticky_posts( $posts, $wp_query ) {

    global $wp_the_query;

    // Don't continue if this isn't a category query, we're not in the main query or we're in the admin
    if ( ! $wp_query->is_category || $wp_query !== $wp_the_query || is_admin() )
        return $posts;

    global $wpdb;

    $q = $wp_query->query_vars;

    $page = absint( $q['paged'] );

    if ( empty( $page ) )
        $page = 1;

    $post_type = $q['post_type'];

    $sticky_posts = get_option( 'sticky_posts' );

    if ( $wp_query->is_category && $page <= 1 && is_array( $sticky_posts ) && !empty( $sticky_posts ) && ! $q['ignore_sticky_posts'] ) {

        $num_posts = count( $posts );

        $sticky_offset = 0;

        // Loop over posts and relocate stickies to the front.
        for ( $i = 0; $i < $num_posts; $i++ ) {

            if ( in_array( $posts[$i]->ID, $sticky_posts ) ) {

                $sticky_post = $posts[$i];

                // Remove sticky from current position
                array_splice( $posts, $i, 1 );

                // Move to front, after other stickies
                array_splice( $posts, $sticky_offset, 0, array( $sticky_post ) );

                // Increment the sticky offset.  The next sticky will be placed at this offset.
                $sticky_offset++;

                // Remove post from sticky posts array
                $offset = array_search( $sticky_post->ID, $sticky_posts );
                unset( $sticky_posts[$offset] );

            }

        }

        // If any posts have been excluded specifically, Ignore those that are sticky.
        if ( !empty( $sticky_posts ) && !empty( $q['post__not_in'] ) )
            $sticky_posts = array_diff( $sticky_posts, $q['post__not_in'] );

        // Fetch sticky posts that weren't in the query results
        if ( !empty( $sticky_posts ) ) {

            $stickies__in = implode( ',', array_map( 'absint', $sticky_posts ));

            // honor post type(s) if not set to any
            $stickies_where = '';

            if ( 'any' != $post_type && '' != $post_type ) {

                if ( is_array( $post_type ) )
                    $post_types = join( "', '", $post_type );

                else
                    $post_types = $post_type;

                $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')";
            }

            $stickies = $wpdb->get_results( "SELECT wp_posts.* FROM $wpdb->posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( wp_term_relationships.term_taxonomy_id IN (" . get_term( $wp_query->query_vars['cat'], 'category' )->term_taxonomy_id . ") ) AND $wpdb->posts.ID IN ($stickies__in) $stickies_where" );

            foreach ( $stickies as $sticky_post ) {

                // Ignore sticky posts are not published.
                if ( 'publish' != $sticky_post->post_status )
                    continue;

                array_splice( $posts, $sticky_offset, 0, array( $sticky_post ) );

                $sticky_offset++;

            }
        }
    }

    return $posts;

}
add_filter( 'the_posts', 'yell_category_sticky_posts', 10, 2 );

My Issue:

I want to show 10 posts per page, currently it shows 12 posts per page with sticky post.

This question is for master not for new learner.

Anybody master here ? Thanks in advance



from wordpress stciky post on archieve page with pagination

No comments:

Post a Comment