web-dev-qa-db-fra.com

Custom Post Type Archives par Année & Mois?

Comment affichez-vous les archives d'un type de message personnalisé par année et par mois?

17
Dan Lee

Oui, vous pouvez. Tout ce dont vous avez besoin est de créer un filtre pour wp_get_archives(); afin qu’il accepte le paramètre post_type:

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

puis appelez ceci:

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

Lorsque vous souhaitez afficher l'archive par type de message personnalisé, transmettez simplement les arguments post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
16
takien

La version officielle des développeurs de Wordpress indiquait que les types de publication personnalisés n'étaient pas destinés à faire le travail des publications ordinaires. Si vous avez besoin d'archives de publication de dates, etc., vous ne faites pas les choses correctement. et vous feriez mieux d'utiliser des formats de message, etc.

Les types de publication personnalisés sont destinés aux applications Web, etc., alors que vous pouvez, par exemple, configurer un type de publication personnalisé qui agit en tant que blog secondaire ou parallèle avec un nom différent, par exemple. blog vs nouvelles, avec les mêmes capacités, n’est pas ce à quoi la fonctionnalité était destinée, et signifierait d’autres problèmes techniques découlant de sa mise en œuvre.

Si vous insistez toujours sur le sujet et que l'utilisation de taxonomies personnalisées et de formats de publication ne suffit pas, vous pouvez ajouter des règles de réécriture dans functions.php et rediriger les archives d'année/mois de certaines URL vers la page de publication de la publication, puis vérifier les paramètres personnalisés. poste d'archive si vous avez spécifié des variables dans vos règles de réécriture et chargé un autre modèle, en vous assurant que vos règles de réécriture définissent les valeurs appropriées.

6
Tom J Nowell

EDIT _ -> alors que cette réponse fonctionne toujours pour <WP4.4, car la prise en charge de types de publication personnalisés par 4.4 est maintenant incluse dans wp_get_archives()


Il existe enfin une solution simple, rapide et facile pour les archives de types de publications personnalisées basées sur la date dans WordPress! Ceci est un problème de longue date qui est enregistré ici dans le WP Core Trac.

Le problème n'a pas encore été résolu, mais l'un des contributeurs au Trac a mis en ligne un plugin simple dans GitHub qui vous permettra de disposer d'archives basées sur la date pour les CPT.

Après avoir installé ce plugin ou ajouté manuellement le code de vos fonctions, vous pouvez utiliser des archives pour les CPT en tant que telles:

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

Notez que cette nouvelle fonction wp_get_archives_cpt fonctionne de la même manière que le wp_get_archives standard afin que vous puissiez utiliser n’importe quel des arguments normaux qu’elle accepte. Cependant, cela ajoute simplement la possibilité pour vous de pouvoir ajouter un argument de nom de type de publication personnalisé.

5
Trevor

Pas assez de réputation pour ajouter ceci à la réponse de taiken, désolé.

Cependant, je voulais ajouter que sa réponse a bien fonctionné pour moi, mais les liens étaient au format "localhost/date/2010". Alors que j'avais besoin du format 'localhost/postslug/2010'. J'ai pu résoudre ce problème en utilisant une chaîne de remplacement sur la sortie de wp_get_archives.

Donc, selon la manière dont vos permaliens sont définis, ce code corrigera le problème 404 et redirigera les liens vers la structure permalien de type message personnalisée:

$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

Impossible d'ajouter au post de takien, alors voici ce que j'ai finalement dû faire:

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

Appeler wp_get_archives ()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
1
pkmatte