Filtrare post AJAX al click in base alla categoria

24 lug 2014, 17:19:33
Visualizzazioni: 16.5K
Voti: 4

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));
        }
4
Commenti

Ricordo di aver avuto un problema simile in passato. È un tentativo un po' azzardato, ma prova ad aggiungere questo a functions.php add_action('template_redirect', 'register_scripts');

gdaniel gdaniel
24 lug 2014 17:43:24

Temo che non abbia risolto il problema. Grazie comunque per il tentativo.

GuerillaRadio GuerillaRadio
24 lug 2014 17:53:13

Prima di rispondere più approfonditamente, potrebbe essere l'errore di battitura in add_action( 'wp_ajax_oad_cat_posts', 'load_cat_posts' ); (cioè wp_ajax_oad dovrebbe essere wp_ajax_load)?

John P Bloch John P Bloch
24 lug 2014 17:55:50

Lo è, grazie mille John! Sto modificando la domanda ora perché ho un altro problema.

GuerillaRadio GuerillaRadio
24 lug 2014 18:24:36
Tutte le risposte alla domanda 1
0

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.

23 gen 2016 20:30:26