webentwicklung-frage-antwort-db.com.de

Search - Ajax - Abfrageparameter mit Paginierung ändern

zu lang; Nicht gelesen

Wie kann ich die Paginierung aktivieren, wenn ich meine Abfrage mit Ajax erstelle?


Ich arbeite daran, eine funktionierende Suchseite zu erstellen, mit der der Benutzer filtern kann, wie viele Beiträge pro Seite angezeigt werden. Ich verstehe nicht ganz, wie man es erstellt, damit die Paginierung korrekt funktioniert, und ich hatte gehofft, jemand könnte es mir erklären. Ich verstehe, dass ich durch das Erstellen einer neuen Abfrage in meiner Ajax-Aktion PHP ein neues Paging erstelle und die normale WP_Query nicht ändere, sodass ich meine Paginierungsfunktion mit Ajax ausführen müsste, aber ich bin nicht sicher, wie Ich würde es mit einer bestimmten Ajax-Abfrage verbinden.

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');

Das obige Ergebnis gibt die richtige Abfrage zurück - aber die Paginierung ist unterbrochen, da ich nicht sicher bin, wie der Parameter base gesetzt werden soll. Ich habe ('/?s='.$search.'?paged='.$paged) und / ausprobiert und ein paar andere, die mich nicht weiter gebracht haben. Wenn ich das 'Basic Example' im Codex verwende: str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ) paginate_links return:

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

dies gibt die korrekten Beiträge zurück, abzüglich der Kopf- und Fußzeile und der Formatvorlagen.

Ich habe versucht, das, was G.M in dieser Frage mit localize-Skript getan hat, zu duplizieren, konnte aber $args = (array) filter_var(INPUT_POST, 'query'); nicht überwinden, da Parameter 2 eine Ganzzahl erwartete. Ich habe versucht, meine $ _POST ['query'] in ein Array zu konvertieren, konnte dies jedoch nicht.

Relevante Dateipastebins:

  1. Suchseite
  2. Relevante Funktionen
  3. Ajax Jquery

Achtung - es gibt möglicherweise einige Relikte darin. Ich habe einige Dinge kommentiert, um zu versuchen, dies zum Laufen zu bringen.

2
Howdy_McGee

Ich denke das ist was du willst. base wird über home_url() eingestellt, Format ist page/%#%/, Suchabfragearg wird über add_args hinzugefügt, falls vorhanden:

$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