Arhive pentru Tipuri de Postări Personalizate după An și Lună

16 nov. 2011, 17:07:55
Vizualizări: 38.6K
Voturi: 17

Cum poți afișa arhivele unui Tip de Postare Personalizat (Custom Post Type) organizate după An și Lună?

1
Comentarii

Soluția mea de mai jos funcționează dacă utilizați < WP 4.4, dar începând cu lansarea WP 4.4, wp_get_archives() ÎN SFÂRȘIT suportă tipurile personalizate de postări: https://developer.wordpress.org/reference/functions/wp_get_archives/

Trevor Trevor
2 ian. 2016 01:31:35
Toate răspunsurile la întrebare 5
4
17

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>';
12 feb. 2012 19:04:38
Comentarii

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.

jerclarke jerclarke
21 sept. 2012 19:12:35

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.

Kevin C. Kevin C.
23 mar. 2013 00:31:28

Î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?

gaoshan88 gaoshan88
11 apr. 2013 08:56:15

Ș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/

Trevor Trevor
9 iul. 2014 21:01:44
8

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.

16 nov. 2011 17:22:40
Comentarii

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?

Dan Lee Dan Lee
17 nov. 2011 15:02:20

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

Tom J Nowell Tom J Nowell
17 nov. 2011 15:05:30

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)

Tom J Nowell Tom J Nowell
17 nov. 2011 15:12:31

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.

jerclarke jerclarke
21 sept. 2012 20:36:02

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ă.

Trevor Trevor
3 ian. 2015 00:02:06

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

Tom J Nowell Tom J Nowell
4 ian. 2015 00:26:04

Î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.

Trevor Trevor
23 ian. 2015 23:25:26

Cred că poziția oficială a dezvoltatorilor WordPress s-a schimbat :) ... Acum această funcționalitate este inclusă în nucleu.

Trevor Trevor
23 mai 2016 09:48:21
Arată celelalte 3 comentarii
0

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ă.

3 ian. 2015 00:08:06
0

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);
12 sept. 2013 11:58:26
1

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'));
17 apr. 2014 19:06:41
Comentarii

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

Pieter Goosen Pieter Goosen
17 apr. 2014 19:28:16