如何在我的网站上创建所有类别的分页列表?

时间:2016-05-27 作者:gelleproductions

我想显示一个带有分页的归档页面,该页面列出了我网站上的所有类别,每个链接都指向特定的类别归档页面。所以这就像是分类档案的档案页。

我的网站上的每个类别都有一个手动创建的自定义缩略图,以匹配该类别的永久链接。我已经有了一个布局设置来显示所有类别,但我是用一个自定义页面模板来完成的,所以没有分页。这意味着所有类别都显示在一个页面上,这有点烦人(我有100多个类别)。

我的当前存档是使用特定的自定义页面模板名称设置的page-catlist.php 但我愿意将其更改为任何其他类型的模板文件。

以下是我用于在一个页面上输出所有类别的当前代码:

$args = array(
  \'orderby\' => \'name\',
  \'order\' => \'ASC\'
);
$cats      = get_categories( $args );
$thm_pre   = \'http://example.com/images/thumbs/\';
$thm_end   = \'.png\';

foreach($cats as $cat) {
    $thumbnail = $thm_pre.$cat->slug.$thm_end;
    // output the loop HTML here
    // basically a list of category names & thumbs 
    // all linked to the cat URL by get_category_link()
}
我希望有更好的方法来做到这一点,这样我就可以添加自然分页,最好是使用WP PageNavi。任何帮助都将不胜感激!

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

分页术语/类别/标记列表非常容易,要实现这一点,您需要的信息非常少。

让我们看看我们需要

条款金额

每页的条款数量

  • get_terms()请注意get_terms() 已在版本4.5中更改)。您还可以使用get_categories() 如果你愿意,get_categories() 只是的包装函数get_terms()

    因此,首先我们需要计算条款的数量。为此,我们将使用count 中的参数get_terms()

    注:所有代码均未经测试,至少需要

    PHP 5.4

    WordPress 4.5

    您可以轻松地将其转换为PHP和WordPress的旧版本

    $taxonomy   = \'category\';
    $term_count = get_terms( 
        [
            \'taxonomy\'  => $taxonomy,
            \'fields\'    => \'count\'
        ]
    );
    
    现在我们知道了条款的数量,我们可以设置每页需要的条款数量,比如10

    $terms_per_page = 10;
    
    从上面,我们现在可以计算出我们将有多少页。此处的值将传递给requires pagination函数,在您的情况下,传递给wp_pagenavi()

    $max_num_pages = ceil( $term_count/$terms_per_page );
    
    在这种情况下,您将通过$max_num_pages 到分页功能

    下一部分将计算我们的偏移量。我们只想检索每页相关的术语数量,以保持优化。我们不需要每页100多个条款。只查询所需的10要快得多。所以,我们需要知道我们在哪一页上,从那开始,我们将计算一个偏移量。这将传递给get_terms(), 我会告诉你的get_terms() 从初始起点跳过多少个术语。

    一旦有了,我们还必须告诉get_terms() 只返回10个条款。让我们看看这篇文章的代码

    $current_page = get_query_var( \'paged\', 1 ); // Change to \'page\' for static front page
    $offset       = ( $terms_per_page * $current_page ) - $terms_per_page;
    $terms        = get_terms(
        [
            \'taxonomy\' => $taxonomy,
            \'order\'    => \'ASC\',
            \'orderby\'  => \'name\',
            \'number\'   => $terms_per_page,
            \'offset\'   => $offset
        ]
    );
    
    根据分页,每页只有10个术语。现在您可以正常地循环使用您的条款

    请注意,您需要确保您的get_terms() 作用

  • SO网友:cjbj

    我不熟悉WP PageNavi,但我怀疑它是在处理帖子,所以如果你在像你这样的循环中使用它,它可能很容易出错。也许css在设计html样式方面仍然有帮助。无论如何,设置自己的分页并不是那么困难。

    首先,您需要知道有多少类别:

    $cat_amounts=count($cats);
    
    接下来,您需要确定每页需要多少项:

    $cats_per_page=20;
    
    这将为您提供页数:

    $max_pages=ceil($cat_amounts/$cats_per_page);
    
    您需要的第三条信息是您所在的页面。您可以通过引入query_var 您的url将如下所示:www.example.com/yourcatpage?catpage=2

    在开始循环之前,需要知道调用哪个页面:

    $page_called=get_query_var ( $catpage, 1 )
    
    由此,可以调用要显示的第一个元素:

    $first_element=($page_called-1)*$cats_per_page)
    
    最后一个:

    $last_element=$page_called*$cats_per_page-1;
    
    最后一页可能包含以下内容$cats_per_page 类别,因此您还需要:

    if ($last_element > $cat_amounts) $last_element = $cat_amounts;
    
    现在,遍历$cats:

    for ($i=$first_element;$i=<$last_element;$i++) {
        //do your thing with $cats[$i];
    }
    
    循环完成后,您可以使用这些变量生成上一个/下一个标记或任何其他类型的导航。

    请注意,我实际上并没有测试此代码。考虑到数组中的第一个元素具有键0,我可能犯了一些错误。