大约一个小时前,我提出了一个类似的问题,但从那以后,我觉得我已经做了足够多的改变,以至于如果有人第一次看到它,那将是一个混乱的局面。因此,我提出了一个新问题,这个问题与我的问题更加明确和相关。
基本上,我有一个自定义的帖子类型podcasts
我通过创建一个名为archive-podcasts.php
. 我已将此页面制作成自定义模板,并通过将其设置为首页Settings > Reading
在仪表板中。
然而,即使这样做了,归档页面也没有显示为首页,所以我做了一些研究,发现这个宝石可以放在我的functions.php
这最终让帖子的存档出现在头版。
add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
//Ensure this filter isn\'t applied to the admin area
if(is_admin()) {
return;
}
if($wp_query->get(\'page_id\') == get_option(\'page_on_front\')):
$wp_query->set(\'post_type\', \'podcasts\');
$wp_query->set(\'page_id\', \'\'); //Empty
//Set properties that describe the page to reflect that
//we aren\'t really displaying a static page
$wp_query->is_page = 0;
$wp_query->is_singular = 0;
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
endif;
}
棒极了,但还没完成。下面是我的
archive-podcasts.php
页面如下所示:
<?php
/*
Template Name: Podcasts
*/
?>
<?php get_header();?>
<section id="content">
<section id="latest-blogs">
<?php
$paged = (get_query_var(\'page\')) ? get_query_var(\'page\') : 1;
$args = array( \'posts_per_page\' =>5, \'post_type\'=> \'podcasts\', \'paged\' => $paged );
$postslist = new WP_Query( $args );
if ( $postslist->have_posts() ) :
while ( $postslist->have_posts() ) : $postslist->the_post(); ?>
<div class="article-wrapper">
<article id="post-<?php the_ID(); ?>">
<time datetime="<?php the_time(\'c\'); ?>"><?php the_time(\'F j, Y\'); ?></time>
<?php
$custom = get_post_custom($post->ID);
$buzzsprout_code = $custom["buzzsprout_code"][0];
echo do_shortcode($buzzsprout_code);
?>
<p class="read-emails"><a href="<?php the_permalink() ?>" rel="bookmark" title="View emails and comment on this episode.">View emails and comment on this episode</a></p>
</article>
</div>
<?php endwhile; ?>
<div id="pagination">
<?php my_paginate_links(); ?>
</div>
<?php wp_reset_postdata(); ?>
<?php endif; ?>
</section>
</section>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
您会注意到我正在调用函数
my_paginate_links()
. 然而,调用此函数很麻烦,因为它无法正确分页帖子的存档。当我单击页码时,它会转到正确的页面,但
current
CSS类不匹配。
这是什么my_paginate_links()
看起来像:
function my_paginate_links() {
global $wp_rewrite, $wp_query;
$wp_query->query_vars[\'paged\'] > 1 ? $current = $wp_query->query_vars[\'paged\'] : $current = 1;
$pagination = array(
\'base\' => @add_query_arg(\'page\',\'%#%\'),
\'format\' => \'\',
\'total\' => $wp_query->max_num_pages,
\'current\' => $current,
\'prev_text\' => __(\'« previous\'),
\'next_text\' => __(\'next »\'),
\'end_size\' => 1,
\'mid_size\' => 2,
\'show_all\' => true,
\'type\' => \'list\'
);
if ( $wp_rewrite->using_permalinks() )
$pagination[\'base\'] = user_trailingslashit( trailingslashit( remove_query_arg( \'s\', get_pagenum_link( 1 ) ) ) . \'page/%#%/\', \'paged\' );
if ( !empty( $wp_query->query_vars[\'s\'] ) )
$pagination[\'add_args\'] = array( \'s\' => get_query_var( \'s\' ) );
echo paginate_links( $pagination );
}
有人能帮我找出分页不起作用的原因吗?还有,有没有更好或更有效的方法来实现这一切?
此外,我应该注意到,分页在我的常规帖子的主查询中工作得很好。他们只是不适用于这种自定义帖子类型的帖子存档。有没有办法让分页对这两个实例都起作用?
编辑:更新分页功能
function my_paginate_links() {
global $wp_rewrite, $postslist;
$postslist->query_vars[\'page\'] > 1 ? $current = $postslist->query_vars[\'page\'] : $current = 1;
$pagination = array(
\'base\' => @add_query_arg(\'page\',\'%#%\'),
\'format\' => \'\',
\'total\' => $postslist->max_num_pages,
\'current\' => $current,
\'prev_text\' => __(\'« previous\'),
\'next_text\' => __(\'next »\'),
\'end_size\' => 1,
\'mid_size\' => 2,
\'show_all\' => true,
\'type\' => \'list\'
);
if ( $wp_rewrite->using_permalinks() )
$pagination[\'base\'] = user_trailingslashit( trailingslashit( remove_query_arg( \'s\', get_pagenum_link( 1 ) ) ) . \'page/%#%/\', \'paged\' );
if ( !empty( $postslist->query_vars[\'s\'] ) )
$pagination[\'add_args\'] = array( \'s\' => get_query_var( \'s\' ) );
echo paginate_links( $pagination );
}
最合适的回答,由SO网友:Pieter Goosen 整理而成
在我的电话和工作之间,出现了一些错误,对此表示抱歉。这是我修改后的答案。希望这有助于解决您的问题。
PROBLEM 1
您不应该将模板命名为“archive-{$post\\u type}”。php“如果它是一个页面模板。这完全违背了
template hierarchy 这就是为什么
static frontpage 不起作用。来自法典
A static page: WordPress使用静态页面模板层次结构:自定义页面模板,页面-{id}。php,第-{slug}页。php,第页。php,索引。php
SOLUTION TO PROBLEM 1
你应该考虑像头版这样的名字。php,它是frontpage模板或类似页面播客的适当名称。属于页面模板层次结构的php。存档-{$post\\u type}。php专门用于自定义帖子类型的归档页面。考虑看看
Theme Developments 也
您可以删除pre_get_posts
如果更改模板名称,则不再需要此功能。
PROBLEM 2
使用时
WP_Query
要创建自定义查询,并且需要分页,需要使用中的分页参数
WP_Query
. 此参数与静态首页不同。哪里
paged
通常使用,头版使用
page
page (int)-静态首页的页数。显示通常只显示在静态首页的第X页上的帖子。
SOLUTION TO PROBLEM 2
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
应更改为
$paged = (get_query_var(\'page\')) ? get_query_var(\'page\') : 1;
传递给的数组中的这一行
WP_Query
是正确的。无需更改此
\'paged\' => $paged
PROBLEM 3
您的分页功能也应该根据您的自定义查询进行相应的调整。我有两件事要做,你的
max_num_pages
未为自定义查询设置参数,
paged
应该是
page
对于frontpage,您正在使用变量
$wp_query
. 自定义查询的变量集为
$postslist
, 因此,您应该根据变量调整分页函数。
SOLUTION TO PROBLEM 3
我遇到了这个
ready-made function from @ewroman 它将自定义查询和常规主查询组合为一个分页函数,因此不需要仅为不同的分页查询创建两个函数。我已经用你的自定义贴子页面对此进行了测试,效果很好。您可以进一步修改此函数
if( ! function_exists( \'my_paginate_links\' ) ) {
function my_paginate_links() {
global $wp_query, $postslist;
$big = 999999999; // This needs to be an unlikely integer
if ( is_front_page()) {
$myqueryis = $postslist;
$paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;
} else {
$myqueryis = $wp_query;
$paged = get_query_var(\'paged\');
}
// For more options and info view the docs for paginate_links()
// http://codex.wordpress.org/Function_Reference/paginate_links
$paginate_links = paginate_links( array(
\'base\' => str_replace( $big, \'%#%\', get_pagenum_link($big) ),
\'current\' => max( 1, $paged ),
\'total\' => $myqueryis->max_num_pages,
\'mid_size\' => 5,
\'prev_next\' => True,
\'prev_text\' => __(\'« previous\'),
\'next_text\' => __(\'next »\'),
\'type\' => \'list\'
) );
// Display the pagination if more than one page is found
if ( $paginate_links ) {
echo \'<div class="pagination-centered">\';
echo $paginate_links;
echo \'</div><!--// end .pagination -->\';
}
}
}
从您的分页函数中我可以看到,您的
current
参数似乎也是罪魁祸首
ALTERNATIVE SOLUTION TO PROBLEM 3
你也可以看看
next_posts_link
和
previous_posts_link
. 请记住,对于自定义查询
$max_pages
中的参数
next_posts_link
应设置为分页才能正常工作。
next_posts_link( \'Older Entries\', $postslist->max_num_pages );