在请求页面之前从页码URL进行分页重定向

时间:2015-11-08 作者:v3nt

我有一个叫staff的CPT。在他们的单身员工身上。php页面我有一个与之相关的项目列表。这已经变得太长了,所以现在我们需要分页。我可以很好地创建页面链接,但它会将自己重定向到没有/页/号的URL。

http://wonkhedev.jynk.net/staff/mark-leach/ 主页面

http://wonkhedev.jynk.net/staff/mark-leach/page/2/ 第2页链接,但直接返回到http://wonkhedev.jynk.net/staff/mark-leach/

//in functions.php
function get_author_articles($id){

  // backwards finds CPT \'blogs\' this staff member is related to.
  $meta_query = array(
    \'paged\' =>  get_query_var(\'paged\'),
    \'post_type\' => \'blogs\',
    \'meta_query\' => array(
      array(
        \'key\' => \'blog_author\', // name of custom field, ACF
        \'value\' => \'"\' . $id . \'"\',  // CPT \'staff\' id.
        \'compare\' => \'LIKE\'
      )
    ),
    \'posts_per_page\' => 20,
  );

  $author_articles = query_posts($meta_query);

  return $author_articles;

}
//单兵作战。php

$blog_articles = get_author_articles($post->ID);
$blog_articles_total = $wp_query->found_posts;    
<?php if ($wp_query->max_num_pages > 1) : ?>
      <nav class="post-nav">
        <ul class="pager">
          <li class="previous"><?php next_posts_link(__(\'&larr; Older Articles\', \'roots\')); ?></li>
          <li class="next"><?php previous_posts_link(__(\'Newer Articles &rarr;\', \'roots\')); ?></li>
        </ul>
      </nav>
    <?php endif; ?>

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

你不应该使用query_post 因为它会中断主查询对象并将其重置为当前自定义查询。这打破了插件和自定义功能,如相关帖子和分页。我做了一个extensive answer 因此,请务必查看它,以及answer by @Rarst.

还应该注意的是,单页,就像静态首页使用的一样page 而不是paged 与普通归档页面和页面一样

让我们先看看您的相关帖子功能:

相关帖子

我们首先希望对函数进行正确编码,以使其安全且动态。我接受这一点$id 应该是您正在查看的帖子的单个帖子ID,因此考虑到这一点,让我们对函数进行编码:

在此之前,请注意以下几点:

代码已注释,因此很容易理解

该代码需要PHP 5.4+

根据需要修改代码

这是代码

/**
 * Function to return realted posts_per_page
 *
 * @param (array) $args Compatible argumnets to pass to WP_Query
 * @return $author_articles
 */
function get_author_articles( $args = [] )
{
    // First make sure we are on a single page, else return false
    if ( !is_single() )
        return false;

    // Get the single post object we are on
    $current_post = get_queried_object();

    // Set our $page variable
    $page = get_query_var( \'page\' ) ? get_query_var( \'page\' ) : 0;

    // backwards finds CPT \'blogs\' this staff member is related to.
    $meta_query_defaults = [
        \'post__not_in\'   => $current_post->ID, // Excludes the current post
        \'paged\'          => $page,
        \'post_type\'      => $current_post->post_type,
        \'posts_per_page\' => 20,
        \'meta_query\'     => [
            [
                \'key\'     => \'blog_author\', // name of custom field, ACF
                \'value\'   => $current_post->ID,  // CPT \'staff\' id.
                \'compare\' => \'LIKE\'
            ]
        ],
    ];

    // Add our custom arguments to the $meta_query_defaults array
    if (    $args
         && is_array( $args )
    ) {
        $meta_query_defaults = wp_parse_args(  $args, $meta_query_defaults );
    }

    $author_articles = new WP_Query( $meta_query_defaults );

    return $author_articles;
}
可以作为第一个参数传递对有效的参数数组WP_Query 调整和修改传递给的函数中的默认参数WP_Query

分页

正如我所说,单帖页面和静态首页使用page 而不是paged. 为了使分页工作正常,您需要一个完整的自定义函数。我刚才做过这样一个函数,你可以检查一下here.

这是经过轻微修改的版本

function get_single_pagination_link( $pagenum = 1 ) {
    global $wp_rewrite;

    if(    !is_single() 
        || !$wp_rewrite->permalink_structure 
    )
        return false;

    $pagenum = (int) $pagenum;

    $post_id = get_queried_object_id();
    $request = get_permalink( $post_id );

    if ( $pagenum > 1 )
        $request = trailingslashit( $request ) . user_trailingslashit( $pagenum );
   return esc_url( $request );
}

function get_next_single_page_link ( $label = null, $max_page = 0 ) {
    global $wp_query;

    if( !is_single() ) 
        return false;

    if ( !$max_page ) {
        $max_page = $wp_query->max_num_pages;
    }

    $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;

    $next_page = intval($paged) + 1;

    if ( null === $label ) {
        $label = __( \'Next Page &raquo;\' );
    }

    if ( ( $next_page <= $max_page ) ) {
        return \'<a href="\' . get_single_pagination_link( $next_page ) . \'">\' . $label . \'</a>\';
    } else {
        return false;
    }
}

function get_previous_single_page_link( $label = null ) {

    if( !is_single() ) 
        return false; 

    $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;

    $prev_page = intval($paged) - 1;

    if ( null === $label ) {
        $label = __( \'&laquo; Previous Page\' );
    }

    if ( ( $prev_page > 0 ) ) {
        return \'<a href="\' . get_single_pagination_link( $prev_page ) . \'">\' . $label . \'</a>\';
    } else {
        return false;
    }
}
基本用法现在可以按如下方式使用

$q = get_author_articles();
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
    $q->the_post();

        // Add your markup, etc.

    }
    echo get_previous_single_page_link();
    echo get_next_single_page_link( null , $q->max_num_pages );

    wp_reset_postdata();
}    

相关推荐

如何在Single.php中链接仅供非登录用户使用的特色图片?

我想自动链接每个WordPress帖子的特色图片,只供访问者使用。因此,它不应该对WordPress的登录用户可用。它应该只链接single.php. 不适用于index.php, archive.php 或其他。我有此代码,但不知道此代码应放在何处(WordPress中的哪个文件):<?php $image = get_the_post_thumbnail_url( $post->ID, \'large\' ); $link = is_use