Arhive pentru Tipuri de Postări Personalizate după An și Lună
Cum poți afișa arhivele unui Tip de Postare Personalizat (Custom Post Type) organizate după An și Lună?
Da, poți.
Tot ce trebuie să faci este să creezi un filtru pentru wp_get_archives();
astfel încât să accepte parametrul 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;
}
apoi apelează acest cod:
add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);
Ori de câte ori dorești să afișezi arhiva pentru un tip personalizat de postare, trebuie doar să transmiți argumentul post_type:
$args = array(
'post_type' => 'your_custom_post_type',
'type' => 'monthly',
'echo' => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';

Ai încercat această soluție? Ea recuperează corect lista de luni cu articole din CPT-ul tău și numărul de articole, dar link-urile sunt inutile. Dacă dai click pe ele, te duce la arhiva lunară pentru întregul site, nu pentru CPT.

După ce am cercetat (vezi răspunsul lui Tom Nowell mai jos), am renunțat la arhivele lunare pentru custom post types. În schimb, am folosit o categorie de articole și am schimbat structura de permalink-uri la /%category%/%year%/%monthnum%/%postname%/
. Apoi, ar fi posibil, folosind un hook similar cu cel de mai sus, să modifici link-urile să înceapă cu /%category%/
în loc de doar data.

Întrebare legată de asta. Acest lucru creează URL-uri de genul: mysite.com/2013/04
dar acesta duce la o eroare 404. Custom post type-ul este disponibil la: mysite.com/cats
ceea ce mă face să cred că mysite.com/cats/2013/04
ar trebui să fie link-ul corect, dar și acesta rezultă într-o eroare 404. Cum faci să funcționeze link-urile către arhive?

Și mai bine, în sfârșit există un plugin care rezolvă această funcționalitate lipsă în WordPress. A fost creat de un contribuitor de bază care a încercat să rezolve această problemă în nucleul platformei. Pluginul este oferit ca o soluție temporară până când problema va fi rezolvată direct în nucleu. https://wordpress.org/plugins/archives-for-custom-post-types/

Nu, conform declarației oficiale a dezvoltatorilor WordPress, tipurile personalizate de postări (custom post types) nu au fost concepute pentru a înlocui postările obișnuite. Dacă ai nevoie de arhive de postări organizate pe date etc., atunci nu folosești corect această funcționalitate și ar fi mai bine să utilizezi formate de postare (post formats) sau alte metode.
Tipurile personalizate de postări sunt destinate în principal aplicațiilor web și nu pentru a crea un blog secundar sau paralel cu un alt nume (de exemplu, "blog" vs "știri"), având aceleași capacități ca postările standard. Aceasta nu a fost scopul acestei funcționalități și ar putea duce la probleme tehnice.
Dacă totuși insiști pe această abordare și utilizarea taxonomiilor personalizate sau a formatelor de postare nu este suficientă, poți adăuga reguli de rescriere (rewrite rules) în fișierul functions.php, redirecționând arhivele pe ani/luni către pagina de arhivă a postărilor personalizate. Apoi, pe acea pagină, poți verifica dacă anumite variabile au fost specificate în regulile de rescriere și încărca un șablon diferit, asigurându-te că regulile de rescriere setează valorile corespunzătoare.

Pare un pic ciudat că s-ar fi limitat doar la atât în ceea ce privește această funcționalitate. Poți să-mi dai un exemplu despre cum ar trebui folosite postările personalizate?

Postările personalizate ar trebui utilizate pentru orice nu este acoperit de sfera paginilor și postărilor de blog (sau postărilor de blog cu un nume diferit dar care funcționează la fel, de ex. articole/știri/jurnal/etc)
Exemple de utilizări corecte ale postărilor personalizate includ: evenimente, meniuri, locații, formulare, jurnale, etc

Postările personalizate sunt practic un mijloc de a crea aplicații web, nu un mijloc de a duplica meniul de postări în backend pentru o editare mai ușoară (și o astfel de utilizare ar face WordPress mult mai lent și ar fi o sarcină mai mare decât îți dai seama)

UUUUUf. Acesta este răspunsul corect la întrebare, din păcate. Nu pot să cred că explicația de mai sus se bazează pe "nu ar trebui să avem URL-uri cu dată pentru CPT-uri", ci aproape sigur motivul real pentru care nu se implementează este "URL-urile cu dată pentru CPT-uri sunt prea complicate". CLAR există cazuri în care oamenii ar dori arhive pe bază de dată pentru un tip de postare personalizată, nu poți face ca această dorință evidentă să dispară doar prin menționarea formatelor de postare.

Trebuie să fiu puternic în dezacord. Tipurile de postare personalizate sunt menite să fie folosite pentru orice dorești să le folosești, nicăieri în Codex nu scrie că sunt pentru "aplicații web". De asemenea, este posibil să ai nevoie de o secțiune "știri" care are propria taxonomie personalizată și ai dori să ai arhive pentru aceasta. Sau chiar tipul sugerat "evenimente", care sunt o utilizare perfectă pentru CPT-uri, dar din nou, acelea ar putea avea nevoie la fel de ușor de arhive bazate pe dată.

O secțiune de știri sugerează fie un format de postare, fie o taxonomie care indică faptul că ai clasificat un articol ca știre. Un tip de postare personalizat nu este necesar pentru așa ceva. Oricum, simt că definiția ta de aplicație web poate să nu fie aceeași cu a mea, voi defini pur și simplu interpretarea mea în acest context ca fiind orice care nu este o pagină statică sau un articol de blog, care necesită o reprezentare asemănătoare postării a conținutului, și te-aș trimite la dezvoltatorul de bază WordPress care a afirmat inițial acest lucru (probabil Otto sau Nacin).

Într-adevăr, noi cu siguranță definim aplicațiile web diferit. Vestea bună este că Jack Lenox de la Automattic are un plugin care va permite acum arhivele pentru CPT-uri, vezi răspunsul meu mai jos. Astfel, putem în sfârșit crea cu ușurință arhive de date pentru lucruri precum "Evenimente" care chiar ar putea beneficia de această funcționalitate.

EDITARE -> deși acest răspuns încă funcționează pentru versiuni < WP4.4, începând cu versiunea 4.4 suportul pentru Tipuri de Postare Personalizate (Custom Post Types) este acum inclus în wp_get_archives()
În sfârșit există o soluție simplă, rapidă și ușoară pentru arhivele bazate pe dată ale Tipurilor de Postare Personalizate în WordPress! Aceasta a fost o problemă persistentă care este înregistrată aici în WP Core Trac.
Încă nu a fost rezolvată, dar unul dintre colaboratorii Trac a postat un simplu plugin pe GitHub care vă va permite să aveți arhive bazate pe dată pentru CPTs.
După instalarea acestui plugin, sau după adăugarea manuală a codului în fișierul de funcții, puteți folosi arhivele pentru CPTs astfel:
<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>
Rețineți că această nouă funcție wp_get_archives_cpt
funcționează la fel ca funcția standard wp_get_archives
, astfel încât puteți folosi oricare dintre argumentele obișnuite pe care le acceptă. Cu toate acestea, pur și simplu adaugă posibilitatea de a specifica un nume de tip de postare personalizată.

Nu am suficientă reputație pentru a adăuga acest răspuns la cel al lui taiken, îmi pare rău.
Totuși am vrut să adaug că răspunsul său a funcționat pentru mine, dar linkurile erau în formatul 'localhost/date/2010'. Însă eu aveam nevoie de formatul 'localhost/postslug/2010'. Am reușit să rezolv prin a folosi un înlocuitor de string pe output-ul lui wp_get_archives.
Deci, în funcție de cum ai setat permalink-urile, acest cod va rezolva problema 404 și va redirecționa linkurile către structura de permalink-uri personalizată pentru tipul de postare:
$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<numele tipului tău de postare>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<slug-ul tipului tău de postare>'),$yearly_archive);

Nu pot adăuga la postarea lui takien, așa că iată ce a trebuit să fac:
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) { // oricum determinați ce arhivă doriți
$link = str_replace($wp_rewrite->front, '/resource/news/', $link);
}
return $link;
}
Apelarea wp_get_archives()
wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));

Aceasta este prima ta răspuns. Doar un sfat când răspunzi la întrebări, nu doar adăuga cod sau, în acest sens, link-uri. Deși codul tău ar putea funcționa, este întotdeauna bine să știi ce face codul tău și de ce ar trebui să funcționeze. Altfel, răspunsul tău este frumos formatat. +1 pentru asta
