Archives de type de message personnalisé par année et mois?

Réponses:

17

Oui, vous pouvez. Il vous suffit de créer un filtre pour wp_get_archives();qu'il accepte le post_typeparamètre:

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

Chaque fois que vous souhaitez afficher l'archive par type de publication personnalisé, passez simplement les arguments post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
takien
la source
3
Avez-vous essayé cette solution? Il récupère correctement la liste des mois avec une publication de votre CPT et le nombre de publications, mais les liens sont inutiles. Cliquer dessus vous amène au mois pour l'ensemble du site, pas pour le CPT.
jerclarke
Après quelques recherches (voir la réponse de Tom Nowell ci-dessous), j'ai abandonné les archives mensuelles pour les types de publication personnalisés. Au lieu de cela, j'ai utilisé une catégorie de publication et changé ma structure de permalien en /%category%/%year%/%monthnum%/%postname%/. Ensuite, il pourrait être possible en utilisant un crochet similaire à ci-dessus, de modifier les liens pour commencer au /%category%/lieu de simplement la date.
Kevin C.
Question à ce sujet. Cela crée des URL comme: mysite.com/2013/04mais cela conduit à un 404. Le type de publication personnalisé est disponible à: mysite.com/catsce qui me fait penser mysite.com/cats/2013/04que ce devrait être le lien, mais cela se résout également en 404. Comment obtenez-vous les liens d'archive pour fonctionner?
gaoshan88
2
Encore mieux, il existe enfin un plugin pour gérer cette fonctionnalité manquante dans WordPress. Il a été créé par un contributeur principal essayant de résoudre ce problème dans le noyau. Le plugin est fourni pour nous aider jusqu'à ce que le problème soit correctement résolu dans le noyau. wordpress.org/plugins/archives-for-custom-post-types
Trevor
6

Vous ne le faites pas, la ligne officielle des développeurs Wordpress était que les types de publication personnalisés n'étaient pas destinés à faire le travail des publications ordinaires normales, et que 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 publication, etc.

Les types de publication personnalisés sont destinés aux applications Web, etc., alors que faire quelque chose comme la configuration d'un type de publication personnalisé qui agit comme un blog secondaire ou parallèle avec un nom différent, par exemple blog vs news, avec les mêmes capacités, n'est pas ce que la fonctionnalité était destiné à, et signifierait d'autres problèmes techniques découlant de sa mise en œuvre.

Si vous insistez toujours là-dessus, et qu'il ne suffit pas d'utiliser des taxonomies et des formats de publication personnalisés, vous pouvez ajouter des règles de réécriture dans functions.php et rediriger les archives année / mois de certaines URL vers la page d'archivage des publications, puis vérifier la personnalisation publier une page d'archivage si vous avez spécifié des variables dans vos règles de réécriture et charger un modèle différent, en vous assurant dans vos règles de réécriture de définir les valeurs appropriées.

Tom J Nowell
la source
Il semble un peu étrange qu'ils n'iraient que si loin avec cette fonctionnalité. Pouvez-vous me donner un exemple de la façon dont les publications personnalisées doivent être utilisées?
Dan Lee
Les publications personnalisées doivent être utilisées pour tout ce qui n'est pas couvert par la portée des pages et des publications de blog (ou des publications de blog avec un nom différent mais fonctionnant de la même manière, par exemple, articles / actualités / journal / etc). Exemples d'utilisation correcte des publications personnalisées: : événements, menus, emplacements, formulaires, journaux, etc.
Tom J Nowell
Les publications personnalisées sont essentiellement le moyen de produire des applications Web, elles ne sont pas le moyen de dupliquer le menu de publication dans le backend pour une édition plus facile (et une telle utilisation rendrait wordpress beaucoup plus lent et serait plus une tâche que vous ne le pensez)
Tom J Nowell
1
UUUUUgh. C'est tragiquement la bonne réponse à la question. Je ne peux pas croire que l'explication ci-dessus soit basée sur "nous ne devrions pas avoir d'URL de date pour les CPT", mais c'est presque certainement "les URL de date pour les CPT sont trop compliquées" qui motivent la décision réelle de ne pas mettre en œuvre. CLAIREMENT, il y a des cas où les gens voudraient des archives de dates pour un type de publication personnalisé, vous ne pouvez pas faire disparaître ce désir évident en soulignant les formats de publication.
jerclarke
1
Je dois être fortement en désaccord. Les types de publication personnalisés sont destinés à être utilisés pour tout ce que vous voulez qu'ils soient utilisés, nulle part dans le Codex, il n'est indiqué qu'ils sont destinés à des "applications Web". En outre, vous pourriez très bien avoir besoin d'une section "nouvelles" qui a sa propre taxonomie personnalisée et vous voudriez des archives pour celles-ci. Ou même le type "d'événements" suggéré, qui, je suis d'accord, est une utilisation parfaite pour les CPT, mais là encore, ceux-ci pourraient facilement avoir besoin d'archives basées sur la date.
Trevor
5

ÉDITER -> alors que cette réponse fonctionne toujours pour <WP4.4, car la prise en charge de 4.4 pour les types de publication personnalisés est désormais incluse danswp_get_archives()


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

Il n'a pas encore été résolu, mais l'un des contributeurs au Trac a publié un simple plugin dans GitHub qui vous permettra d'avoir des archives basées sur la date pour les CPT.

Après avoir installé ce plugin ou ajouté manuellement le code de vos fonctions, vous devez utiliser les 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_cptfonctionne de la même manière que la norme wp_get_archives, vous pouvez donc utiliser n'importe quel argument régulier qu'elle accepte. Cependant, cela ajoute simplement la possibilité pour vous d'être en mesure d'ajouter un argument de nom de type de publication personnalisé.

Trevor
la source
2

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

Cependant, je voulais ajouter que sa réponse a 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 un remplacement de chaîne sur la sortie de wp_get_archives.

Donc, selon la façon dont vos permaliens sont définis, ce code résoudra le problème 404 et redirigera les liens vers la structure de permalien de type de message personnalisé:

$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
la source
1

Je ne peux pas ajouter au post de takien alors voici ce que j'ai fini par 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;
}

Appel de wp_get_archives ()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
pkmatte
la source
Voir la sienne est votre première réponse. Juste un conseil lorsque vous répondez à des questions, ne vous contentez pas d'ajouter du code ou des liens d'ailleurs. Bien que votre code puisse fonctionner, il est toujours agréable de savoir ce que fait votre code et pourquoi il devrait fonctionner. Sinon, votre réponse est bien formatée. +1 pour cela
Pieter Goosen