web-dev-qa-db-fra.com

Recherche - Ajax - Modifications des paramètres de requête avec pagination

trop long; N'a pas lu

Comment faire fonctionner la pagination lorsque je crée ma requête avec ajax?


Je travaille sur la création d'une page de recherche fonctionnelle permettant à l'utilisateur de filtrer le nombre de publications par page. Je ne comprends pas très bien comment le créer, alors la pagination fonctionne correctement et espérais que quelqu'un pourrait me l'expliquer. Je comprends qu'en créant une nouvelle requête dans mon action PHP ajax, je crée donc une nouvelle pagination et ne modifie pas le WP_Query normal. Il me faudrait donc faire fonctionner ma pagination avec ajax mais je ne sais pas comment Je le connecterais à une certaine requête personnalisée ajax.

function implement_ajax() {

    $ppp = 10;
    if(isset($_GET['ppp']))
        $ppp = $_GET['ppp'];

    $search = $_GET['s'];           // Acquired and sent via ajax
    $paged = 1;
    if(isset($_GET['paged']))
        $paged = $_GET['paged'];

    $temp = new WP_Query(array('s' => $search, 'posts_per_page' => $ppp));

    $numPosts = $temp->post_count;
    $foundPosts = $temp->found_posts;
    $lastPage = $temp->max_num_pages;

    ob_start();
    if($temp->have_posts()) :
        $i = 0; 
    ?>
        <?php if($temp->max_num_pages > 1) : ?>
            <div class="pagination">
                <?php 
                    $big = 999999999;
                    echo paginate_links(array('base' => '/', 'format' => '?paged=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $temp->max_num_pages)); 
                ?>
                <div class="clear"></div>
            </div> <!-- class="pagination" -->
        <?php endif; ?>

        <div id="postContainer">
            <?php while($temp->have_posts()) : 
                    $temp->the_post(); 
                    $i++; 
            ?>

                <div class="custom-post<?php echo ($i%2 == 0) ? ' even' : ''; echo ($i == $numPosts) ? ' last' : ''; echo ($i == 1) ? ' first' : ''; ?>">
                    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                    <?php the_excerpt(); ?>
                </div> <!-- class="custom-post" -->

            <?php endwhile; ?>
        </div> <!-- id="postContainer" -->

    <?php else : ?>
        <div id="postContainer">
            <div id="content">
                <p>No articles found.</p>
                <p><a href="<?php echo home_url(); ?>">Return Home</a></p>  
            </div> <!-- id="content" -->
        </div> <!-- id="postContainer" -->
    <?php endif;

    $htmlContent = ob_get_clean();
    echo $htmlContent;
    exit;
}
add_action('wp_ajax_nopriv_implement_ajax', 'implement_ajax');
add_action('wp_ajax_implement_ajax', 'implement_ajax');

Ce qui précède renvoie la requête correcte - mais la pagination est rompue car je ne sais pas comment définir le paramètre base. J'ai essayé ('/?s='.$search.'?paged='.$paged) et / et quelques autres qui ne m'ont conduit nulle part. Si j'utilise "l'exemple de base" dans le Codex: str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ) paginate_links retourne:

/wp-admin/admin-ajax.php?action=implement_ajax&ppp=1&s=web&paged=2

qui renvoie les messages corrects, moins l'en-tête, le pied de page et les styles.

J'ai essayé de dupliquer ce que G.M a fait dans cette question avec un script de localisation, mais je n'ai pas pu dépasser $args = (array) filter_var(INPUT_POST, 'query'); car le paramètre 2 attendait un entier. J'ai essayé de convertir mon $ _POST ['query'] en un tableau, mais je n'ai pas pu le faire.

Fichiers correspondants:

  1. Page de recherche
  2. Fonctions pertinentes
  3. Ajax Jquery

Attention - il y a peut-être des reliques là-dedans, j'ai commenté des choses pour essayer de faire en sorte que cela fonctionne.

2
Howdy_McGee

Je pense que c'est ce que tu veux. base est défini via home_url(), le format est page/%#%/, la requête de recherche arg est ajoutée via add_args si elle existe:

$args = array(
    'base' => home_url( '/%_%' ),
    'format' => 'page/%#%/',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $temp->max_num_pages,
);

if( isset($_GET['s']) ){
    $args['add_args'] = array(
        's' => $_GET['s'] // your search query passed via your ajax function
    );
}

echo paginate_links( $args );
2
Milo