你不应该使用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 »\' );
}
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 = __( \'« 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();
}