Спеціальні архіви типу публікацій за роками та місяцями?


17

Як відображати архіви спеціального типу публікації за роками та місяцями?


Моє рішення нижче працює, якщо ви використовуєте <WP 4.4, але з моменту випуску WP 4.4, wp_get_archives () НАРЕШТУ підтримує користувацькі типи публікацій: 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.
jerclarke

Після деякого копання (див. Відповідь Тома Ноуелла нижче) я відмовився від щомісячних архівів для користувальницьких типів публікацій. Натомість я використав категорію публікацій і змінив свою структуру постійних посилань на /%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 полягала в тому, що користувацькі типи публікацій не призначені для виконання звичайних звичайних постів, а якщо вам потрібні публікації архівів дат тощо, ви не робите все правильно, і вам краще використовувати поштові формати тощо.

Спеціальні типи публікацій призначені для веб-додатків тощо, тоді як робити щось на зразок налаштування користувацького типу публікації, який виступає як вторинний або паралельний блог з іншим іменем, наприклад, блог проти новин, з однаковими здібностями - це не те, що було функцією призначені для та означатимуть інші технічні питання, що виникають внаслідок його впровадження.

Якщо ви все ще наполягаєте на цьому, а просто використовувати власні таксономії та формати публікацій недостатньо, ви можете додати правила перезапису у function.php та перенаправити архіви року / місяця за певними URL-адресами на сторінку архіву публікацій, а потім перевірити на користувальницькій сторінка архіву публікації, якщо ви вказали змінні у своїх правилах перезапису та завантажуєте інший шаблон, переконуючись у своїх правилах перезапису, встановіть відповідні значення.


Здається дещо дивно, що вони б так далеко зайшли з цією функціональністю. Чи можете ви надати мені приклад того, як слід використовувати власні повідомлення?
Ден Лі

Користувацькі публікації слід використовувати для будь-якого, що не охоплюється обсягом сторінок і публікацій блогу (або публікацій в блозі з іншим іменем, але працюють однаково, наприклад, статті / новини / щоденник / тощо). Приклади правильного використання користувацьких публікацій включають : події, меню, місця, форми, журнали тощо
Tom J Nowell

Користувацькі публікації - це в основному засоби створення веб-додатків, вони не є засобом дублювання меню публікацій у сервісному вікні для легшого редагування (і таке використання зробить wordpress набагато повільніше і стане більш завданням, ніж ви розумієте, що робите)
Tom J Nowell

1
UUUUUgh. Це трагічна відповідь на запитання. Я не можу повірити, що пояснення вище ґрунтується на тому, що "у нас не повинно бути URL-адрес дати для CPT", хоча це майже напевно "URL-адреси дати для CPT занадто складні", що призводить до фактичного рішення не застосовувати. ЧИСТО є випадки, коли люди хочуть, щоб архіви дат були призначені для користувальницького типу публікації, ви не можете зробити це очевидне бажання зникнути, вказавши формати публікацій.
jerclarke

1
Я мушу категорично не погодитися. Спеціальні типи публікацій призначені для використання для будь-якого, що ви хочете, щоб вони використовувалися, не там, де в Кодексі написано, що вони призначені для "веб-додатків". Крім того, вам може знадобитися розділ "новини", який має власну власну таксономію, і вам потрібно архіви для них. Або навіть запропонований тип "подій", який я згоден, є ідеальним використанням для CPT, але знову ж таки тим, хто легко може потребувати архівів на основі дат.
Тревор

5

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тому ви можете використовувати будь-який з регулярних аргументів, які вона приймає. Однак це просто додає можливість вам додати аргумент власного типу публікації.


2

Недостатньо репутації, щоб додати це до відповіді 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);

1

Не можу додати до публікації 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'));

Бачити його - це ваша перша відповідь. Лише підказка, відповідаючи на запитання, не просто додайте код або посилання на цю справу. Хоча ваш код може працювати, завжди добре знати, що робить ваш код і чому він повинен працювати. Інакше ваша відповідь добре відформатована. +1 для цього
Пітер Гусен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.