web-dev-qa-db-ja.com

Wp_queryおよびget_postsにthe_posts_navigationを使用する方法

WordPressは4.1.0からthe_posts_navigation関数を持っています。しかし、私はwp_queryget_postsと一緒に使う方法がわかりません。次のコードはpageのテンプレートファイルにあります。
wp_queryメソッド:

    <?php
    if ( get_query_var('paged') ) {
    $paged = get_query_var('paged');
    } else if ( get_query_var('page') ) {
    $paged = get_query_var('page');
    } else {
    $paged = 1;
    }

    $get_posts=new wp_query('post_type=case&posts_per_page=2&paged='.$paged);

    while($get_posts->have_posts()):$get_posts->the_post();
    the_title();
    endwhile;

    the_posts_pagination( array(
        'prev_text'          => __( 'Previous page', 'cm' ),
        'next_text'          => __( 'Next page', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'cm' ) . ' </span>',
    ) );
    ?>

get_postsメソッド:

    <?
    while(have_posts()):the_post();
    if ( get_query_var('paged') ) {
        $paged = get_query_var('paged');
        } else if ( get_query_var('page') ) {
        $paged = get_query_var('page');
        } else {
        $paged = 1;
    }

    $case_posts=get_posts('post_type=case&posts_per_page=2&paged='.$paged);
    echo '<pre>';
    print_r($case_posts);
    echo '</pre>';
    foreach($case_posts as $case_post){
        echo $case_post->post_title;
    }
    endwhile;
    // Previous/next page navigation.
    the_posts_pagination( array(
        'prev_text'          => __( 'Previous page', 'cm' ),
        'next_text'          => __( 'Next page', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Page', 'cm' ) . ' </span>',
    ) );
    ?>

それらは機能せず、ページ付けを表示しますが、アドレスバーに http://127.0.0.1/gdboer /?page_id = 74&page = 2 を手動で入力すると機能します。誰が私を助けることができる、どうもありがとう!

6
Vincent Wong

the_posts_navigation()は単純に get_the_posts_navigation() のラッパー関数で、これは単にpaginate_linksのラッパー関数です。最初の2つの関数は、paginate_linksで使用されているものとまったく同じパラメーターを使用し、実際には後者の関数にも渡します。

get_the_posts_navigation()the_posts_navigation()は多くのカスタムコーディングを排除するので良い新機能であり、番号の付けられたページネーションリンクを望む新規の未経験ユーザーにとってよりユーザーフレンドリーです。

このget_the_posts_navigation()の唯一の欠陥は、メインクエリ(paginate_links)のページ数が1ページ未満の場合、開発者が$wp_query関数を条件付きステートメントにラップしたことです(最初のページは0、2ページ目は2です)。リンクを表示しないでください。これは、ページテンプレートのカスタムクエリでは問題があります。ページは常に1ページしかないので、これらの関数はカスタムクエリでは機能しません。

あなたがthe_posts_navigation()を使わなければならないならば、唯一の本当の回避策は この投稿 の@ChipBennet答えを利用することです。私はメインのクエリを無効にするのはあまり好きではありません(私の考えではこれはquery_postsを使うようなものです)が、get_the_posts_navigation()をカスタムクエリで動作させる他の解決策は見当たりません。

8
Pieter Goosen

カスタムテンプレートがあり、ページネーションコンポーネントを表示するのに何時間も苦労しました。ここに私のために働いていたものがあります。

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
    'posts_per_page' => 3,
    'orderby' => 'menu_order',
    'order'=> 'ASC',
    'paged'=>$paged,
    'post_type' => 'projects'
    );

$projects = new WP_Query($args);

            <!-- working example of pagination with numbers -->
            ...<?php endwhile;?>
                <?php 
                $GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
                the_posts_pagination( array(
                   'mid_size' => 1,
                   'prev_text' => __( 'Back', 'green' ),
                   'next_text' => __( 'Onward', 'green' ),
                   'screen_reader_text' => __( 'Posts navigation' )
                ) ); ?>
             OR
             <!-- working example of pagination without numbers -->
             ...<?php endwhile;?>   
             <?php next_posts_link(  'next', $projects->max_num_pages ); ?>
             <?php previous_posts_link('prev') ?>
5
Eran Or

この関数は get_the_posts_pagination() を使います。これはGLOBAL wp_queryを使ってpaginate_links()関数を設定するので、get_postsではうまくいかないと思います。

関数paginate_links()を単独で、または関数posts_nav_link()を使ってみてください。

シモンズ:あなたはwp_reset_query()を使うようにしてください

2
Leo Caseiro