web-dev-qa-db-ja.com

検索 - Ajax - ページ付けを使用したクエリパラメータの変更

長すぎる ;読まなかった

Ajaxでクエリを作成するときにどのようにしてページネーションを機能させるのですか?


私は、ユーザーが1ページあたりの投稿数を絞り込むことができる機能的な検索ページの作成に取り組んでいます。作成方法がよくわからないので、ページ付けは正しく機能し、誰かが私に説明できることを望んでいました。私はPHP ajaxアクションで新しいクエリを作成することで新しいページングを作成し、通常のWP_Queryを変更しないことを理解しています。私はそれを特定の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');

上記は正しいクエリを返しますが、baseパラメータの設定方法がわからないため、ページ付けが壊れています。私は('/?s='.$search.'?paged='.$paged)/と他に何も手に入らないものをいくつか試しました。 The Codexの 'Basic Example'を使用すると、str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ) paginate_linksは次のようになります。

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

これは、正しい投稿からヘッダー、フッター、およびスタイルを除いたものを返します。

私はG.Mが この質問 でlocalizeスクリプトを使ってやったことを再現しようとしましたが、パラメータ2が整数を期待していたので$args = (array) filter_var(INPUT_POST, 'query');を通り過ぎることができませんでした。 $ _POST ['query']を単に配列に変換しようとしましたが、できませんでした。

関連ファイルペーストビン:

  1. 検索ページ
  2. 関連機能
  3. Ajax Jquery

警告 - そこにはいくつかの遺物があるかもしれません、私はこれを機能させようとするために物事を内外にコメントしています。

2
Howdy_McGee

私はこれがあなたが望むものだと思います。 basehome_url()で設定され、フォーマットはpage/%#%/で、存在する場合は検索クエリargがadd_argsで追加されます。

$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