我一直在尝试建立一种在网站上的系列文章中编写帖子的方法。这个想法是,每个帖子都可以属于自定义分类法中的另一个系列。我几乎可以按照我想要的方式设置了一切……一个例外。

注册分类学

这部分正在起作用。我将以下代码放入插件中:

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 );

这将“系列标签”添加到帖子下拉菜单中,并在“帖子编辑”屏幕上给我一个“系列标签”框。一切都在起作用,我可以将帖子标记为系列的一部分。问题在于下一节...

分类学中的列表项目

我的目标是允许读者一次从最古老的帖子开始,然后按时间顺序向前移动。这与典型的存档页面不同,因为我每个页面有10个帖子,但我显然想要 每个页面只有一个帖子 对于我的系列档案。

我创建了一个 taxonomy-series.php 在我的模板中归档。和它 一半 作品。第一页可以正常工作 - http://localhost/wp/series/my-test-series/ 显示该系列中的第一篇文章,其中包含页面底部的“下一个条目»”链接。到目前为止,一切都很好 ...

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

但是,如果我设置“博客页面最多显示:”在阅读页面上的“ 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);

无济于事...想法?提示?建议?

有帮助吗?

解决方案

你好 @eamann:

我随时需要在WordPress中使用URL做一些创意的事情,因为我认为url系统是迄今为止WordPress最重要的方面。我总是觉得我必须与WordPress进行战斗才能完成我想做的事情,而WordPress正在积极地与我与URL相关的背景。所以有了揭幕战...

考虑一下您的问题,我将提出一个建议,这不是您所要求的。如果您没有发现它是您正在寻找的东西,那就可以了,请不要任何人丢弃,因为我只是在尝试提供帮助。

分类学不是单一的增量,也没有元

您要做的事情之一是 分类系统不是单个增量订购 和它 没有元. 。例如,在3个文章系列中,您可能会发现 IDS 373, 411492;你可以弄清楚 373 = #1, 411 = #2492 = #3 但这都是偶然的,彼此相关。这就像试图将WordPress网站的根部定位在插件代码中,但您不知道将存储代码的深度。当然可以编写代码来弄清楚所有内容并映射它们,但这会变得棘手,我不确定您是否会从尝试弄清楚它而不是使用其他方法中获得太多价值。

明确分配您的页码

所以我建议的第一件事是 明确分配 您的 页码 对于您的系列中的每个帖子 使用元/自定义字段(我选择了该术语 installment 代替 page 因为这对我来说更有意义,但是显然您可以使用任何适合您用例的术语。)

分配页面/分期付款的数字可以完全控制您,因此,当您想重新订购时,您可以知道要修复的内容,只需更改数字即可。我假设您将有一个自定义字段名称的编辑metabox _installment 用于选择分期付款编号(如果您想获得创意,甚至可以通过Ajax管理/杂耍分期付款编号,以使您永远不会超出同步页。)

利用 $wp_rewrite->add_rule() 明确分配您的URL

我不会深入深入 $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转换为查询vars的挂钩

该解决方案的第二半使用 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[] 即使您想坚持原始体系结构,也分别是您所需的。祝您好运,并期待在您完成并在线上看到它!

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

其他提示

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

query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );

如果您无法使用自定义分类法进行此工作,请尝试使用本机(类别,标签)来检查与代码本身有关的问题是否与分类法或其他内容有关。

另外,我不确定您是否错过了此问题或排除在外,但是$ pepaged不是全局变量。必须将其获取为get_query_var('page')

一旦我对此面临问题,并通过拉头发将HRS的艰难时期带到了HRS。我谷歌搜索,没有找到有关主题的任何特定解决方案。我发现了几篇才华的文章,但他们并不满足我的问题。实际上,自定义分类档案页面分页取决于相关功能参数的某些设置。因此,我实际上是在这里分享我解决分类学存档分页问题的想法。

自定义分类档案页面分页所需的五件事完美地工作:

(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)如果在管理员静态头版中设置在“ new WP_Query($ args)”之前使用:

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

并使用 $query = new WP_Query( array( 'page' => $paged ) );

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

如果未设置静态头版,则应使用 page 参数in new WP_Query ($arg) 参数数组。

(4)使用WordPress paginate_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 班级。如果您使用bootstrap注入 pagination 上课 ul 借助JavaScript或jQuery,将输出出色的花式分页。

希望您现在可以在分类学存档模板中享受分页,而没有任何404问题:-)

许可以下: CC-BY-SA归因
scroll top