分页:在WordPress安装中找不到

时间:2015-05-21 07:32:05

标签: php wordpress pagination

我的问题是我在Wordpress中使用的分页。我使用了插件 WP Pagenavi 。我不确定它有什么问题。

我使用此代码找到了问题的答案:

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=15'.'&paged=' . $paged); ?>

但令我失望的是,当我将posts_per_page减少到5时,我可以让分页工作到第2页,但是当我点击第3页等等时,WordPress无法找到它。我使用了我研究的另一种解决方案:

<?php
$limit = '5';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('cat=4&showposts=' . $limit . '&paged=' . $paged);
$wp_query->is_archive = true; $wp_query->is_home = false;
?>

它仍然没有帮助。我不想触摸 functions.php 。我只编辑 category.php

检查下面的代码块:

    <?php if (is_category('category1')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=1&posts_per_page=15'.'&paged=' . $paged); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else if (is_category('category2')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=2&posts_per_page=15'.'&paged=' . $paged); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else if (is_category('category3')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=3&posts_per_page=5'.'&paged=' . $paged); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else if (is_category('category4')) { ?>

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=5'.'&paged=' . $paged); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<!-- SOME CODE TO POST THE POST -->

<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>

<?php } else { ?>

<!-- SOME CODE -->

<?php } ?>

请注意,category1和category2显示5个帖子,而其他2个类别将显示15个帖子。这些都属于category.php。我不想使用设置&gt;中设置的帖子数量。读数。

如果您认为 if语句并且还将 cat ID 放在一边是多余的,那么它就不会获得该类别名称的帖子。

更新

我使用了这段代码:

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php $args = array ('post_type' => 'post','cat' => '4','posts_per_page' => '5','paged' => $paged);?>
<?php $my_query = new WP_Query ($args);?>

再次,它工作但它只显示两页!我甚至不知道第3页的位置,据说应该有第3页。

3 个答案:

答案 0 :(得分:1)

您的代码存在一些严重问题

  • 永远不要使用query_posts。它破坏了许多插件和功能所依赖的主要查询对象,它也打破了分页并无声地失败,因此在失败时调试分页真的很难。如果您确实必须使用自定义查询,请改用WP_Query。您应该花时间阅读this post和所有链接的帖子。这非常有用,因为它告诉您为什么不应该使用query_posts以及何时应该使用自定义查询,何时不使用

  • 这一点与第一个和链接的帖子相关联。您绝不能更改主查询以在主页或任何类型的存档页面上使用自定义查询。这总是会引起比实际解决的问题更多的问题。始终使用pre_get_posts在运行之前更改主查询。通过这种方式,您可以让主查询正确处理所有繁重的工作,而不会让您不必担心。

现在,要解决您的问题:

  • 首先,删除所有查询,然后将此代码添加到您的category.php中(请记住替换您的分页功能,wp_pagenavi()

    if ( have_posts() ) {
        while ( have_posts() ) {
        the_post();
    
            // Your loop with template tags and html mark up
    
        }
        wp_pagenavi();
    }
    

    您会立即看到您的类别信息显示正确,但帖子数量与您在阅读后设置的内容相同

  • 我们现在将使用pre_get_posts来更改每个类别的帖子数量。为此,请将以下代码添加到functions.php(需要PHP 5.3+且代码未经测试

    add_action( 'pre_get_posts', function ( $q )
    {
        if (        !is_admin() // Very important, otherwise back end queries will be affected as well
              && $q->is_main_query() // Very important, we just need to modify the main query
              && $q->is_category() // Only target category pages
        ) {
            // Check on which category page we are and set posts_per_page accordingly
            if ( $q->is_category( array( 1, 2 ) ) )
                $q->set( 'posts_per_page', 15 );
    
            if ( $q->is_category( array( 3, 4 ) ) )
                $q->set( 'posts_per_page', 5 );
        }
    });
    

基本上应该这样做。

答案 1 :(得分:0)

我们终于找到了最终答案和工作代码!

如果您阅读了Pieter Goosen先生的上述答案,它将对您有所帮助。它真的帮助了我。所以,我会给你最后的答案。这实际上是每个类别中的自定义帖子数,不考虑设置中设置的内容。

所以在我的category.php中

    <?php if (is_category('category1')) { ?>
    <?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } else if (is_category('category2')) { ?>

<?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } else if (is_category('category3')) { ?>

<?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } else if (is_category('category4')) { ?>

<?php if ( have_posts() ) {
    while ( have_posts() ) {
    the_post();

        // Your loop with template tags and html mark up

    }
    wp_pagenavi();
}
?>

<?php } ?>

WHERE category1和category2 将显示 5个帖子 category3 category4 将显示 15个帖子

这就是你要在你的functions.php。

中放置的内容
add_action( 'pre_get_posts', function($q) {
    if (!is_admin() && $q->is_main_query() && $q->is_category()) {
        if ($q->is_category( array(1,2) )) {
            $q->set('posts_per_page', 5);
        }
        if ($q->is_category( array(3,4) )) {
            $q->set('posts_per_page', 15);
        }
    }
    return;
});

WHERE 数组中的数字是类别ID。

如果你比较我的代码和Sir Pieter's,它几乎是相同的但是我在return;关闭之前添加了add_action()。但我引用了彼得先生所说的话:

  

你应该回来真的很奇怪。 pre_get_posts是一个   行动,而不是过滤器。但无论如何,很高兴它解决了

如果它仍然不适合你,我的永久链接设置为:

http://www.example.com/sample-post/[/%postname%/]

我还有一个 WP No Category Base 插件,用于消除我的类别网址中的 / category / 。因此,它不是 www.example.com/category/category1 ,而是 www.example.com/category1

答案 2 :(得分:0)

假设这对像我一样使用 DIVI CHILD THEME 的人有帮助!

我终于通过搜索 divi pagination 找到了解决方案。

事实上,就我而言,我建立了一个divi儿童主题。但是,我的自定义类别页面中的每页发布次数设置为3,但是我的 divi&gt;主题选项“类别”页面上显示的帖子数量设置为6

为什么页面3显示错误404.所以,我将其设置为1.

我在帖子中看到设置&gt;中的“博客页面最多显示”阅读选项必须在post_per_page自定义查询下(对于主页),否则,它会创建一个404页面。

但是,看起来显示在Divi选项中的帖子数量,覆盖博客页面最多显示。为什么在我的category.php页面中,我被困在第3页。

我留下了关于divi theme child的自定义category.php页面的小代码:

<?php 
//query{
    //print_r(get_queried_object());
    $category = get_queried_object();
    $the_cat_nicename = $category->slug;
    $the_cat_name = $category->name;

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

    $args_s = new WP_Query(array(
    'post_type' => 'post',
    'category_name' => $the_cat_nicename,
    'posts_per_page' => 3,
    'paged' => $paged,
    'orderby'=>'date',
    'order'=>'DESC'));
//query}
if ( $args_s->have_posts())
{
    echo $the_cat_name;
    echo '<br/>';
    while ( $args_s->have_posts())
    {
        $args_s->the_post();
        $the_id=get_the_ID($post->ID);
        echo $the_id.'<br/>';
    }
    if ($args_s->max_num_pages > 1) 
    {
        echo get_next_posts_link( $GLOBALS['older_post_lang'], $args_s->max_num_pages );
        echo get_previous_posts_link( $GLOBALS['newer_post_lang'] );
    }
}
//wordpress _have_posts}
?>

不要忘记将“分类”页面上显示的帖子数量设置为1 Divi&gt;主题选项