web-dev-qa-db-ja.com

カスタムクエリでpaginate_linksを機能させることができません

高度なカスタムフィールドとカスタム投稿タイプのuiプラグインを使って、私のWordpressサイトにニュースセクションを作りました。カスタムニュース概要ページ(標準のワードプレス記事ではありません)では、1ページあたりのニュース数を6に制限し、paginate_linksを使用してナビゲーションを提供したいと思いました。私は以下のスニペットを作成しました:

<section class="news-main" role="main">
    <?php
        $args = array(
            'post_type' => 'news',
            'posts_per_page' => '6'
        );
        $the_query = new WP_Query( $args );
        $temp_query = $wp_query;
        $wp_query = NULL;
        $wp_query = $the_query;
        $pagination = array(
            'base' => '%_%',
            'format' => '?page=%#%',
            'total' => $the_query->max_num_pages,
            'prev_next' => True,
            'prev_text' => __( '<< Previous' ),
            'next_text' => __( 'Next >>' )
        );
        if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <article class="news-snippet">
            <header class="news-box">
                <h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
                <a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
            </header>
            <div class="news-wrap">
                <p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
                <p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">More &rarr;</a></p>
            </div>
        </article>
    <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php else: ?>
        <p>No entries</p>
    <?php endif; ?>
    <nav>
        <?php echo paginate_links( $pagination );
                $wp_query = NULL;
                $wp_query = $temp_query; ?>
    </nav>
</section>

最初にwp_queryの引数が定義され、次にWP_Queryで$the_queryが設定され、その後$wp_query変数が一時変数に保存され、NULLでリセットされてから$the_query変数に設定されます。最後のステップでpaginate_linksの設定配列が設定されます。それからニュース記事を出力するためのループがあります。ループ後、paginate_links関数が呼び出され、最後に$wp_queryがリセットされ、一時的な$temp_query変数の内容が書き戻されます。

15のブログ記事を投稿したとすると、出力は次のようになります。

paginate_links layout

私が3番の上にカーソルを合わせると、スラッグの終わりは次のようになります。

slug for page 3

問題は、前後のリンクが設定されていても表示されないことです。主な問題は与えられたスラグです - 私がナンバー3をクリックするならば、私は404ページに着陸します。私が向けられている「ページ3」は、ワードプレスでは不明です。事前に感謝しますラルフ

更新:

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '1'
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
    $pagination = array(
        'base' => '%_%',
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $current_page,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Previous' ),
        'next_text' => __( 'Next >>' )
    );
}

更新2:

コードの最初の部分に次の変更を加えてわかりました。ナビゲーションが機能しました。

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '3',
    'paged' => get_query_var( 'paged' )
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $the_paged,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Previous' ),
        'next_text' => __( 'Next >>' )
    );
}

私が残した唯一の質問(それでもまだ誤動作している唯一のこと)は、最初のリンクがlink /?paged = 1の代わりにlinkを持っている可能性があります。

1
rpk

表示されるページ数に関しては、 paginate_links の引数、特にend_sizemid_sizeを読んでください。

404に関しては、問題はページ3がないということです。ページがコンテンツを返すか、404テンプレートをロードするかどうかは、 main query の結果に基づいています。テンプレート。これがpage投稿タイプの場合は、pagedではなくpage query varを設定してみてください。

4
Milo