it-swarm.com.ru

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

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

17
Dan Lee

Да, ты можешь. Все, что вам нужно, это сделать фильтр для 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>';
16
takien

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

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

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

6
Tom J Nowell

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, поэтому вы можете использовать любой из обычных аргументов, которые она принимает. Тем не менее, он просто добавляет вам возможность добавить собственный аргумент имени типа сообщения.

5
Trevor

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

Однако я хотел добавить, что его ответ сработал для меня, однако ссылки были в формате "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);
2
mrbencowell

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

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'));
1
pkmatte