是否为作者和分页自定义发布类型重写规则?

时间:2010-10-22 作者:banesto

我使用的是WordPress 3.0.1,我制作了一个自定义的帖子类型,名为\'dienasgramatas\'. 我的插件还为显示此帖子类型的所有帖子制定了自定义重写规则,甚至还为查询来自定义作者的具有此帖子类型的帖子制定了自定义永久链接结构,但我无法创建分页规则:

这是一个有效的方法:

$new_rules[\'dienasgramatas\' . \'/([^/]+)/?$\'] = 
  \'index.php?post_type=dienasgramata&author_name=\' . $wp_rewrite->preg_index(1);
它给出了以下重写规则:

[dienasgramatas/([^/]+)/?$] => index.php?post_type=dienasgramata&author_name=$matches[1]
但这个:

$new_rules[\'dienasgramatas\' . \'/([^/]+)/page/?([0-9]{1,})/?$\'] = 
  \'index.php?post_type=dienasgramata&author_name=\' . $wp_rewrite->preg_index(1). 
  \'&paged=\' . $wp_rewrite->preg_index(2);
输出此(错误)重写规则:

[dienasgramatas/([^/]+)/page/?([0-9]{1,})/?$] => 
  index.php?dienasgramata=$matches[1]&paged=$matches[2]
正如你所见,post_type 被忽略,此重写规则无法正常工作。

有人能告诉我为什么它不起作用或者如何纠正它吗?

函数的筛选器:

add_filter(\'generate_rewrite_rules\', \'add_rewrite_rules\');
全部功能如下:

function add_rewrite_rules($wp_rewrite) {

$new_rules[\'dienasgramatas\' . \'/([^/]+)/?$\'] = \'index.php?post_type=dienasgramata&author_name=\' . $wp_rewrite->preg_index(1);
$new_rules[\'dienasgramatas\' . \'/([^/]+)/page/?([0-9]{1,})/?$\'] = \'index.php?author_name=\' . $wp_rewrite->preg_index(1) . \'&paged=\' . $wp_rewrite->preg_index(2) . \'&post_type=dienasgramata\';

$wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);
return $wp_rewrite;
}

基本需求是我想去

www.example.com/dienasgramatas/admin/page/2
并通过“admin”获取post\\u type=“dienasgramata”和第二页的帖子(例如,10个帖子偏移量)。不使用第/2页重写规则可以正常工作。可能是正则表达式问题或查询变量问题,也可能是重写规则的分配方式问题。

现场示例:http://dev.fiicha.lv/jb/dienasgramatas/juris/ - 工作正常http://dev.fiicha.lv/jb/dienasgramatas/juris/page/2/ - 不起作用

底部是所有重写规则和查询变量

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

你好@banesto:

我认为简单的答案可能是,您需要在较短的URL之前指定分页URL,但由于我没有测试它,所以我不能百分之百确定。

也就是说,我总是遇到很多麻烦\'generate_rewrite_rules\' 钩我相信一个比我更好的开发人员可以让它工作,但对我来说,使用add_rewrite_rule() 功能,所以这就是我如何显示您必须使您的URL路由。

这里有一个插件,可以按照您的要求执行register_post_type() 调用仅允许此插件在我的WordPress测试安装中工作;您可以将其替换为您自己的):

<?php
/*
Plugin Name: Dienasgramatas Urls
Version: 1.0
Author: Mike Schinkel
Author URI: http://mikeschinkel.com/
*/

if (!class_exists(\'Dienasgramatas_Urls\')) {
  class Dienasgramatas_Urls {
    static function init() {
      $post_type = \'dienasgramatas\' ;
      register_post_type($post_type,
        array(
          \'label\'           => \'Dienasgramatas\',
          \'public\'          => true,
          \'show_ui\'         => true,
          \'query_var\'       => \'dienasgramatas\',
          \'rewrite\'         => array(\'slug\' => \'dienasgramatas\'),
          \'hierarchical\'    => false,
          \'supports\'        => array(\'title\',\'editor\',\'custom-fields\'),
        )
      );

      add_rewrite_rule("{$post_type}/([^/]+)/page/?([2-9][0-9]*)",
        "index.php?post_type={$post_type}&author_name=\\$matches[1]&paged=\\$matches[2]", \'top\');

      add_rewrite_rule("{$post_type}/([^/]+)",
        "index.php?post_type={$post_type}&author_name=\\$matches[1]", \'top\');

    }
    static function on_load() {
      add_action(\'init\',array(__CLASS__,\'init\'));
    }
    static function register_activation_hook() {
      self::init();
      flush_rewrite_rules(false); 
    }
  }
  Dienasgramatas_Urls::on_load();
}
当然,无论何时添加重写规则,都需要刷新重写规则,否则它们根本无法工作。理想情况下,您不想刷新每个页面加载的规则,因此标准的方法是在插件的激活挂钩中。因此,我为您创建了一个插件,但可以随意使用add_rewrite_rule() 调用主题的functions.php 通过单击管理控制台“设置>永久链接”部分中的“保存更改”手动刷新URL。

结束

相关推荐