Как вы отображаете архивы пользовательских типов постов по годам и месяцам?
Как вы отображаете архивы пользовательских типов постов по годам и месяцам?
Ответы:
Да, ты можешь. Все, что вам нужно, это создать фильтр, 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>';
/%category%/%year%/%monthnum%/%postname%/
. Затем, возможно, можно использовать ловушку, аналогичную описанной выше, чтобы изменить ссылки для начала, /%category%/
а не просто дату.
mysite.com/2013/04
но это приводит к 404. Пользовательский тип записи доступен по адресу: mysite.com/cats
что заставляет меня думать mysite.com/cats/2013/04
, что это должна быть ссылка, но это также приводит к 404. Как вы получаете архивные ссылки для работы?
Вы не знаете, официальная линия от разработчиков Wordpress заключалась в том, что пользовательские типы постов не были предназначены для работы обычных обычных постов, и что если вам нужны публикации архивов дат и т. Д., То вы делаете все неправильно, и вам лучше использовать форматы сообщений и т.д ..
Настраиваемые типы записей предназначены для веб-приложений и т. Д., В то время как создание чего-либо, например, создание настраиваемого типа записей, выступающего в роли вторичного или параллельного блога с другим именем, например, блог против новостей, с теми же возможностями, - это не то, чем была функция предназначен для и будет означать другие технические вопросы, возникающие в связи с его реализацией.
Если вы по-прежнему настаиваете на этом, и простого использования пользовательских таксономий и форматов публикации недостаточно, вы можете добавить правила перезаписи в functions.php и перенаправить архивы года / месяца в определенных URL-адресах на страницу архивирования, а затем проверить пользовательские публиковать страницу архива, если вы указали переменные в правилах перезаписи и загрузили другой шаблон, убедитесь, что в ваших правилах перезаписи установлены соответствующие значения.
РЕДАКТИРОВАТЬ -> в то время как этот ответ все еще работает для <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
поэтому вы можете использовать любой из обычных аргументов, которые она принимает. Тем не менее, он просто добавляет вам возможность добавить собственный аргумент имени типа сообщения.
Не хватает репутации, чтобы добавить это к ответу Тайкена. Извините.
Однако я хотел добавить, что его ответ сработал для меня, однако ссылки были в формате «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);
Не могу добавить к посту Такена, вот что мне пришлось сделать:
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'));