使用自定义分类归档文件修复分页

时间:2010-09-11 作者:EAMann

我一直在尝试建立一种在我的网站上写系列文章的方法。其想法是,每个帖子可以属于自定义分类法中的不同系列。我已经按我想要的方式准备好了一切。。。只有一个例外。

注册分类法此部分正在工作。我已将以下代码删除到插件中:

function jdm_build_series_taxonomy() {
    $labels = array(
        \'name\' => _x(\'Series Labels\', \'taxonomy general name\'),
        \'singular_name\' => _x(\'Series Label\', \'taxonomy singular name\'),
        \'search_items\' => __(\'Search Series Labels\'),
        \'popular_items\' => __(\'Popular Series Labels\'),
        \'all_items\' => __(\'All Series Labels\'),
        \'parent_item\' => __(\'Parent Series Label\'),
        \'parent_item_colon\' => __(\'Parent Series Label:\'),
        \'edit_item\' => __(\'Edit Series Label\'),
        \'update_item\' => __(\'Update Series Label\'),
        \'add_new_item\' => __(\'Add New Series Label\'),
        \'new_item_name\' => __(\'New Series Label Name\')
    );

    register_taxonomy(
        \'series\',
        \'post\',
        array(
            \'hierarchical\' => true,
            \'label\' => __(\'Series\'),
            \'labels\' => $labels,
            \'query_var\' => true,
            \'rewrite\' => true
        )
    );
}

add_action( \'init\', \'jdm_build_series_taxonomy\', 0 );
这增加了;“系列标签”;到Posts下拉菜单,并给我一个;“系列标签”;编辑后屏幕上的框。一切正常,我可以将帖子完美地标记为一个系列的一部分。问题在于下一节。。。

在分类法中列出项目,我的目标是让读者一次浏览一系列文章,从最旧的文章开始,按时间顺序向前看。这与典型的归档页面不同,因为我的归档每页有10篇文章,但我显然希望我的系列归档每页只有一篇文章。

我创造了一个taxonomy-series.php 我的模板中的文件。它有一半起作用。第一页就可以了-http://localhost/wp/series/my-test-series/ 显示系列中的第一篇文章,其中包含;下一个条目»";页面底部的链接。到目前为止,很好。。。

但当您单击;下一个条目»";然后转到下一页(http://localhost/wp/series/my-test-series/page/2/) 这是a)错误的文章和b)错误的模板!

然而,如果我设置;博客页面最多显示:“quot;“至”;1“;在阅读页面上(通常设置为10),一切正常。第2页显示第二篇文章,第3页显示第三篇文章,以此类推。

所以要强制分类法归档页面在每个页面上只显示一篇文章,我需要仔细检查什么?我尝试了以下方法:

$new_query = wp_parse_args(
    $query_string, 
    array(
        \'posts_per_page\' => 1,
        \'paged\' => $paged
    )
);

query_posts($new_query);
                                                                                          
以及

query_posts($query_string.\'&posts_per_page=1&paged=\'.$paged);
没有用。。。想法?小费?建议?

3 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@EAMann:

每当我需要在WordPress中对URL做一些创造性的事情时,我都会退缩,因为URL系统在我看来是WordPress中最不雅观的方面。我总是觉得我必须与WordPress抗争,才能让它做我想做的事情,WordPress正在积极地与URL相关的内容进行反击。所以有了这个开场白。。。

仔细考虑你的问题,我会提出一个建议,但这并不是你想要的。如果你找不到你想要的,没关系,请不要投票反对,因为我只是想帮忙。

分类法不是单一增量,也没有元the taxonomy system doesn\'t a single increment ordering 而且doesn\'t have meta. 例如,在3篇文章系列中,您可能会发现ID第页,共页373, 411492; 你可以理解373 = #1, 411 = #2492 = #3 但这都是偶然的,都是相互关联的。这就像试图在插件代码中定位WordPress站点的根,但您不知道您的代码将存储多少层。当然,您可以编写代码来找出所有问题并将其映射,但这很棘手,我不确定您是否会从尝试找出问题而不是使用不同的方法中获得多大价值。

明确指定页码,因此我建议的第一件事是you explicitly assign your page numbers for each post in your series 使用post元/自定义字段(我选择了术语installment 而不是page 因为这对我来说更有意义,但很明显,您可以使用适合您的用例的任何术语。)

分配页码/分期付款编号的好处是你可以完全控制,这样你就知道当事情不正常时要修复什么,如果你想重新排序,只需更改编号即可。我假设您将有一个自定义字段名的编辑元框_installment 用于选择分期付款编号(如果您想发挥创意,它甚至可以通过AJAX管理/处理分期付款编号,这样您就不会出现页面不同步的情况。)

使用$wp_rewrite->add_rule() 为了明确分配你的URL,我不会深入讨论,因为我知道你通常都有疯狂的WordPress技能,所以我只想指出$wp_rewrite->add_rule() 是让这一切都发挥作用的关键。其他一切都只是围绕该函数的结果提供支持。使用init 挂钩分配URL规则:

<?php
add_action(\'init\', \'add_series_installment_url\');
function add_series_installment_url() {
  global $wp,$wp_rewrite;
  $wp->add_query_var(\'series\');
  $wp->add_query_var(\'installment\');
  $wp_rewrite->add_rule(\'series/([^/]+)/(installment-\\d+)\',\'index.php?series=$matches[1]&installment=$matches[2]\',\'top\');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}
使用parse_query 钩子将URL转换为查询变量

此解决方案的下半部分使用parse_query 我知道你很熟悉的钩子。通常,我们捕获query_vars 定义于init 并通过URL规则捕获,并将其转换为查询WordPress帖子所需的内容taxonomy+term 处理您的seriesmeta_key+meta_value 处理明确分配的分期付款/页:

<?php
add_action(\'parse_query\', \'apply_series_installment_to_query\');
function apply_series_installment_to_query(&$query) {
  if (isset($query->query[\'series\']) && isset($query->query[\'installment\']) && 
     preg_match(\'#^installment-(\\d+)$#\',$query->query[\'installment\'],$match)) {
    $query->query_vars[\'post_type\'] = \'post\';
    $query->query_vars[\'taxonomy\'] = \'series\';
    $query->query_vars[\'term\'] = $query->query[\'series\'];
    $query->query_vars[\'meta_key\'] = \'_installment\';
    $query->query_vars[\'meta_value\'] = $match[1];
    unset($query->query_vars[\'series\']);            // You don\'t need this
    unset($query->query_vars[\'installment\']);       // or this
    unset($query->query_vars[\'name\']);              // or this
  }
}
通常我会更深入地解释一个答案,但现在已经很晚了,在过去的48小时里,我睡得太少了,最重要的是我知道你能找到答案,你可能只需要我在这里提到的一件事。

所以我希望你喜欢这个解决方案。即使你不知道这两部分initparse_query 还有$wp_rewrite->add_rule() 还有$query->query_vars[] 即使您想坚持原来的体系结构,也需要分别使用它们。祝你好运,并期待着看到它时,你已经完成和在线!

无论如何,希望这有帮助。

SO网友:Rarst

下面是我用来修改类别和标签归档页面上帖子数量的代码:

query_posts( array_merge( array(
\'posts_per_page\' => 1
), $wp_query->query ) );
如果无法使用自定义分类法进行此操作,请尝试使用本机(类别、标记)来检查问题是否出在代码本身、分类法或其他方面。

此外,我不确定您是否遗漏了这一点,但$paged不是全局变量。它必须作为get\\u query\\u var(“paged”)获取

SO网友:saifulmasud

有一次,我遇到了这个问题,通过拉扯头发度过了一个又一个艰难时期。我在google上搜索了一下,没有找到关于这些主题的任何具体解决方案。我找到了几篇天才的文章,但他们并不能解决我的问题。实际上,自定义分类法归档页面分页取决于相关函数参数的某些设置。因此,我将在这里分享我对解决分类法归档分页问题的想法。

要使自定义分类法归档页面分页工作正常,您需要五件事:

(1)不要放置exclude_from_search 参数键组件register_post_type 参数或设置它\'exclude_from_search\' => false. 默认设置为false.

(2)将与自定义帖子类型集一起使用的分类法\'taxonomies\' => \'custom_taxonomy_name\'register_post_type 参数或使用register_taxonomy_for_object_type() 直接地自定义分类法仍需要向注册register_taxonomy().

(3)内部查询时new WP_Query ($args)

i)如果未在管理中设置static front page 使用之前new WP_Query($args)

$paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
和使用$query = new WP_Query( array( \'paged\' => $paged ) );

ii)如果在管理静态首页中设置,请在“新WP\\U查询($args)”之前使用:

  $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;
和使用$query = new WP_Query( array( \'page\' => $paged ) );

记住使用posts_per_pagepaged 中的参数new WP_Query($arg) 参数数组。

如果未设置静态首页,则应使用page 中的参数new WP_Query ($arg) 参数数组。

(4)使用Wordpresspaginate_links( $args ) 类似以下示例的函数用于在存档模板文件中呈现分页。

<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
                  \'base\' => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) ),
                  \'format\' => \'?paged=%#%\',  or   \'/paged=%#%\',  // if using pretty permalink
                   \'current\' => max( 1, get_query_var(\'paged\') ),
                   \'total\' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of  new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
 ?>
(5)该paginate_links() 函数输出ul li 使用列出page-numbers 班如果使用引导注入pagination 类到ul 在javascript或jquery的帮助下,将输出一个漂亮的分页。

希望您现在可以享受分类法归档模板中的分页,而不会出现任何404问题:-)

结束

相关推荐