Пользовательский тип записей архивов по годам и месяцам?

17

Как вы отображаете архивы пользовательских типов постов по годам и месяцам?

Дэн Ли
источник
Мое решение ниже работает, если вы используете <WP 4.4, но с момента выпуска WP 4.4, wp_get_archives () FINALLY поддерживает пользовательские типы записей: developer.wordpress.org/reference/functions/wp_get_archives
Trevor

Ответы:

17

Да, ты можешь. Все, что вам нужно, это создать фильтр, wp_get_archives();чтобы он принимал post_typeпараметр:

function my_custom_post_type_archive_where($where,$args){  
    $post_type  = isset($args['post_type'])  ? $args['post_type']  : 'post';  
    $where = "WHERE post_type = '$post_type' AND post_status = 'publish'";
    return $where;  
}

тогда назовите это:

add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);

Всякий раз, когда вы хотите отобразить архив по пользовательскому типу записи, просто передайте аргументы post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
Такиен
источник
3
Вы пробовали это решение? Он правильно выбирает список месяцев с сообщением из вашего CPT и количеством сообщений, но ссылки бесполезны. Нажав на них, вы перейдете к месяцу для всего сайта, а не для CPT.
Джеркларк
После некоторых копаний (см. Ответ Тома Новелла ниже) я отказался от ежемесячных архивов для пользовательских типов записей. Вместо этого я использовал категорию сообщений и изменил структуру постоянных ссылок на /%category%/%year%/%monthnum%/%postname%/. Затем, возможно, можно использовать ловушку, аналогичную описанной выше, чтобы изменить ссылки для начала, /%category%/а не просто дату.
Кевин С.
Вопрос по этому. Это создает URL-адреса вроде: mysite.com/2013/04но это приводит к 404. Пользовательский тип записи доступен по адресу: mysite.com/catsчто заставляет меня думать mysite.com/cats/2013/04, что это должна быть ссылка, но это также приводит к 404. Как вы получаете архивные ссылки для работы?
gaoshan88
2
Более того, наконец-то появился плагин для решения этой недостающей функциональности в WordPress. Он был создан основным участником, пытающимся исправить эту проблему в ядре. Плагин предназначен для нас, пока проблема не будет должным образом решена в ядре. wordpress.org/plugins/archives-for-custom-post-types
Тревор
6

Вы не знаете, официальная линия от разработчиков Wordpress заключалась в том, что пользовательские типы постов не были предназначены для работы обычных обычных постов, и что если вам нужны публикации архивов дат и т. Д., То вы делаете все неправильно, и вам лучше использовать форматы сообщений и т.д ..

Настраиваемые типы записей предназначены для веб-приложений и т. Д., В то время как создание чего-либо, например, создание настраиваемого типа записей, выступающего в роли вторичного или параллельного блога с другим именем, например, блог против новостей, с теми же возможностями, - это не то, чем была функция предназначен для и будет означать другие технические вопросы, возникающие в связи с его реализацией.

Если вы по-прежнему настаиваете на этом, и простого использования пользовательских таксономий и форматов публикации недостаточно, вы можете добавить правила перезаписи в functions.php и перенаправить архивы года / месяца в определенных URL-адресах на страницу архивирования, а затем проверить пользовательские публиковать страницу архива, если вы указали переменные в правилах перезаписи и загрузили другой шаблон, убедитесь, что в ваших правилах перезаписи установлены соответствующие значения.

Том Дж Новелл
источник
Кажется немного странным, что они так далеко зашли бы с этой функциональностью. Можете ли вы привести пример использования пользовательских сообщений?
Дэн Ли
Пользовательские сообщения следует использовать для всего, что не охватывается областью страниц и сообщений в блоге (или сообщений в блогах с другим именем, но работают одинаково, например, статьи / новости / дневник / и т. Д.). Примеры правильного использования пользовательских сообщений: : события, меню, места, формы, журналы и т. д.
Том Дж. Новелл
Пользовательские сообщения - это в основном средство для создания веб-приложений, а не дублирование меню сообщений в бэкэнде для более удобного редактирования (и такое использование сделало бы Wordpress намного медленнее и было бы более сложной задачей, чем вы думаете).
Том Дж. Новелл
1
UUUUUgh. Это правильный ответ на трагический вопрос. Я не могу поверить, что приведенное выше объяснение основано на «у нас не должно быть URL-адресов дат для CPT», хотя почти наверняка «URL-адреса дат для CPT слишком сложны», что является причиной фактического решения не реализовывать. Ясно, что есть случаи, когда люди хотят архивировать даты для пользовательского типа записей, вы не можете сделать это очевидное желание исчезнуть, указав форматы сообщений.
Джеркларк
1
Я должен категорически не согласиться. Пользовательские типы записей предназначены для того, для чего вы хотите, чтобы они использовались, нигде в Кодексе не говорится, что они предназначены для «веб-приложений». Кроме того, вам вполне может понадобиться раздел «новости», в котором есть своя собственная таксономия, и вам понадобятся архивы для них. Или даже предложенный тип «событий», который, я согласен, идеально подходит для СРТ, но опять же, для них легко могут понадобиться архивы на основе дат.
Тревор
5

РЕДАКТИРОВАТЬ -> в то время как этот ответ все еще работает для <WP4.4, так как поддержка 4.4 для пользовательских типов записей теперь включена вwp_get_archives()


Наконец, есть простое, быстрое и простое решение для архивов пользовательских типов постов в WordPress на основе дат! Это была давняя проблема, которая зафиксирована здесь в WP Core Trac.

Это еще не решено, но один из участников Trac опубликовал простой плагин в GitHub , который позволит вам иметь архивы на основе дат для CPT.

После установки этого плагина или добавления кода для ваших функций вручную вы используете архивы для CPT как таковые:

<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>

Обратите внимание, что эта новая функция wp_get_archives_cptработает так же, как и стандарт, wp_get_archivesпоэтому вы можете использовать любой из обычных аргументов, которые она принимает. Тем не менее, он просто добавляет вам возможность добавить собственный аргумент имени типа сообщения.

Тревор
источник
2

Не хватает репутации, чтобы добавить это к ответу Тайкена. Извините.

Однако я хотел добавить, что его ответ сработал для меня, однако ссылки были в формате «localhost / date / 2010». Тогда как мне нужен был формат localhost / postslug / 2010. Я смог исправить это с помощью замены строки в выводе wp_get_archives.

Таким образом, в зависимости от того, как установлены ваши постоянные ссылки, этот код исправит проблему 404 и перенаправит ссылки на структуру постоянных ссылок пользовательского типа:

$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<your post type name>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<your post type slug>'),$yearly_archive);
mrbencowell
источник
1

Не могу добавить к посту Такена, вот что мне пришлось сделать:

functions.php

add_action('init', 'my_year_archive_rewrites');  
function my_year_archive_rewrites() {   
    add_rewrite_rule('resource/news/([0-9]{4})/page/?([0-9]{1,})/?', 'index.php?post_type=news&year=$matches[1]&paged=$matches[2]', 'top');
    add_rewrite_rule('resource/news/([0-9]{4})/?', 'index.php?post_type=news&year=$matches[1]', 'top');
}

add_filter('getarchives_where', 'my_custom_post_type_archive_where', 10, 2);
function my_custom_post_type_archive_where($where,$args){  
    $post_type = isset($args['post_type']) ? $args['post_type'] : 'post';  
    return "WHERE post_type = '$post_type' AND post_status = 'publish'";
}

add_filter('year_link', 'my_year_link');
function my_year_link($link) {
    global $wp_rewrite;

    if(true) { // however you determine what archive you want
        $link = str_replace($wp_rewrite->front, '/resource/news/', $link);
    }

    return $link;
}

Вызов wp_get_archives ()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
pkmatte
источник
Смотри, это твой первый ответ. Просто подсказка при ответе на вопросы, а не просто добавьте код или ссылки. Хотя ваш код может работать, всегда приятно знать, что делает ваш код и почему он должен работать. В противном случае ваш ответ будет отформатирован. +1 за это
Питер Гусен