Ajax фильтрация постов — как допилить?
Добрый день!
Собираю себе ajax фильтр записей на основе данной статьи
В моем случае список категорий должен выводиться вот так:
В целом получилось, работает..вот код
functions.php
add_action('wp_ajax_myfilter', 'misha_filter_function'); // wp_ajax_{ACTION HERE}
add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');
function misha_filter_function(){
$args = array(
'orderby' => 'date', // we will sort posts by date
'order' => $_POST['date'] // ASC or DESC
);
if( $terms = get_terms( array( 'taxonomy' => 'category' ) ) ) :
$all_terms = array();
foreach( $terms as $term ) {
if( isset( $_POST['category_' . $term->term_id ] ) && $_POST['category_' . $term->term_id] == 'on' )
$all_terms[] = $term->slug;
}
if( count( $all_terms ) > 0 ) {
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms'=> $all_terms
)
);
}
endif;
// if post thumbnail is set
if( isset( $_POST['featured_image'] ) && $_POST['featured_image'] == 'on' )
$args['meta_query'][] = array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS'
);
// if you want to use multiple checkboxed, just duplicate the above 5 lines for each checkbox
$query = new WP_Query( $args );
if( $query->have_posts() ) :
while( $query->have_posts() ): $query->the_post();
// echo '<h2>' . $query->post->post_title . '</h2>';
get_template_part( 'template-parts/content/news-card', get_post_format() );
endwhile;
wp_reset_postdata();
else :
echo 'No posts found';
endif;
die();
}
Код в шаблоне:
<!-- Ajax filters for blog -->
<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
<?php
$cat_services = get_category_by_slug('services');
$categories_services = get_categories( [
'taxonomy' => 'category',
'type' => 'post',
'parent' => $cat_services->term_id,
'hide_empty' => 0,
] );
if( $categories_services ){
foreach( $categories_services as $cat ){
echo '<p><input type="checkbox" id="category_'. $cat->cat_ID .'" name="category_'. $cat->cat_ID .'" /><label for="category_'. $cat->cat_ID .'">' . $cat->name . '</label></p>';
}
}
$cat_categories = get_category_by_slug('categories');
$categories_categories = get_categories( [
'taxonomy' => 'category',
'type' => 'post',
'parent' => $cat_categories->term_id,
'hide_empty' => 0,
] );
if( $categories_categories ){
foreach( $categories_categories as $cat ){
echo '<p><input type="checkbox" id="category_'. $cat->cat_ID .'" name="category_'. $cat->cat_ID .'" /><label for="category_'. $cat->cat_ID .'">' . $cat->name . '</label></p>';
}
}
?>
<label>
<input type="radio" name="date" value="ASC" /> Date: Ascending
</label>
<label>
<input type="radio" name="date" value="DESC" selected="selected" /> Date: Descending
</label>
<label>
<input type="checkbox" name="featured_image" /> Only posts with featured images
</label>
<button>Apply filter</button>
<input type="hidden" name="action" value="myfilter">
</form>
<div id="response">Last posts</div>
И скрипт jQuery
// Ajax filters for blog
jQuery(function($){
$('#filter').change(function(){
var filter = $('#filter');
$.ajax({
url:filter.attr('action'),
data:filter.serialize(), // form data
type:filter.attr('method'), // POST
beforeSend:function(xhr){
filter.find('button').text('Processing...'); // changing the button label
},
success:function(data){
filter.find('button').text('Apply filter'); // changing the button label back
$('#response').html(data); // insert data
}
});
return false;
});
});
Вопрос #1 - Когда захожу на страницу блога - постов нет, есть надпись "Last posts"..покликал фильтр - работает, но как только сминаю настройки фильтра на исходную - выводятся все записи сайта, а нужно вернуться к надписи "Last posts" - можно ли так сделать?
Вопрос #2 - Я, выбрав 2-3 фильтра, хочу видеть эти изменения в адрессной строке браузера - то есть, чтоб я мог скопировать ссылку с выбранными параметрами - и она работала..если я перешел в запись, и вернулся назад - то нормально было бы - увидеть выбранные ранее фильтры
Вопрос 2, если подключать ajax, то в URL ничего не увидишь..