it-swarm.com.de

Benutzerdefinierte Beitragstyp-Archive nach Jahr und Monat?

Wie können Sie die Archive eines benutzerdefinierten Beitragstyps nach Jahr und Monat anzeigen?

17
Dan Lee

Ja, du kannst. Sie müssen lediglich einen Filter für wp_get_archives(); erstellen, damit der Parameter post_type akzeptiert wird:

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

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, während Sie beispielsweise einen benutzerdefinierten Beitragstyp einrichten, der als sekundäres oder paralleles Blog mit einem anderen Namen fungiert, z. blog vs news, mit den gleichen Fähigkeiten, ist nicht das, wofür das Feature gedacht war, 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 Postarchivseite 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.

6
Tom J Nowell

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


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 verzeichnet ist.

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 haben 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 Post-Typnamen hinzuzufügen.

5
Trevor

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 eine Zeichenfolge als 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);
2
mrbencowell

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