Архивы на основе даты для пользовательских post_types (wordpress 3.0)

Если у меня есть собственный тип сообщения с именем «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


person Benj    schedule 29.06.2010    source источник


Ответы (3)


Benj Я думаю, что WordPress автоматически создает архивы для пользовательских типов сообщений.

person Mamaduka    schedule 29.06.2010
comment
Если это так, я не могу их найти ... Следующее существует: mysite.com/2010/?post_type=event, но это указывает на стандартную страницу архива и просто фильтрует на основе события. Это не дает мне структуру URL, которую я ищу. - person Benj; 29.06.2010

ОК ... потребовалось некоторое время, но я понял это (могут быть более элегантные решения).

1) Создайте стандартную страницу WordPress, которая будет служить страницей архива (и даст мне доступ к шаблону). Я определил ярлык страницы как константу (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();
}

Спасибо за помощь, и надеюсь, что это полезно для кого-то еще! Дайте мне знать, если у вас есть более простой/встроенный способ сделать это.

person Benj    schedule 30.06.2010

Мне удалось найти более элегантное/встроенное решение.

Хитрость заключается в параметре «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() для года/месяца/дня, но, по крайней мере, вам не нужно создавать собственный шаблон страницы.

person Mark W    schedule 01.09.2011