Benutzerdefinierte Beitragstyp-Archive nach Jahr und Monat?

Antworten:

17

Ja, du kannst. Alles, was Sie brauchen, ist einen Filter zu machen, wp_get_archives();damit er post_typeParameter akzeptiert :

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

dann nenne das:

add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);

Wenn Sie das Archiv nach benutzerdefiniertem Beitragstyp anzeigen möchten, übergeben Sie einfach die Argumente post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
takien
quelle
3
Haben Sie diese Lösung ausprobiert? Es ruft die Liste der Monate mit einem Beitrag von Ihrem CPT und der Anzahl der Beiträge korrekt ab, aber die Links sind nutzlos. Wenn Sie darauf klicken, gelangen Sie zum Monat für die gesamte Site, nicht für das CPT.
Jerclarke
Nach einigem Graben (siehe Tom Nowells Antwort unten) gab ich die monatlichen Archive für benutzerdefinierte Beitragstypen auf. Stattdessen habe ich eine Post-Kategorie verwendet und meine Permalink-Struktur in geändert /%category%/%year%/%monthnum%/%postname%/. Dann könnte es möglich sein, einen Haken wie oben zu verwenden, um die Verknüpfungen zu ändern, /%category%/anstatt nur das Datum.
Kevin C.
Frage dazu. Dies erzeugt URLs wie: mysite.com/2013/04aber dies führt zu einem 404. Der benutzerdefinierte Beitragstyp ist verfügbar unter: Was mysite.com/catsmich mysite.com/cats/2013/04zu der Annahme veranlasst, wie der Link sein sollte, aber dies löst auch einen 404 auf. Wie bringen Sie die Archivlinks zum Laufen ?
Gaoshan88
2
Noch besser ist, dass es endlich ein Plugin gibt, das diese fehlende Funktionalität in WordPress behebt. Es wurde von einem Core Contributor erstellt, der versucht, dieses Problem im Core zu beheben. Das Plugin wird zur Verfügung gestellt, um uns durchzubringen, bis das Problem im Kern richtig behoben ist. wordpress.org/plugins/archives-for-custom-post-types
Trevor
6

Die offizielle Aussage der Wordpress-Entwickler war, dass benutzerdefinierte Post-Typen nicht für normale normale Posts gedacht sind und dass Sie, wenn Sie Post-Archive mit Datumsangaben usw. benötigen, die Dinge nicht richtig machen. und du bist besser dran, wenn du Postformate usw. verwendest.

Benutzerdefinierte Beitragstypen sind für Webanwendungen usw. vorgesehen, wohingegen das Einrichten eines benutzerdefinierten Beitragstyps, der als sekundäres oder paralleles Blog mit einem anderen Namen fungiert, z bestimmt für und würde andere technische Probleme bedeuten, die sich aus seiner Implementierung ergeben.

Wenn Sie immer noch darauf bestehen und es nicht ausreicht, benutzerdefinierte Taxonomien und Postformate zu verwenden, können Sie in functions.php Umschreibregeln hinzufügen und Jahr / Monat-Archive in bestimmten URLs auf die Postarchiv-Seite umleiten und dann die benutzerdefinierten Regeln überprüfen Wenn Sie in Ihren Umschreiberegeln Variablen angegeben und eine andere Vorlage geladen haben, stellen Sie in Ihren Umschreiberegeln sicher, dass die entsprechenden Werte festgelegt sind.

Tom J Nowell
quelle
Es scheint ein bisschen seltsam, dass sie mit dieser Funktionalität nur so weit gehen würden. Können Sie mir ein Beispiel geben, wie benutzerdefinierte Posts verwendet werden sollten?
Dan Lee
Benutzerdefinierte Beiträge sollten für alles verwendet werden, was nicht vom Umfang der Seiten und Blog-Beiträge abgedeckt wird (oder Blog-Beiträge mit einem anderen Namen, die jedoch gleich funktionieren, z. B. Artikel / Nachrichten / Tagebuch / usw.). Beispiele für die korrekte Verwendung benutzerdefinierter Beiträge umfassen : Ereignisse, Menüs, Orte, Formulare, Protokolle usw.
Tom J Nowell
Benutzerdefinierte Posts sind im Grunde die Möglichkeit, Web-Apps zu erstellen. Sie sind nicht die Möglichkeit, das Post-Menü im Backend zu duplizieren, um die Bearbeitung zu vereinfachen.
Tom J Nowell
1
UUUUUgh. Dies ist die richtige Antwort auf die tragische Frage. Ich kann nicht glauben, dass die obige Erklärung auf "Wir sollten keine Datums-URLs für CPTs haben" basiert. Es ist jedoch fast definitiv "Datums-URLs für CPTs sind zu kompliziert", was die eigentliche Entscheidung zur Nichtimplementierung antreibt. Klarerweise gibt es Fälle, in denen Benutzer Datumsarchive für einen benutzerdefinierten Beitragstyp wünschen. Sie können diesen offensichtlichen Wunsch nicht durch Hinweisen auf Beitragsformate aufheben.
Jerclarke
1
Ich muss stark widersprechen. Benutzerdefinierte Post-Typen können für alle Zwecke verwendet werden, für die sie verwendet werden sollen. Nirgendwo im Codex wird angegeben, dass sie für "Web-Apps" bestimmt sind. Außerdem benötigen Sie möglicherweise einen Abschnitt "Nachrichten" mit einer eigenen benutzerdefinierten Taxonomie, für die Sie Archive benötigen. Oder sogar der vorgeschlagene "Ereignistyp", dem ich zustimme, ist eine perfekte Verwendung für CPTs, aber auch diese könnten leicht datumsbasierte Archive benötigen.
Trevor,
5

BEARBEITEN -> während diese Antwort für <WP4.4 noch funktioniert, ist die Unterstützung von 4.4 für benutzerdefinierte Beitragstypen jetzt in enthaltenwp_get_archives()


Es gibt endlich eine einfache, schnelle und einfache Lösung für datumsbasierte Archive von benutzerdefinierten Beitragstypen in WordPress! Dies ist ein langjähriges Problem, das hier im WP Core Trac aufgezeichnet wird .

Es muss noch gelöst werden, aber einer der Mitwirkenden am Trac hat ein einfaches Plugin in GitHub gepostet , mit dem Sie datumsbasierte Archive für CPTs erstellen können.

Nach der Installation dieses Plugins oder dem manuellen Hinzufügen des Codes für Ihre Funktionen können Sie Archive für CPTs als solche verwenden:

<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>

Beachten Sie, dass diese neue Funktion wp_get_archives_cptgenauso funktioniert wie die Standardfunktion, wp_get_archivessodass Sie jedes der regulären Argumente verwenden können, die sie akzeptiert. Es wird jedoch lediglich die Möglichkeit hinzugefügt, ein benutzerdefiniertes Argument für den Namen des Beitragstyps hinzuzufügen.

Trevor
quelle
2

Nicht genug Ruf, um dies zu Taikens Antwort hinzuzufügen. Entschuldigung.

Wollte allerdings hinzufügen, dass seine Antwort für mich funktioniert hat, die Links jedoch im Format 'localhost / date / 2010' waren. Ich brauchte das Format 'localhost / postslug / 2010'. Ich konnte dies beheben, indem ich einen String-Ersatz für die Ausgabe von wp_get_archives verwendete.

Je nachdem, wie Ihre Permalinks eingestellt sind, behebt dieser Code das 404-Problem und leitet die Links zur benutzerdefinierten Permalink-Struktur des Post-Typs weiter:

$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);
Mrbencowell
quelle
1

Ich kann nicht zu takiens Post hinzufügen, also musste ich Folgendes tun:

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

Aufruf von wp_get_archives ()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
pkmatte
quelle
Sehen Sie, sein ist Ihre erste Antwort. Nur ein Tipp bei der Beantwortung von Fragen, fügen Sie nicht einfach Code oder Links hinzu. Obwohl Ihr Code möglicherweise funktioniert, ist es immer schön zu wissen, was Ihr Code tut und warum er funktionieren sollte. Ansonsten ist Ihre Antwort schön formatiert. +1 dafür
Pieter Goosen