Aim
The total to be equal to the amount of post within the selected category or sub category.
What im getting
I am getting 0 when trying to get the number of post available in a category.
I have tried (code bellow), however I keep getting the response 0 for total
Summarey
So I have a custom post type custom_post and I am trying to get the number of post in a selected the category / subcategory selected (using standard category and sub category type taxonomy)
I am using the category / sub-category ID.
My ajax
<?php // the ajax function
add_action('wp_ajax_filterPosts', 'filterPosts');
add_action('wp_ajax_nopriv_filterPosts', 'filterPosts');
function filterPosts()
{
$response = [
'posts' => "",
];
$all_args = array(
'posts_per_page' => -1, // returns all posts
'post_status' => 'publish',
);
$filter_args = array(
'post_status' => 'publish',
);
if ($_POST['limit']) {
$filter_args['posts_per_page'] = max (0, (int) $_POST['limit']);
}
if (isset($_POST['offset'])) {
$filter_args['offset'] = max (0, (int)$_POST['offset']);
}
if ($_POST['post_type_js']) {
$filter_args['post_type'] = $_POST['post_type_js'];
}
if ($_POST['category']) {
$filter_args['cat'] = $_POST['category'];
// Get the total number of posts for the category
$all_args['total'] = $_POST['total'];
}
$filter_query = new WP_Query($filter_args);
$all_query = new WP_Query($all_args);
if ($filter_query->have_posts()) :
while ($filter_query->have_posts()) : $filter_query->the_post();
$response['posts'] .= load_template_part('/template-parts/posts-filter/single-post');
endwhile;
wp_reset_postdata();
endif;
echo json_encode($response);
die();
}
My javascript
Alpine.data("filterPosts", (adminURL) => ({
posts: "",
limit: 6,
total: null,
category: null,
post_type_js: post_id,
showDefault: true,
showFiltered: false,
offset: 0,
filterPosts(id) {
this.showDefault = false;
this.showFiltered = true;
this.category = id;
this.offset = 0; // <-- reset offset to zero
this.total = 0;
this.fetchPosts();
},
loadMore() {
this.loadingMore = true;
this.total = null;
this.offset += 6;
this.showFiltered = true;
this.fetchPosts(true);
},
fetchPosts(append = false) {
var formData = new FormData();
formData.append("action", "filterPosts");
formData.append("limit", this.limit);
formData.append("post_type_js", this.post_type_js);
formData.append("offset", this.offset);
if (this.category) {
formData.append("category", this.category);
formData.append("total", this.total);
}
fetch(adminURL, {
method: "POST",
body: formData,
})
.then((res) => res.json())
.then((res) => {
if (append) {
// Appends posts to the end of existing posts data
this.posts = this.posts.concat(res.posts);
} else {
// Resets the posts data with new data
this.posts = res.posts;
}
this.loading = false;
});
},
getTotal() {
var formData = new FormData();
formData.append("action", "filterPosts");
fetch(adminURL, {
method: "POST",
body: formData,
})
.then((res) => res.json())
.then((res) => {
this.total = res.total;
});
},
init() {
this.getTotal(
Response in console
action: filterPosts
limit: 6
post_type_js: custom_post
offset: 6
category: 1094
total: 0