为什么“ / page / 2 /”不起作用?


11

最终使分页可以使用下面的代码,但是现在分页链接到/ videos / page / 2 /,该链接不存在。如何使第2页正常工作?

<?php
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('post_type=videos&showposts=1'.'&paged='.$paged);

while ($wp_query->have_posts()) : $wp_query->the_post();
  //display stuff
endwhile;           

php  wp_pagenavi();
 ?>

我不建议像这样覆盖主要查询,您是否考虑过使用pre_get_posts?然后,您可以使用内置的分页代码而不是编写自己的分页代码,并且可以简化为标准的发布循环
Tom J Nowell

另外,WordPress为帖子类型提供了一个标准的存档页面,因此您应该已经有一个/videos/可以加载的帖子存档,archive-videos.php不需要搞乱查询
Tom J Nowell

Answers:


15

找到了答案:

经过全天的调试,通过wordpress核心,我设法解决了这个问题。

基本上,您不能以相同的名称拥有PAGE和CUSTOM POST TYPE。如果这样做,永久链接重写规则将变得混乱并触发404。

我使用的一个非常简单的解决方案是:列出自定义帖子类型的页面称为复数形式(例如产品),而实际的帖子类型名称则为单数形式(例如product)。所以他们不会冲突,一切都很好。

完成!希望这可以节省人们的时间。


6
我想,不只是自定义帖子,您也不能拥有同名的帖子和页面。
罗特威克·甘古德

4

很长一段时间后,我找到了解决该问题的方法(感谢franzblog)。

如果您使用的是4.2或更高版本,则需要在functions.php文件中添加以下行:

add_filter( 'redirect_canonical', 'custom_disable_redirect_canonical' );
function custom_disable_redirect_canonical( $redirect_url ) {
    if ( is_paged() && is_singular() ) $redirect_url = false; 
    return $redirect_url; 
}

现在一切正常!


1

您无法使用相同名称的PAGE和CUSTOM POST TYPE

也许几年前是不可能的,但是现在您可以了。

首先,将此行添加$args到您的帖子类型中:

'has_archive' => false,
'rewrite'     => array(
                 'slug'       => 'your slug', // if you need slug
                 'with_front' => false,
                 ),

其次,在functions.php添加操作中:

add_action('init', 'custom_rewrite_basic');
function custom_rewrite_basic() {
    global $wp_post_types;
    foreach ($wp_post_types as $wp_post_type) {
        if ($wp_post_type->_builtin) continue;
        if (!$wp_post_type->has_archive && isset($wp_post_type->rewrite) && isset($wp_post_type->rewrite['with_front']) && !$wp_post_type->rewrite['with_front']) {
            $slug = (isset($wp_post_type->rewrite['slug']) ? $wp_post_type->rewrite['slug'] : $wp_post_type->name);
            $page = get_page_by_slug($slug);
            if ($page) add_rewrite_rule('^' .$slug .'/page/([0-9]+)/?', 'index.php?page_id=' .$page->ID .'&paged=$matches[1]', 'top');
        }
    }
}

function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
    global $wpdb;

    $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) );

    return ($page ? get_post($page, $output) : NULL);
}

不要忘记在仪表板中刷新规则。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.