自定义post_types的基于日期的档案(WordPress 3.0)
-
01-10-2019 - |
题
如果我有一个名为“ my_type”的自定义帖子类型,则如何使WordPress制作基于日期的档案:
mysite.com/my_type/2010/
mysite.com/my_type/2010/07/
mysite.com/my_type/2010/07/28/
我正在寻找有关创建重写规则以及将URL链接到模板的提示。
谢谢!
更新:我在functions.php中尝试了以下内容(event_type_slug是其他地方定义的常数):
function event_rewrite_rules() {
global $wp_rewrite;
$new_rules = array(
EVENT_TYPE_SLUG."/([0-9]{4})/([0-9]{1,2})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1).'&monthnum='.$wp_rewrite->preg_index(2),
EVENT_TYPE_SLUG."/([0-9]{4})/$" => 'index.php?post_type=event&year='.$wp_rewrite->preg_index(1),
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'event_rewrite_rules');
重写规则以$ wp_rewrite->规则显示,但是当我导航到这些页面时,我会遇到404错误。如果我手动导航到 mysite.com/index.php?post_type=event&year=2010
, ,我被重定向到 mysite.com/2010?post_type=event
解决方案 2
好的...花了一些时间,但我想出了这一点(那里可能有更多优雅的解决方案)。
1)创建一个标准的WordPress页面以用作存档页面(并让我访问模板)。我将页面的slug定义为常数(event_archive_base),以便它在一个地方进行了刻板编码,并在其他任何地方引用。
2)制定自定义重写规则,以捕获该页面的URL并将其重定向到页面:
function event_date_queryvars($qvars) {
array_push($qvars, 'eyear', 'emonth');
return $qvars;
}
add_filter('query_vars', 'event_date_queryvars');
function event_date_rewrite_rules() {
// Adds rewrite rules for date-based event archives
global $wp_rewrite;
$new_rules = array(
EVENT_ARCHIVE_BASE."/([0-9]{4})/([0-9]{1,2})/?$" =>
"index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1)."&emonth=".$wp_rewrite->preg_index(2),
EVENT_ARCHIVE_BASE."/([0-9]{4})/?$" => "index.php?pagename=".EVENT_ARCHIVE_BASE."&eyear=".$wp_rewrite->preg_index(1),
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'event_date_rewrite_rules');
3)在我的页面模板的顶部,我检查自定义查询var,并相应地构建页面。 (我应该能够使用内置的年度和月份,但无法使它们正常工作。未来的故障排除):
// Was the page called with a specific year, month, or just plain?
$year = get_query_var('eyear');
$monthnum = sprintf('%02d', get_query_var('emonth'));
if ($monthnum) {
$list_type = 'Month';
$monthname = $month[$monthnum];
$heading = "Events from $monthname, $year";
} elseif ($year) {
$list_type = 'Year';
$heading = "Events from $year";
} else {
$list_type = 'AllPast';
$heading = get_the_title();
}
感谢您的帮助,希望这对别人有用!让我知道您是否有更简单/内置的方法来执行此操作。
其他提示
Benj我认为WordPress会自动为自定义帖子类型创建档案
我设法找到了一个更优雅/内置的解决方案。
诀窍是在“ post_type = artist”参数中。如果您创建类似的重写:
'(articles)/([0-9]{4})' => 'index.php?post_type=article&eyear=' . $wp_rewrite->preg_index(2)
然后,这将保持您的URL结构,但要通过默认的“存档”模板。然后,您将模板从默认值窃取到自己的存档模板。 (例如'Archive-Articles.php')
此功能实现了这一点(对我有用):
add_action("template_redirect", 'my_template_redirect');
// Template selection
function my_template_redirect()
{
global $wp;
global $wp_query;
if ($wp->query_vars["post_type"] == "article")
{
if (have_posts())
{
include(TEMPLATEPATH . '/archive-articles.php');
die();
}
else
{
$wp_query->is_404 = true;
}
}
}
您仍然需要创建自己的方法来处理年度/月/天的get_query_var(),但至少您不需要创建自定义页面模板。