1

如果我有一个名为“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

4

3 回答 3

0

Benj 我认为 WordPress 会自动为自定义帖子类型创建档案

于 2010-06-29T10:54:27.100 回答
0

好的......花了一些时间,但我想通了(可能有更优雅的解决方案)。

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) 在我的页面模板顶部,我检查自定义查询变量并相应地构建页面。(我应该能够使用内置的年份和月份,但无法让它们正常工作。未来的故障排除):

// 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();
}

感谢您的帮助,希望这对其他人有用!如果您有更简单/内置的方法来执行此操作,请告诉我。

于 2010-06-30T16:57:16.503 回答
0

我设法找到了一个更优雅/内置的解决方案。

诀窍在于“post_type=article”参数。如果您像这样创建重写:

'(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(),但至少您不需要创建自定义页面模板。

于 2011-09-01T07:21:37.823 回答