-
-
Save Bobz-zg/42337d22028230fe17ff03bd58824930 to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* AJAC filter posts by taxonomy term | |
*/ | |
function vb_filter_posts_mt() { | |
if( !isset( $_POST['nonce'] ) || !wp_verify_nonce( $_POST['nonce'], 'bobz' ) ) | |
die('Permission denied'); | |
/** | |
* Default response | |
*/ | |
$response = [ | |
'status' => 500, | |
'message' => 'Something is wrong, please try again later ...', | |
'content' => false, | |
'found' => 0 | |
]; | |
$all = false; | |
$terms = $_POST['params']['terms']; | |
$page = intval($_POST['params']['page']); | |
$qty = intval($_POST['params']['qty']); | |
$pager = isset($_POST['pager']) ? $_POST['pager'] : 'pager'; | |
$tax_qry = []; | |
$msg = ''; | |
/** | |
* Check if term exists | |
*/ | |
if (!is_array($terms)) : | |
$response = [ | |
'status' => 501, | |
'message' => 'Term doesn\'t exist', | |
'content' => 0 | |
]; | |
die(json_encode($response)); | |
else : | |
foreach ($terms as $tax => $slugs) : | |
if (in_array('all-terms', $slugs)) { | |
$all = true; | |
} | |
$tax_qry[] = [ | |
'taxonomy' => $tax, | |
'field' => 'slug', | |
'terms' => $slugs, | |
]; | |
endforeach; | |
endif; | |
/** | |
* Setup query | |
*/ | |
$args = [ | |
'paged' => $page, | |
'post_type' => 'post', | |
'post_status' => 'publish', | |
'posts_per_page' => $qty, | |
]; | |
if ($tax_qry && !$all) : | |
$args['tax_query'] = $tax_qry; | |
endif; | |
$qry = new WP_Query($args); | |
ob_start(); | |
if ($qry->have_posts()) : | |
while ($qry->have_posts()) : $qry->the_post(); ?> | |
<article class="loop-item"> | |
<header> | |
<h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> | |
</header> | |
<div class="entry-summary"> | |
<?php the_excerpt(); ?> | |
</div> | |
</article> | |
<?php endwhile; | |
/** | |
* Pagination | |
*/ | |
if ( $pager == 'pager' ) | |
vb_mt_ajax_pager($qry,$page); | |
foreach ($tax_qry as $tax) : | |
$msg .= 'Displaying terms: '; | |
foreach ($tax['terms'] as $trm) : | |
$msg .= $trm . ', '; | |
endforeach; | |
$msg .= ' from taxonomy: ' . $tax['taxonomy']; | |
$msg .= '. Found: ' . $qry->found_posts . ' posts'; | |
endforeach; | |
$response = [ | |
'status' => 200, | |
'found' => $qry->found_posts, | |
'message' => $msg, | |
'method' => $pager, | |
'next' => $page + 1 | |
]; | |
else : | |
$response = [ | |
'status' => 201, | |
'message' => 'No posts found', | |
'next' => 0 | |
]; | |
endif; | |
$response['content'] = ob_get_clean(); | |
die(json_encode($response)); | |
} | |
add_action('wp_ajax_do_filter_posts_mt', 'vb_filter_posts_mt'); | |
add_action('wp_ajax_nopriv_do_filter_posts_mt', 'vb_filter_posts_mt'); | |
/** | |
* Shortocde for displaying terms filter and results on page | |
*/ | |
function vb_filter_posts_mt_sc($atts) { | |
$a = shortcode_atts( array( | |
'tax' => 'post_tag', // Taxonomy | |
'terms' => false, // Get specific taxonomy terms only | |
'active' => false, // Set active term by ID | |
'per_page' => 12, // How many posts per page, | |
'pager' => 'pager' // 'pager' to use numbered pagination || 'infscr' to use infinite scroll | |
), $atts ); | |
$result = NULL; | |
$terms = get_terms($a['tax']); | |
if (count($terms)) : | |
ob_start(); ?> | |
<div id="container-async" data-paged="<?= $a['per_page']; ?>" class="sc-ajax-filter sc-ajax-filter-multi"> | |
<ul class="nav-filter"> | |
<li> | |
<a href="#" data-filter="<?= $terms[0]->taxonomy; ?>" data-term="all-terms" data-page="1"> | |
Show All | |
</a> | |
</li> | |
<?php foreach ($terms as $term) : ?> | |
<li<?php if ($term->term_id == $a['active']) :?> class="active"<?php endif; ?>> | |
<a href="<?= get_term_link( $term, $term->taxonomy ); ?>" data-filter="<?= $term->taxonomy; ?>" data-term="<?= $term->slug; ?>" data-page="1"> | |
<?= $term->name; ?> | |
</a> | |
</li> | |
<?php endforeach; ?> | |
</ul> | |
<div class="status"></div> | |
<div class="content"></div> | |
<?php if ( $a['pager'] == 'infscr' ) : ?> | |
<nav class="pagination infscr-pager"> | |
<a href="#page-2" class="btn btn-primary">Load More</a> | |
</nav> | |
<?php endif; ?> | |
</div> | |
<?php $result = ob_get_clean(); | |
endif; | |
return $result; | |
} | |
add_shortcode( 'ajax_filter_posts_mt', 'vb_filter_posts_mt_sc'); | |
/** | |
* Pagination | |
*/ | |
function vb_mt_ajax_pager( $query = null, $paged = 1 ) { | |
if (!$query) | |
return; | |
$paginate = paginate_links([ | |
'base' => '%_%', | |
'type' => 'array', | |
'total' => $query->max_num_pages, | |
'format' => '#page=%#%', | |
'current' => max( 1, $paged ), | |
'prev_text' => 'Prev', | |
'next_text' => 'Next' | |
]); | |
if ($query->max_num_pages > 1) : ?> | |
<ul class="pagination"> | |
<?php foreach ( $paginate as $page ) :?> | |
<li><?php echo $page; ?></li> | |
<?php endforeach; ?> | |
</ul> | |
<?php endif; | |
} |
@tanmaypatel86 I'm very happy that you managed to come up with solution on your own.
Usually people are looking for copy/paste solutions but that doesn't make them developers, kudos to you, very good job :)
I'm not sure which code are you using, if it's this: https://gist.github.com/Bobz-zg/8bc7c5a99a1ab6ee969a16004c0403d5
L73 : $status.html(data.message);
is adding content to that status div (maybe data.message
does not exist)
L96 : $status.html(msg);
is also adding content to same status div
Tbh, looks like there is something wrong in my code there, not sure is complete
needed and why I have added that at the first place.
Be sure to inspect what data
is returned back, just console log or look in network panel for admin-ajax.php
under XHR tab
Thank you for your message. I will try to fix it using console log.
I have used this below code for that,
msg = textStatus;
if (textStatus === 'success') {
msg = data.responseJSON.found;
}
$status.text('Posts found: ' + msg);
I have also fixed it the issue of "Posts found: undefined" (when I click on load more button again again and when I reach button like this "You reached the end"). Thank you so much for amazing coding.
@tanmaypatel86 glad to hear that, good work!
Thank you :)
I have set all codes for "Load more" pagination and it's working. Awesome. I am very thankful to you for guiding me and posts your code as permium.
Just need help on minor one query. when I click on load more button again again and when I reach button like this "You reached the end". You can see status "Posts found: undefined" so How can display total posts number here. if you can help then it's good for me.
http://prntscr.com/rpxlwb