Filtrare post AJAX al click in base alla categoria
Questa è la mia prima esperienza con AJAX, ho assemblato pezzi di codice da vari tutorial il che probabilmente non ha aiutato.
Ho una lista di categorie nella homepage (index.php) e una lista dei post più recenti. Quando un utente clicca su una categoria voglio che questa lista di post venga aggiornata senza ricaricare la pagina. Attualmente quando clicco un filtro tutti i post vengono caricati nel container di risposta (non filtra per categoria) e l'unico contenuto caricato è the_content(), anche se il mio template (listing-post.php) richiede thumbnail, categoria etc.
Sto usando Bones come tema base, ecco perché wp_localize_script è in questo file (sta funzionando). Ho incluso solo il codice che so avere problemi (so che il resto del sito e JS funziona bene).
bones.php
//Aggiungi percorso AJAX da usare in load-posts.js
$getPath = array('ajaxURL' => admin_url('admin-ajax.php'));
wp_localize_script('main-js', 'pathToFile', $getPath);
functions.php
//Filtro AJAX per Categorie
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));
}

Questa riga nel file functions.php
è il tuo problema:
$cat_id = get_post_meta($_REQUEST['cat']);
Penso che tu abbia frainteso lo scopo della funzione get_post_meta()
. È progettata per ottenere i metadati di un articolo di WordPress, non i dati da una richiesta POST
al sito. Il primo parametro della funzione get_post_meta()
è l'$post_id
, ma poiché stai passando l'ID della categoria, otterrai false
o un array di tutti i valori meta se esiste un articolo con lo stesso ID di quella categoria. In entrambi i casi, il valore della variabile di query cat
non sarà un ID di categoria valido, quindi quella parte della query verrà ignorata e verranno restituiti tutti gli articoli. Se modifichi quella riga in questo modo, risolverai il problema e il tuo codice probabilmente funzionerà:
$cat_id = absint( $_REQUEST['cat'] );
La funzione absint()
converte semplicemente il valore fornito dall'utente in un intero positivo.
