Archivi dei Custom Post Type per Anno e Mese?
Come si possono visualizzare gli archivi di un Custom Post Type organizzati per Anno e Mese?
Sì, puoi farlo.
Tutto ciò che devi fare è creare un filtro per wp_get_archives();
in modo che accetti il parametro 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;
}
poi chiama questo:
add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);
Ogni volta che vuoi visualizzare gli archivi per un custom post type, passa semplicemente l'argomento post_type:
$args = array(
'post_type' => 'your_custom_post_type',
'type' => 'monthly',
'echo' => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';

Hai provato questa soluzione? Recupera correttamente l'elenco dei mesi con un post dal tuo CPT e il numero di post, ma i link sono inutili. Cliccandoli ti porta al mese per l'intero sito, non per il CPT.

Dopo alcune ricerche (vedi la risposta di Tom Nowell qui sotto), ho rinunciato agli archivi mensili per i custom post type. Invece, ho utilizzato una categoria di post e ho modificato la struttura dei permalink in /%category%/%year%/%monthnum%/%postname%/
. Quindi, potrebbe essere possibile utilizzando un hook simile a quello sopra, modificare i link per iniziare con /%category%/
invece della sola data.

Domanda su questo. Questo crea URL come: mysite.com/2013/04
ma portano a un 404. Il custom post type è disponibile su: mysite.com/cats
il che mi fa pensare che mysite.com/cats/2013/04
dovrebbe essere il link corretto, ma anche questo risulta in un 404. Come si fa a far funzionare i link degli archivi?

Ancora meglio, esiste finalmente un plugin per gestire questa funzionalità mancante in WordPress. È stato creato da un contributor del core che sta cercando di risolvere questo problema nel core. Il plugin viene fornito per aiutarci fino a quando il problema non verrà risolto correttamente nel core. https://wordpress.org/plugins/archives-for-custom-post-types/

Non è consigliato, la posizione ufficiale degli sviluppatori di WordPress era che i tipi di post personalizzati (custom post types) non erano pensati per sostituire i normali post, e che se hai bisogno di archivi di post con date ecc., non stai usando la funzionalità correttamente, e sarebbe meglio utilizzare i formati di post (post formats) ecc..
I tipi di post personalizzati sono pensati per applicazioni web ecc., mentre creare qualcosa come un tipo di post personalizzato che funga da blog secondario o parallelo con un nome diverso, ad esempio blog vs notizie, con le stesse funzionalità, non è lo scopo per cui questa funzionalità è stata progettata, e potrebbe portare ad altri problemi tecnici derivanti dalla sua implementazione.
Se sei ancora determinato a farlo, e semplicemente utilizzare tassonomie personalizzate e formati di post non è sufficiente, potresti aggiungere regole di riscrittura (rewrite rules) in functions.php e reindirizzare gli archivi annuali/mensili in determinati URL alla pagina di archivio dei post, e poi verificare nella pagina di archivio del tipo di post personalizzato se hai specificato delle variabili nelle tue regole di riscrittura e caricare un template diverso, assicurandoti nelle regole di riscrittura di impostare i valori appropriati.

Sembra un po' strano che siano arrivati solo fino a questo punto con questa funzionalità. Puoi farmi un esempio di come dovrebbero essere utilizzati i custom post?

I custom post dovrebbero essere utilizzati per tutto ciò che non rientra nell'ambito delle pagine e degli articoli del blog (o articoli del blog con un nome diverso ma che funzionano allo stesso modo, ad esempio articoli/notizie/diario/ecc.)
Esempi di utilizzi corretti dei custom post includono: eventi, menu, località, moduli, log, ecc.

I custom post sono fondamentalmente il mezzo per produrre web app, non sono il mezzo per duplicare il menu degli articoli nel backend per una modifica più semplice (e un tale utilizzo renderebbe WordPress molto più lento e sarebbe un compito più arduo di quanto si possa pensare)

UUUUUgh. Questa è purtroppo la risposta corretta alla domanda. Non riesco a credere che la spiegazione sopra si basi sul "non dovremmo avere URL con date per i CPT", è quasi sicuramente "Gli URL con date per i CPT sono troppo complicati" che guida la decisione effettiva di non implementarli. CHIARAMENTE ci sono casi in cui le persone vorrebbero archivi per data per un custom post type, non puoi far sparire questo ovvio desiderio indicando i post format.

Devo fortemente dissentire. I custom post type sono pensati per essere usati per qualsiasi cosa tu voglia usarli, da nessuna parte nel Codex c'è scritto che sono per "web app". Inoltre, potresti benissimo avere bisogno di una sezione "notizie" con la sua tassonomia personalizzata e vorresti degli archivi per quelle. O anche il suggerito tipo "eventi", che concordo siano un uso perfetto per i CPT, ma di nuovo quelli potrebbero facilmente aver bisogno di archivi basati sulla data.

Una sezione notizie suggerisce un post format o una tassonomia che indichi che hai classificato un post come notizia. Un custom post type non è necessario per una cosa del genere. In ogni caso, percepisco che la tua definizione di web app potrebbe non essere la stessa della mia, definirò semplicemente la mia interpretazione in questo contesto come qualsiasi cosa che non sia una pagina statica, o un post di blog, che richieda una rappresentazione simile a un post dei contenuti, e ti rimanderei al core developer di WordPress che originariamente ha affermato questo (probabilmente Otto o Nacin)

In effetti definiamo le web app in modo diverso. La buona notizia è che Jack Lenox di Automattic ha un plugin che ora abiliterà gli archivi per i CPT, vedi la mia risposta qui sotto. Quindi ora possiamo finalmente creare facilmente archivi per data per cose come "Eventi" che potrebbero davvero usufruire di questa funzionalità.

MODIFICA -> mentre questa risposta funziona ancora per versioni < WP4.4, dalla 4.4 il supporto per i Custom Post Types è ora incluso in wp_get_archives()
Finalmente c'è una soluzione semplice, veloce e facile per gli archivi basati su data dei Custom Post Types in WordPress! Questo è stato un problema di lunga data che è documentato qui nel WP Core Trac.
Non è ancora stato risolto ma uno dei collaboratori del Trac ha pubblicato un semplice plugin su GitHub che ti permetterà di avere archivi basati su data per i CPT.
Dopo aver installato questo plugin, o aggiunto manualmente il codice alle tue funzioni, puoi usare gli archivi per i CPT in questo modo:
<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>
Nota che questa nuova funzione wp_get_archives_cpt
funziona come il normale wp_get_archives
, quindi puoi usare qualsiasi argomento che normalmente accetta. Tuttavia, semplicemente aggiunge la possibilità di poter specificare un argomento con il nome del custom post type.

Non ho abbastanza reputazione per aggiungere questo alla risposta di taiken, mi dispiace.
Volevo però aggiungere che la sua risposta ha funzionato per me, tuttavia i link erano nel formato 'localhost/date/2010'. Mentre io avevo bisogno del formato 'localhost/postslug/2010'. Sono riuscito a risolvere utilizzando una sostituzione di stringa sull'output di wp_get_archives.
Quindi, a seconda di come sono impostati i tuoi permalink, questo codice risolverà il problema del 404 e reindirizzerà i link alla struttura dei permalink del custom post type:
$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<nome del tuo post type>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<slug del tuo post type>'),$yearly_archive);

Non posso aggiungere al post di takien quindi ecco cosa ho dovuto fare:
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) { // comunque tu determini quale archivio vuoi
$link = str_replace($wp_rewrite->front, '/resource/news/', $link);
}
return $link;
}
Chiamata a wp_get_archives()
wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));

Ecco la tua prima risposta. Solo un suggerimento quando rispondi alle domande: non limitarti ad aggiungere codice o, per quel che vale, link. Anche se il tuo codice potrebbe funzionare, è sempre bello sapere cosa fa il tuo codice e perché dovrebbe funzionare. Altrimenti la tua risposta è ben formattata. +1 per quello
