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


9

我想显示一个带有分页的存档页面,其中列出了我网站上的所有类别,并且每个链接都转到该特定类别的存档页面。因此,这就像类别档案的档案页面。

我网站上的每个类别都有一个手动创建的自定义缩略图,以匹配该类别的永久链接。我已经有一个布局设置来显示所有类别,但是我正在使用自定义页面模板进行此操作,因此没有分页。这意味着所有类别都显示在单个页面上,这有点烦人(我有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。任何帮助将不胜感激!


那会很费力;)
Sumit 16'May

@Sumit实际上非常容易,几乎不需要付出任何努力;-)
Pieter Goosen

Answers:


2

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

让我们看看我们需要

  • 条款数量

  • 每页的术语数量

  • get_terms()请注意,get_terms()版本4.5中的用法已更改)。您也可以get_categories()根据需要使用get_categories()仅仅是包装函数get_terms()

因此,首先我们需要计算条件的数量。为此,我们将countget_terms()

注意:

  • 所有代码未经测试,至少需要

    • PHP 5.4

    • WordPress 4.5

您可以轻松地将其转换为与旧版本的PHP和WordPress一起使用

$taxonomy   = 'category';
$term_count = get_terms( 
    [
        'taxonomy'  => $taxonomy,
        'fields'    => 'count'
    ]
);

现在我们知道了术语数量,我们可以设置每页所需的术语数量,比如说10

$terms_per_page = 10;

从上面的内容,我们现在可以算出将要拥有的页面数。在您的情况下,此处的值将传递给require分页函数,以传递给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()函数返回的术语。


酷;)但是我没有如何建立分页标记?wp_pagnavi()在这种情况下真的可以工作吗?
Sumit

1
@Sumit这将一起工作next_posts_link()previous_posts_link()paginate_links()。它也可以与任何可以将整数值传递给该函数的分页函数一起使用,例如我的分页函数here。至于wp_pagenavi(),我不能说是或否,因为我真的不知道该功能如何工作,您将需要对其进行测试。在我上面的代码中,$max_num_pages保存页数,它是一个整数值,是您需要传递给函数以计算分页的此变量
Pieter Goosen

1
特别感谢您和@cjbj,因为我认为这两种解决方案都可以使用。环顾四周后,我发现了一些WP-PageNavi东西,解释了它是如何工作的...当然,始终可以滚动自定义分页,所以无论哪种方式,我都认为这些解决方案是最好的。
gelleproductions's

1

我对WP-PageNavi并不熟悉,但是我怀疑它假定是在处理帖子,因此,如果在像您这样的循环中使用它,它可能很容易搞砸。也许CSS可能仍然有助于样式化html。无论如何,设置您自己的分页并不困难。

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

$cat_amounts=count($cats);

接下来,您需要确定每页要多少个项目:

$cats_per_page=20;

这将为您提供页面数量:

$max_pages=ceil($cat_amounts/$cats_per_page);

您需要的第三条信息是您所在的页面。您可以通过引入来跟踪此情况。query_var您的网址如下所示: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时,我可能会犯一些错误。


有一种更简单,更干净,更快速的方法;-)
Pieter Goosen

实际上,我认为我们的方法没有什么不同。您让MySQL处理偏移量,我将其留给PHP。
cjbj
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.