Wie können Sie die Archive eines benutzerdefinierten Beitragstyps nach Jahr und Monat anzeigen?
Wie können Sie die Archive eines benutzerdefinierten Beitragstyps nach Jahr und Monat anzeigen?
Antworten:
Ja, du kannst. Alles, was Sie brauchen, ist einen Filter zu machen, wp_get_archives();
damit er post_type
Parameter 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>';
/%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.
mysite.com/2013/04
aber dies führt zu einem 404. Der benutzerdefinierte Beitragstyp ist verfügbar unter: Was mysite.com/cats
mich mysite.com/cats/2013/04
zu der Annahme veranlasst, wie der Link sein sollte, aber dies löst auch einen 404 auf. Wie bringen Sie die Archivlinks zum Laufen ?
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.
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_cpt
genauso funktioniert wie die Standardfunktion, wp_get_archives
sodass 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.
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);
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'));