Niestandardowe archiwa typów wpisów według roku i miesiąca?


Odpowiedzi:


17

Tak, możesz. Wystarczy zrobić filtr, wp_get_archives();aby zaakceptował post_typeparametr:

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>';

3
Wypróbowałeś to rozwiązanie? Prawidłowo pobiera listę miesięcy z postem z CPT i liczbą postów, ale linki są bezużyteczne. Kliknięcie ich powoduje przejście do miesiąca dla całej witryny, a nie dla CPT.
jerclarke

Po kilku kopaniach (patrz odpowiedź Toma Nowella poniżej) zrezygnowałem z miesięcznych archiwów dla niestandardowych typów postów. Zamiast tego użyłem kategorii postu i zmieniłem strukturę permalink na /%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.
Kevin C.

Pytanie w tej sprawie. Tworzy to adresy URL takie jak: mysite.com/2013/04ale prowadzi to do 404. Niestandardowy typ postu jest dostępny pod adresem: mysite.com/catsco 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?
gaoshan88

2
Co więcej, wreszcie jest wtyczka do obsługi tej brakującej funkcji w WordPress. Został stworzony przez głównego współpracownika próbującego naprawić ten problem w rdzeniu. Wtyczka jest dostarczana, aby pomóc nam przejść przez problem, dopóki problem nie zostanie poprawnie rozwiązany w rdzeniu. wordpress.org/plugins/archives-for-custom-post-types
Trevor

6

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.


Wydaje się to trochę dziwne, że posunęliby się tak daleko z tą funkcjonalnością. Czy możesz podać przykład użycia niestandardowych postów?
Dan Lee

Niestandardowe posty powinny być używane do wszystkiego, co nie jest objęte zakresem stron i postów na blogu (lub postów na blogu o innej nazwie, ale działają tak samo, np. Artykułów / wiadomości / pamiętnika / itp.) Przykłady prawidłowego wykorzystania niestandardowych postów obejmują : zdarzenia, menu, lokalizacje, formularze, logi itp.
Tom J Nowell

Niestandardowe posty to w zasadzie sposób tworzenia aplikacji internetowych, nie są one jednak sposobem kopiowania menu postów w backendie w celu łatwiejszej edycji (i takie użycie spowodowałoby, że edytowanie słów byłoby znacznie wolniejsze i byłoby większym zadaniem niż zdajesz sobie z tego sprawę)
Tom J Nowell

1
UUUUUgh. To jest poprawna odpowiedź na pytanie tragicznie. Nie mogę jednak uwierzyć, że powyższe wyjaśnienie opiera się na „nie powinniśmy mieć adresów URL dat dla CPT”, jest prawie na pewno „Adresy URL dat dla CPT są zbyt skomplikowane”, co powoduje faktyczną decyzję o niewdrożeniu. WYRAŹNIE zdarzają się przypadki, w których ludzie chcieliby archiwów dat dla niestandardowego typu postów, nie można sprawić, by to oczywiste pragnienie zniknęło, wskazując formaty postów.
jerclarke

1
Muszę zdecydowanie się nie zgodzić. Niestandardowe typy postów są przeznaczone do tego, do czego chcesz, bez względu na to, gdzie w Kodeksie jest napisane, że są przeznaczone do „aplikacji internetowych”. Ponadto może być bardzo potrzebna sekcja „aktualności”, która ma własną niestandardową systematykę i chcesz mieć dla nich archiwa. Lub nawet sugerowany typ „zdarzeń”, które zgadzam się, są idealnym zastosowaniem do CPT, ale znowu te łatwo mogą potrzebować archiwów opartych na datach.
Trevor

5

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_cptdziała tak samo jak standard, wp_get_archiveswięc możesz użyć dowolnego z przyjętych argumentów. Jednak po prostu dodaje możliwość dodania niestandardowego argumentu nazwy typu postu.


2

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);

1

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

Zobacz jego, to twoja pierwsza odpowiedź. Tylko wskazówka podczas odpowiadania na pytania, nie dodawaj tylko kodu ani w tym przypadku linków. Chociaż Twój kod może działać, zawsze miło jest wiedzieć, co robi Twój kod i dlaczego powinien on działać. W przeciwnym razie twoja odpowiedź jest ładnie sformatowana. +1 za to
Pieter Goosen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.