筛选并列出自定义分类的帖子

时间:2015-10-11 作者:madhushankarox

我有一个名为“owner”的自定义分类法,它有多篇文章作为所有者名称(用作类别),因此我可以按“owner”分类法筛选文章。

我正在尝试制作一个以字母“A”开头的所有所有者名称的索引页。我可以用下面的代码列出所有的所有者。

foreach ( get_terms( \'owner\' ) as $o ){
        $owner = $o -> name;
        if($owner[0] === \'A\'){
            // Coding here...
        }
}
我面临的问题是,我想在页面底部显示分页,因为有数百位作者都是带“a”的星星。

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

在我们研究分页之前,根据我在您的问题中所学的内容,您只需要以下术语开头A. 如果是,您可以使用name__like 中的参数get_terms 仅获取以开头的条款A. 请注意,参数的操作在Wordpress V3中进行了更改。7,因此您需要应用以下过滤器才能使其按预期工作(归功于@s\\u ha\\u dum,请参见他的答案here. 注意:代码需要PHP 5.4+)

add_filter( \'terms_clauses\', function ($clauses) 
{
  remove_filter( \'term_clauses\', __FUNCTION__ );

  $pattern = \'|(name LIKE )\\\'%(.+%)\\\'|\';
  $clauses[\'where\'] = preg_replace($pattern,\'$1 \\\'$2\\\'\',$clauses[\'where\']);
  return $clauses;
});

$terms = get_terms( \'ownwer\' [\'name__like\' => \'A\'] );
要为术语列表分页,我们需要:

当前页码

列表中的术语总数

总共有多少页

获取当前页面或任何页面的页码很容易。这将适用于所有页面,包括静态首页和单帖页面

if ( get_query_var( \'paged\' ) ) {
    $current_page = get_query_var( \'paged\' );
} elseif ( get_query_var( \'page\' ) ) {
    $current_page = get_query_var( \'page\' );
} else {
    $current_page = 1;
}
我们现在需要知道分类法中术语的总量。在这里,我们可以使用wp_count_terms(), 其中使用get_terms() 或使用get_terms() 它本身请记住,如果我们使用筛选器按特定字母/名称获取术语,则该筛选器将应用于此运行get_terms()/wp_count_terms() 我们正在利用闭包

$terms_count = get_terms( \'owner\', [\'name__like\' => \'A\', \'fields\' => \'count\'] );
现在我们有了符合我们标准的条款总数。记住,如果你要使用wp_count_terms(), 只需记住设置hide_empty 如果不需要包括空术语,则为true。默认情况下,wp_count_terms() 将此设置为false

现在我们可以计算最大页数

// Set the amount of terms we need to display per page
$terms_per_page = 10;
// Get the total amount of pages
$max_num_pages = $terms_count / $terms_per_page;
要获取到下一页和上一页的分页链接,非常简单。分页函数从任何查询中唯一需要知道的是最大页数,而不是其他。它不需要知道应该分页什么。所以我们可以简单地使用next_posts_link()previous_posts_link() 功能。您还可以使用paginate_links() 甚至可以编写自己的函数来满足您的需要。记住要通过$max_num_pages 作为分页功能的最大页数

next_posts_link( \'Next terms\', $max_num_pages );
previous_posts_link( \'Previous terms\' );
我们唯一需要做的就是分页get_terms(), 这也很容易。我们将利用offset 用于根据第页和第页偏移术语的参数number 获取每页所需的条款数量

// Calculate offset
$offset = ( $current_page == 1) ? 0 : ( ($current_page - 1) * $terms_per_page );
// Setup our arguments
$args = [
    \'number\' => $terms_per_page,
    \'offset\' => $offset
];
我们现在可以把所有的东西放在一起了

在我们开始之前,有几个重要的注意事项

所有代码都未经测试

该代码至少需要PHP 5.4,这是您在撰写本文时应该运行的最低PHP版本

根据需要修改并撕开

最后,这是代码

add_filter( \'terms_clauses\', function ($clauses) 
{
  remove_filter( \'term_clauses\', __FUNCTION__ );

  $pattern = \'|(name LIKE )\\\'%(.+%)\\\'|\';
  $clauses[\'where\'] = preg_replace($pattern,\'$1 \\\'$2\\\'\',$clauses[\'where\']);
  return $clauses;
});

$taxonomy = \'owner\';

$terms_count = get_terms( $taxonomy, [\'name__like\' => \'A\', \'fields\' => \'count\'] );
if ( $terms_count && !is_wp_error( $terms ) ) {

    if ( get_query_var( \'paged\' ) ) {
        $current_page = get_query_var( \'paged\' );
    } elseif ( get_query_var( \'page\' ) ) {
        $current_page = get_query_var( \'page\' );
    } else {
        $current_page = 1;
    }


    // Set the amount of terms we need to display per page
    $terms_per_page = 10;
    // Get the total amount of pages
    $max_num_pages = $terms_count / $terms_per_page;

    // Calculate offset
    $offset = ( $current_page == 1) ? 0 : ( ($current_page - 1) * $terms_per_page );
    // Setup our arguments
    $args = [
        \'number\' => $terms_per_page,
        \'offset\' => $offset,
        \'name__like\' => \'A\'
    ];
    $terms = get_terms( $taxonomy, $args );

    // Do what you need to do with $terms

    next_posts_link( \'Next terms\', $max_num_pages );
    previous_posts_link( \'Previous terms\' );

}

SO网友:gloria

如果您只想直观地限制显示的名称的数量,那么可以使用javascript或jQuery和CSS将结果分页为较小的块,供访问者阅读。但这不会创建真实、独特的页面。

我将用一段代码来更新这个答案,我使用该代码将一个长列表限制为X个项目数,您可以使用上一个/下一个链接进行浏览,但也可以轻松地向其中添加编号分页。

否则,快速搜索产生了该(WordPress)插件,但我尚未对其进行测试,并且不确定是否与当前WP版本兼容:http://wordpress.mfields.org/plugins/taxonomy-list-shortcode/它似乎以一个短代码的形式精确地实现了您想要的(PHP)。

更新:我从某处清理了大部分代码,并对其进行了修改以满足我的需要。在我的应用程序中,我使用函数来禁用和启用元素等,我在这里将其还原为直接的jQuery,因此要考虑到可能有一段或另一段自定义代码仍然存在,需要进行更改才能使用您的东西。

在jQuery中:

var paginate_list = function(items) {
    var pageSize = items; // How many items per page
    var numberOfPages = Math.ceil(($(\'.lists li\').length)/pageSize); // I used list items but you can use anything, this counts how many elements in total, and divides by the previous to know how many pages total
    var pageCounter = $("#current-page"); // I store the current page number in a hidden input value for my particular situation but you can keep track of it anyway else
    var prev = $(\'#navigation .key-prev\');
    var next = $(\'#navigation .key-next\'); // the navigation buttons
    pageCounter.val(1); // initialize to page 1, also peculiar to my application
    prev.attr(\'disable\', true); // disable prev button if page 1
    if ( numberOfPages <= 1 ) {
        next.attr(\'disable\', true); // disable next if only 1 page
    }
    next.on(\'click\', function () {
        // calculate the list offset
        $(".lists li:nth-child(-n+" + ((pageCounter.val() * pageSize) + pageSize) + ")").show();
        $(".lists li:nth-child(-n+" + pageCounter.val() * pageSize + ")").hide();
        pageCounter.val(Number(pageCounter.val()) + 1); // update page counter
        if (pageCounter.val() != 1) {
            prev.attr(\'disable\', false); // enable previous button
        }
        if (pageCounter.val() == numberOfPages) {
            $(this).attr(\'disable\', true); // disable the next button when you reach the end
        }
    });
    prev.on(\'click\', function () {
        // the same in reverse
        pageCounter.val(Number(pageCounter.val()) - 1);
        $(".lists li").hide();
        $(".lists li:nth-child(-n+" + (pageCounter.val() * pageSize) + ")").show();
        $(".lists li:nth-child(-n+" + ((pageCounter.val() * pageSize) - pageSize) + ")").hide();
        if (pageCounter.val() == 1) {
            $(this).attr(\'disable\', true);
        } 
        if (pageCounter.val() < numberOfPages) {
            next.attr(\'disable\', false);
        } 
    });
};
它可以处理如下列表:

<ul class="lists">
  <li><!-- your first item --></li>
  <li><!-- your second item --></li>
  <li><!-- your third item --></li>
  <li><!-- your fourth item etc... --></li>
</ul>

相关推荐

如何控制根据Taxonomy术语显示什么模板?

我正在建立一个商业目录,并将给出一些背景,然后在最后有2个问题。The development URL is: http://svcta.lainternet.biz/The website I am rebuilding is: https://www.visitsimivalley.com/当前网站要求每个分类法类型具有唯一的业务概要文件。例如,如果您是一家酒店,并且您也有会议室和婚礼场地,那么您最终会得到3个列表,一个用于酒店,一个用于会议,一个用于婚礼。我希望有一个主配置文件,其中包含我们将显示的