Multiple post query with pagination in shortcode - wordpress

I want to multiple query with pagination of post type POST. I write code but it don't return right post when click for 2nd page or 3rd page. May be pagination is working properly or other errors. I want to multiple query with pagination of post type POST. I write code but it don't return right post when click for 2nd page or 3rd page. May be pagination is working properly or other errors. I can't find it.
function blogpost_shortcode($atts, $content = null){
extract( shortcode_atts( array(
'count' => '1',
), $atts) );
$page = get_query_var('page');
$q1 = new WP_Query( array(
'posts_per_page' => $count,
'post_type' => 'post',
'paged' => get_query_var('page')
) );
$q1_ids = wp_list_pluck( $q1->posts, 'ID' );
$q2 = new WP_Query(array('posts_per_page' => $count, 'post_type' => 'post', 'paged' => get_query_var('page'), 'post__not_in' => $q1_ids));
$blog_markup = '';
$blog_markup .= '
<div class="bwog_blog_wrap">';
while($q1->have_posts()) : $q1->the_post();
$idd = get_the_ID();
$blog_markup .= '
<div class="single_blog_wrap">
<h3>'.get_the_title($idd).'</h3>
</div>
';
endwhile;
while($q2->have_posts()) : $q2->the_post();
$idd = get_the_ID();
$blog_markup .= '
<div class="single_blog_wrap">
<h3>'.get_the_title($idd).'</h3>
</div>
';
endwhile;
$total_pages = $q1->max_num_pages;
$big = 999999999;
if ($total_pages > 1){
$current_page = max(1, get_query_var('page'));
$blog_markup.= '<nav class="page-nav">';
$blog_markup.= paginate_links(array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => $current_page,
'total' => $total_pages,
'prev_text' => 'Prev',
'next_text' => 'Next'
));
$blog_markup.= '</nav>';
}
$blog_markup .= '</div>';
wp_reset_query();
return $blog_markup;
}
add_shortcode('bwog_blog', 'blogpost_shortcode');

It looks like you are checking for the query variable page, but in the pagination code you are setting the format to ?paged=%#%. You'll want to make sure you are using the same query variable everywhere, so you should set the format to ?page=%#%.
Also, unrelated to the answer but something I noticed, you set the variable $page to get_query_var('page'), but then never use it. I would recommend using it everywhere you have get_query_var('page') to make it your code more efficient and maintainable.

Related

Pagination through shortcode (custom post type) returns the same result in every page

The problem I'm having is that pagination (which I'm running through a shortcode) is not working as expected. In every paginated page, the results are the same. I've found similar questions about problems such as this one but none of the suggestions I've tried seem to work.
Pagination is showing up correctly, page count is correct and the URL is changing as expected when changing the page but the returned items are always the same in every page.
My current code:
function shortcode_paginated_list() {
$args = array(
'post_type' => 'my_custom_post_type',
'posts_per_page' => '2',
'publish_status' => 'published',
'paged' => '<li>'.( get_query_var('paged') ? get_query_var('paged') : 1).'</li>'
);
$wp_query = new WP_Query($args);
if($wp_query->have_posts()) :
while($wp_query->have_posts()) : $wp_query->the_post();
$result = 'fetching some stuff';
endwhile;
endif;
$big = 999999999; // need an unlikely integer
$paginate = paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'prev_text' => __('<i class="fas fa-angle-left"></i>'),
'next_text' => __('<i class="fas fa-angle-right"></i>'),
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'type' => 'list'
) );
$result .= '<div class="blog-nav">' . str_replace( "<ul class='page-numbers'>", '<ul class="pagination">', $paginate ) . '</div>';
wp_reset_postdata();
return $result;
}
add_shortcode( 'paginated-list', 'shortcode_paginated_list' );
Any help would be greatly appreciated, thanks.
For anyone that might stumble upon this, this seems to be working as expected for some reason:
$the_query =
new WP_Query( array(
'post_type'=>'my_custom_post_type',
'posts_per_page' => '2',
'publish_status' => 'published',
'paged' => get_query_var('paged') ? get_query_var('paged') : 1)
);
while ($the_query -> have_posts()) : $the_query -> the_post();
$result = 'fetching some stuff';
endwhile;
$big = 999999999; // need an unlikely integer
$paginate = paginate_links( array(
'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
'format' => '?paged=%#%',
'prev_text' => __('<i class="fas fa-angle-left"></i>'),
'next_text' => __('<i class="fas fa-angle-right"></i>'),
'current' => max( 1, get_query_var('paged') ),
'total' => $the_query->max_num_pages,
'type' => 'list'
));
$result .= '<div class="blog-nav">' . str_replace( "<ul class='page-numbers'>", '<ul class="pagination">', $paginate ) . '</div>';
wp_reset_postdata();
return $result;

wordpress pagination ads extra slashes to url

Working with custom post types I cant seem to get the pagination to work correct. All is working but when I click to the next page the url will get a extra slash in the url, not sure why this is happening but when using the pagination a lot will add every time a new slash to the url.
// out
site.com/projects/ ,
site.com/projects//page/2,
site.com/projects///page/3,
site.com/projects////page/4
...and so on.
// the code used
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new WP_Query( array(
'post_type' => 'projects',
'posts_per_page' => 5,
'paged' => $paged
) );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
the_title();
endwhile;
$total_pages = $query->max_num_pages;
if ($total_pages > 1){
$current_page = max(1, get_query_var('paged'));
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => '/page/%#%',
'current' => $current_page,
'total' => $total_pages,
'prev_text' => esc_html__('volgende »', 'infrafocus'),
'next_text' => esc_html__('« vorige' , 'infrafocus'),
));
}
}
wp_reset_postdata();
endif;
Sometimes in the case of Custom post type pagination, you have to add the rewrite rule in your function.php
Add Function like:
function custom_rewrite_basic() {
add_rewrite_rule('^leaf/([0-9]+)/?', 'index.php/projects?page=$matches[1]', 'top');
}
add_action('init', 'custom_rewrite_basic');
Please Refer this link for more information : https://codex.wordpress.org/Rewrite_API/add_rewrite_rule
Try changing 'format' => '/page/%#%', to 'format' => 'page/%#%',
User format as below
'format' => '?paged=%#%'
https://codex.wordpress.org/Function_Reference/paginate_links

Why is my pagination for custom post type not working?

Here is the code I'm using to display the pagination...
<?php
global $wp_query;
$big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages
) );
?>
But when you click next and got to /page/2/ it says "Page Not Found"
what am I doing wrong???
The code above is not working because it is not set for a custom post type.
If you look in the wordpress codex for paginate_links you will find your code under the
Basic Example
To add pagination to your search results and archives, you can use the following example
and is not working for your query because you have different query_vars, the code you should work with should be from the same codex page:
Example With a Custom Query
When querying a loop with new WP_Query set the 'total' parameter to the max_num_pages property of the WP_Query object.
with the query beeing:
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
'posts_per_page' => 5,
'category_name' => 'gallery',
'paged' => $paged,
);
$the_query = new WP_Query( $args );
?>
<!-- the loop etc.. -->
and the pagination code:
<?php
$big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $the_query->max_num_pages
) );
?>
When working with pagination "Page not found" errors usually are caused by missuning the query vars.

WordPress pagination showing extra blank page after filtering past events

I have a list of events that are displaying in date order, with events in the past being hidden.
The issue is that in total, there are 3 pages of events, but once the past events are hidden, there are only enough events to fill 2 pages. However, a third, blank page is still present and can be accessed through the paging links.
This is the code on my events list page:
<?php $today = date("Ymd");?>
<?php $paged = 1;
if ( get_query_var('paged') ) $paged = get_query_var('paged');
if ( get_query_var('page') ) $paged = get_query_var('page');
query_posts( '&post_type=upcomingevents&paged=' . $paged );?>
<?php $loop = new WP_Query( array( 'post_type' => 'upcomingevents', 'paged'=> $paged, 'meta_key' => 'start_date', 'meta_compare' => '>=', 'meta_value' => $today, 'orderby' => 'meta_value_num', 'order' => 'ASC' )); ?>
<?php while ( $loop->have_posts('post_type=upcomingevents') ) : $loop->the_post(); ?>
And this is the paging code in my functions file:
function paginate() {
global $wp_query, $wp_rewrite;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
$pagination = array(
'base' => #add_query_arg('page','%#%'),
'format' => '',
'total' => $wp_query->max_num_pages,
'current' => $current,
'show_all' => true,
'type' => 'plain'
);
if ( $wp_rewrite->using_permalinks() ) $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );
if ( !empty($wp_query->query_vars['s']) ) $pagination['add_args'] = array( 's' => get_query_var( 's' ) );
echo paginate_links( $pagination );
}
I have also discovered a second issue, when moving to page 2 or 3 of results, the CSS class of current remains on the number 1 within the paging, so impossible to tell which page you are on.
Any suggestions would be greatly appreciated, many thanks.
$paged value is 0 on 1st page so edit your first snippet:
$paged = 0;
also, as you're using WP_Query, you can safely delete following line, which is probably doing more wrong than good:
query_posts( '&post_type=upcomingevents&paged=' . $paged );

wordpress pagination not working in localhost server

I have used wordpress below code for pagination in local-host template but dont know why it is not working. Its showing all pages number nicely but any page number i click its only display first page.
global $wp_query;
$total_pages = $wp_query->max_num_pages;
if ($total_pages > 1){
$current_page = max(1, get_query_var('paged'));
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => '/page/%#%',
'current' => $current_page,
'total' => $total_pages,
));
}
my permalink settings is:
localhost/my-blog/sample-post/
and query post:
$args = array( 'post_type' => 'post', 'posts_per_page' => 2);
anybody please give me idea what to do next for working this pagination.
This works with WP_Query. You may try it:
global $wp_query;
$big = 999999999; // Need an unlikely integer
echo paginate_links( array( 'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var( 'paged' ) ),
'total' => $wp_query->max_num_pages,
'end_size'=> 1,
'mid_size'=> 10 ) );
In Settings -> Readings set Blog pages show at most to the number of posts you want to display in each page and in Settings -> Discussion set the pagination behavior
<global $wp_query;
$total = $wp_query->max_num_pages;
// only bother with the rest if we have more than 1 page!
if ( $total > 1 ) {
// get the current page
if ( !$current_page = get_query_var('paged') )
$current_page = 1;
// structure of "format" depends on whether we're using pretty permalinks
$format = empty( get_option('permalink_structure') ) ? '&page=%#%' : 'page/%#%/';
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => $format,
'current' => $current_page,
'total' => $total,
'mid_size' => 4,
'type' => 'list'
));
}
Please set a argument as per requirement and also refer this link My helps you
And let me know if you face problem
Thanks and Regards
I solved the same problem by reading the URL param using straight-up PHP, instead of get_query_var('paged'), simply use this:
$_GET['paged']

Resources