Як відображати архіви спеціального типу публікації за роками та місяцями?
Як відображати архіви спеціального типу публікації за роками та місяцями?
Відповіді:
Так, ти можеш. Все, що вам потрібно, це зробити фільтр, 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 полягала в тому, що користувацькі типи публікацій не призначені для виконання звичайних звичайних постів, а якщо вам потрібні публікації архівів дат тощо, ви не робите все правильно, і вам краще використовувати поштові формати тощо.
Спеціальні типи публікацій призначені для веб-додатків тощо, тоді як робити щось на зразок налаштування користувацького типу публікації, який виступає як вторинний або паралельний блог з іншим іменем, наприклад, блог проти новин, з однаковими здібностями - це не те, що було функцією призначені для та означатимуть інші технічні питання, що виникають внаслідок його впровадження.
Якщо ви все ще наполягаєте на цьому, а просто використовувати власні таксономії та формати публікацій недостатньо, ви можете додати правила перезапису у function.php та перенаправити архіви року / місяця за певними URL-адресами на сторінку архіву публікацій, а потім перевірити на користувальницькій сторінка архіву публікації, якщо ви вказали змінні у своїх правилах перезапису та завантажуєте інший шаблон, переконуючись у своїх правилах перезапису, встановіть відповідні значення.
EDIT -> хоча ця відповідь все ще працює для <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
тому ви можете використовувати будь-який з регулярних аргументів, які вона приймає. Однак це просто додає можливість вам додати аргумент власного типу публікації.
Недостатньо репутації, щоб додати це до відповіді taiken вибачте.
Однак хотів додати, що його відповідь спрацював для мене, проте посилання були у форматі "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);
Не можу додати до публікації takien, ось ось що мені довелося зробити:
function.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'));