Filtrare postări AJAX la click bazată pe categorie
Acesta este primul meu contact cu AJAX, am îmbucat bucăți de cod din diverse tutoriale, ceea ce probabil nu a ajutat.
Am o listă de categorii pe pagina principală (index.php) și o listă cu cele mai recente postări. Când un utilizator dă click pe o categorie, vreau ca această listă de postări să se actualizeze fără reîncărcarea paginii. În prezent, când fac click pe un filtru, toate postările sunt încărcate în containerul de răspuns (nu se filtrează după categorie) și singurul conținut încărcat este the_content(), deși template-ul meu (listing-post.php) cere thumbnail-ul, categoria etc.
Folosesc Bones ca temă de bază, de aceea wp_localize_script este în acest fișier (funcționează). Am inclus doar codul despre care știu că are probleme (știu că restul site-ului și JS funcționează corect).
bones.php
//Adaugă calea AJAX pentru a fi folosită în load-posts.js
$getPath = array('ajaxURL' => admin_url('admin-ajax.php'));
wp_localize_script('main-js', 'pathToFile', $getPath);
functions.php
//Filtru AJAX pe categorii
add_action( 'wp_ajax_load_cat_posts', 'load_cat_posts' );
add_action( 'wp_ajax_nopriv_load_cat_posts', 'load_cat_posts' );
function load_cat_posts () {
$cat_id = get_post_meta($_REQUEST['cat']);
$args = array (
'cat' => $cat_id,
'posts_per_page' => 10,
'order' => 'DESC'
);
$posts = get_posts($args);
ob_start ();
foreach ( $posts as $post ) {
setup_postdata( $post ); ?>
<?php get_template_part( 'partials/listing', 'post'); ?>
<?php } wp_reset_postdata();
$response = ob_get_contents();
ob_end_clean();
echo $response;
die(1);
}
index.php
<?php $categories = get_categories(); ?>
<ul class="category-filters">
<?php foreach ( $categories as $cat ) { ?>
<li id="cat-<?php echo $cat->term_id; ?>">
<a class="<?php echo $cat->slug; ?> ajax" data-cat="<?php echo $cat->term_id; ?>" href="javascript:void(0)"><?php echo $cat->name; ?></a>
</li>
<?php } ?>
</ul>
listing-post.php
<li class="standard-post">
<article id="<?php echo sanitize_title_with_dashes( get_the_title() ); ?>" <?php post_class(); ?> role="article">
<?php if (has_post_thumbnail()) { ?>
<div class="article-image">
<?php the_post_thumbnail(large); ?>
</div>
<?php } ?>
<div class="article-left">
<?php foreach((get_the_category()) as $category) { ?>
<span class="article-category"><?php echo $category->cat_name . ' ';?></span>
<?php } ?>
</div>
<div class="article-right">
<header class="article-header">
<h1 class="article-title"><?php the_title(); ?></h1>
<p class="article-time">
<?php printf( __( '<time class="updated" datetime="%1$s" pubdate>%2$s</time>', 'bonestheme' ), get_the_time(), get_the_time(get_option('date_format'))); ?>
</p>
</header>
<section class="entry-content">
<?php the_content(); ?>
</section>
</div>
</article>
</li>
load-posts.js
function cat_ajax_get(currentCat) {
$('a.ajax').removeClass('current');
$('a.ajax').addClass('current');
$('#loading-animation').show();
$.ajax({
type: 'POST',
url: ajaxurl,
data: {action: 'load_cat_posts', cat: currentCat },
success: function(response) {
$('.article-listing').html(response);
$('#loading-animation').hide();
return false;
}
});
};
ajaxFilters: function() {
$('.category-filters a').on('click', $.proxy(function(clickEvent) {
$clickTarget = $(clickEvent.currentTarget);
var currentCat = $clickTarget.attr('data-cat');
cat_ajax_get(currentCat);
},this));
}

Această linie din functions.php
este problema ta:
$cat_id = get_post_meta($_REQUEST['cat']);
Cred că înțelegi greșit scopul funcției get_post_meta()
. Aceasta este concepută pentru a obține metadatele pentru un Post WordPress, nu date dintr-un request de tip POST
către site. Primul parametru al funcției get_post_meta()
este $post_id
, dar din moment ce tu transmiți ID-ul categoriei, vei obține fie false
, fie un array cu toate valorile meta dacă există un post cu același ID ca și ID-ul categoriei. În oricare dintre aceste cazuri, valoarea variabilei de interogare cat
nu va fi un ID valid de categorie, așa că acea parte a interogării va fi ignorată și toate postările vor fi returnate. Dacă schimbi acea linie în următorul cod, vei rezolva problema și codul tău va funcționa probabil:
$cat_id = absint( $_REQUEST['cat'] );
Funcția absint()
doar convertește valoarea furnizată de utilizator într-un număr întreg pozitiv.
