I have a mess of code that works, however I know its a mess and im sure there is a neater way of doing this.
I am trying to get the child category to display under the parent category and for the post count to also show.
the problem is I only want the category to show if post are in the category and only show categories that have post for the current post type.
My code is working buy is a mess, dose anyone know how to clean this up and make it more efficient ?
<script>
attrs = $( 'body' ).attr( 'class' ).split( ' ' );
jQuery( attrs ).each(function() {
if ( 'post-type-' === this.substr( 0, 10 ) ) {
postType = this.split( 'post-type-' );
postType = postType[ postType.length - 1 ];
return;
}
});
postType = postType.replace('archive-', '');
var post_id = postType;
});
</script>
<aside class="sidebar">
<div class="widget widget-filter">
<button class="widget-title">Explore Topics</button>
<svg class="separator" viewBox="0 0 238 11" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg">
<line opacity="0.3" y1="0.5" x2="101.942" y2="0.5" stroke="#3CD5AF"></line>
<line opacity="0.3" y1="10.5" x2="237.5" y2="10.5" stroke="#3CD5AF"></line>
</svg>
<?php
$string = basename($wp->request); ;
$string = str_replace('-', '_', $string);
$new_string = $string;
// echo $new_string;
$args = array(
'post_type' => $new_string,
'post_status' => 'publish',
);
$the_query = new WP_Query( $args );
$my_categories = array();
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$postType = get_queried_object();
$terms = get_the_terms( get_the_ID(), 'category' );
if ( $terms && ! is_wp_error( $terms ) ) :
foreach ( $terms as $term ) {
if(!in_array($term->term_id, $my_categories))
$my_categories[] = $term->term_id;
}
endif;
}
wp_reset_postdata();
}
if(sizeof($my_categories)) { ?>
<ul class="filter-list">
<li :class="category == 0 ? 'parent' : ''" ;>
<a class="" @click="filterPosts">Show All</a>
<?php
$args = array(
'cat' => $category_id,
'post_type' => $new_string,
);
?>
</li>
<?php foreach ($my_categories as $term_id) {
$category = get_term_by('id', $term_id, 'category');
if($category->slug!="all-articles") {
if($category->parent != 0){ // If this is a subcategory
$args = array(
'numberposts' => -1,
'category' => $category->term_id,
'post_type' => $new_string,
);
$count_posts = get_posts( $args );
$total_posts_child = count($count_posts);
?>
<li :class="category == <?php echo $category->term_id; ?> ? 'child' : ''" ;>
<a class="child" @click="filterPosts(<?= $category->term_id; ?>)"><?= esc_html( $category->name ); echo "". "(" .$total_posts_child . ")"; ?></a>
</li> <?php
} else {
$args = array(
'numberposts' => -1,
'category' => $category->term_id,
'post_type' => $new_string,
);
$count_posts = get_posts( $args );
$total_posts_parent = count($count_posts);
?>
<li :class="category == <?php echo $category->term_id; ?> ? 'parent' : ''" ;>
<a class="parent" @click="filterPosts(<?= $category->term_id; ?>)"><?= esc_html( $category->name); echo "". "(" .$total_posts_parent . ")" ?></a>
</li> <?php
}
}
}
}
?>
</ul>
</div>
</aside>
PS reason I am getting post type from html using Jquery is due to the wider project is a ajax project and im unable to get current post type due to the dynamic nature.