Jak wyświetlać archiwa niestandardowego typu postu według roku i miesiąca?
Jak wyświetlać archiwa niestandardowego typu postu według roku i miesiąca?
Odpowiedzi:
Tak, możesz. Wystarczy zrobić filtr, wp_get_archives();
aby zaakceptował post_type
parametr:
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;
}
następnie nazwij to:
add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);
Ilekroć chcesz wyświetlić archiwum według niestandardowego typu postu, po prostu przekaż argumenty 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%/
. Wtedy może być możliwe użycie haka podobnego do powyższego, aby zmodyfikować linki na początek /%category%/
zamiast tylko daty.
mysite.com/2013/04
ale prowadzi to do 404. Niestandardowy typ postu jest dostępny pod adresem: mysite.com/cats
co sprawia, że myślę mysite.com/cats/2013/04
, że powinien być tym, jaki powinien być link, ale rozwiązuje to również 404. Jak uzyskać linki archiwum do działania?
Nie, oficjalna linijka deweloperów Wordpress była taka, że niestandardowe typy postów nie były przeznaczone do wykonywania zwykłych zwykłych postów i że jeśli potrzebujesz archiwów wpisów dat itp., To nie robisz rzeczy poprawnie, i lepiej jest używać formatów postów itp.
Niestandardowe typy postów są przeznaczone do aplikacji internetowych itp., Podczas gdy robienie czegoś takiego, jak konfigurowanie niestandardowego typu postu, który działa jako pomocniczy lub równoległy blog o innej nazwie, np. Blog kontra wiadomości, o tych samych możliwościach, nie jest tym, czym była funkcja przeznaczone i oznaczałyby inne problemy techniczne wynikające z jego wdrożenia.
Jeśli nadal nalegasz na to, a samo użycie niestandardowych systematyk i formatów postów nie wystarczy, możesz dodać reguły przepisywania w funkcji.php i przekierować archiwa roku / miesiąca w określonych adresach URL na stronę archiwum postów, a następnie sprawdzić niestandardowe opublikuj stronę archiwum, jeśli określiłeś zmienne w regułach przepisywania i załadujesz inny szablon, upewniając się w regułach przepisywania, aby ustawić odpowiednie wartości.
EDYCJA -> chociaż ta odpowiedź nadal działa dla <WP4.4, ponieważ obsługa 4.4 niestandardowych typów postów jest teraz zawarta wwp_get_archives()
Wreszcie jest proste, szybkie i łatwe rozwiązanie dla opartych na datach archiwów niestandardowych typów postów w WordPress! To był od dawna problem, który został odnotowany tutaj w WP Core Trac.
To jeszcze nie zostało rozwiązane, ale jeden z współpracowników Traca opublikował prostą wtyczkę w GitHub , która pozwoli ci mieć archiwa oparte na dacie dla CPT.
Po zainstalowaniu tej wtyczki lub ręcznym dodaniu kodu do funkcji możesz użyć archiwów dla CPT jako takich:
<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>
Zauważ, że ta nowa funkcja wp_get_archives_cpt
działa tak samo jak standard, wp_get_archives
więc możesz użyć dowolnego z przyjętych argumentów. Jednak po prostu dodaje możliwość dodania niestandardowego argumentu nazwy typu postu.
Przepraszam za mało reputacji, aby dodać to do odpowiedzi taiken.
Chciałem jednak dodać, że jego odpowiedź zadziałała dla mnie, jednak linki były w formacie „localhost / date / 2010”. Podczas gdy potrzebowałem formatu „localhost / postslug / 2010”. Udało mi się to naprawić za pomocą zamiany ciągu na danych wyjściowych wp_get_archives.
W zależności od tego, w jaki sposób ustawione są permalinki, ten kod naprawi problem 404 i przekieruje linki do niestandardowej struktury permalink typu post:
$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);
Nie mogę dodać do postu takien, więc oto co musiałem zrobić:
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;
}
Wywoływanie wp_get_archives ()
wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));