如果我有一个名为“ 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(),但至少您不需要创建自定义页面模板。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top