Archivi dei tipi di post personalizzati per data e tassonomia
3 risposta
- voti
-
- 2010-09-18
Sì,attualmentenonesisteil supportointegratopergli archivi CPT,ma ciònon significa chenonpuoiestendere WPperfornirlo. L'hofattoio stesso l'altrogiorno ...
Questonon creeràgli archivibasati sulla data che stai cercando,mati darà un comportamento di archivio virtualeperi tipi dipostpersonalizzati. Aggiungere la data dovrebbeessere solo questione dimodificare le regole di riscrittura (in realtà,i permalinkbasati sulla datapotrebberofunzionare così come sono) ...
ESEMPIO: hai untipopersonalizzato di "film"e un singolopost difilm chiamato "andato conil vento". Questo codiceti darà una struttura URL di website.com/movies/gone-with-the-wind. Inoltre,andando su website.com/movieselencherà soloi film (proprio come un archivio di categoria,anche senon chiameràilmodello archive.phpper l'output,maformatterà l'outputproprio comeilmodello di loopindex.php standard).
function register_post_type_archives( $post_type, $base_path = '' ) { global $wp_rewrite; if ( !$base_path ) { $base_path = $post_type; } $rules = $wp_rewrite->generate_rewrite_rules($base_path); $rules[$base_path.'/?$'] = 'index.php?paged=1'; foreach ( $rules as $regex=>$redirect ) { if ( strpos($redirect, 'attachment=') == FALSE ) { $redirect .= '&post_type='.$post_type; if ( 0 < preg_match_all('@\$([0-9])@', $redirect, $matches) ) { for ( $i=0 ; $i < count($matches[0]) ; $i++ ) { $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect); } } } add_rewrite_rule($regex, $redirect, 'top'); } }
chiama questafunzione subito dopo avergeneratoiltuotipo dipostpersonalizzato:
register_post_type('movies', $args); register_post_type_archives('movies');
Quindi,se desideriesserein grado di utilizzaremodellipersonalizzatiper controllare l'output di questielenchi di quasi archivi,puoi utilizzare questo:
add_action('template_redirect', 'post_type_templates'); function post_type_templates() { $post_type = get_query_var('post_type'); if (!empty($post_type)) { locate_template(array("{$post_type}.php","index.php"), true); die; } }
Orapuoi creare unmodello "movies.php"neltuotemae personalizzare l'output del loop atuopiacimento ..
AGGIORNAMENTO: avere lafunzionalità di archiviazioneperi tipipersonalizzati èfantastico,ma ho capito che avevobisogno di unmodoper accedervi. Ovviamentepuoi codificarepulsanti da qualcheparte chepuntano agli slug,ma ho creato unafunzionepergenerare unabarra dinavigazione wp3.0 contuttii mieitipi personalizzati al suointerno. In questomomentogenera unanuovabarra dinavigazionee la rende laprincipale,mapotresti cambiarlain secondaria o semplicemente aggiungereglielementi a unabarra dinavigazioneesistente. Nota:i collegamenti dinavigazionefunzioneranno solo se stai utilizzando le regole di riscrittura dall'alto.
function register_typenav() { $mainnav = wp_get_nav_menu_object('Types Nav'); if (!$mainnav) { $menu_id = wp_create_nav_menu( 'Types Nav' ); // vav item for each post type $types = get_post_types( array( 'exclude_from_search' => false ), 'objects' ); foreach ($types as $type) { if (!$type->_builtin) { wp_update_nav_menu_item( $menu_id, 0, array( 'menu-item-type' => 'custom', 'menu-item-title' => $type->labels->name, 'menu-item-url' => get_bloginfo('url') . '/' . $type->rewrite['slug'] . '/', 'menu-item-status' => 'publish' ) ); } } if ($mainnav && !has_nav_menu( 'primary-menu' ) ) { $theme = get_current_theme(); $mods = get_option("mods_$theme"); $key = key($mods['nav_menu_locations']); $mods['nav_menu_locations'][$key] = $mainnav->term_id; update_option("mods_$theme", $mods); } } add_action('init', 'register_typenav');
Yes, there isn't currently built-in support for CPT archives, but that doesn't mean you can't extend WP to provide it. I just did this myself the other day...
This won't create the date-based archives you're looking for, but it will give you virtual archive behavior for custom post types. Adding the date should just be a matter of tweaking the rewrite rules (actually, date-based permalinks might just work as-is)...
EXAMPLE: you have a custom type of "movies" and single movie post called "gone with the wind". This code will give you a URL structure of website.com/movies/gone-with-the-wind. Also, going to website.com/movies will list just the movies (just like a category archive, though it will not call the archive.php template for output, but will format the output just like the standard index.php loop template).
function register_post_type_archives( $post_type, $base_path = '' ) { global $wp_rewrite; if ( !$base_path ) { $base_path = $post_type; } $rules = $wp_rewrite->generate_rewrite_rules($base_path); $rules[$base_path.'/?$'] = 'index.php?paged=1'; foreach ( $rules as $regex=>$redirect ) { if ( strpos($redirect, 'attachment=') == FALSE ) { $redirect .= '&post_type='.$post_type; if ( 0 < preg_match_all('@\$([0-9])@', $redirect, $matches) ) { for ( $i=0 ; $i < count($matches[0]) ; $i++ ) { $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect); } } } add_rewrite_rule($regex, $redirect, 'top'); } }
call this function right after having generated your custom post type:
register_post_type('movies', $args); register_post_type_archives('movies');
Then, if you would like to be able to use custom templates to control the output of these quasi-archive listings, you can use this:
add_action('template_redirect', 'post_type_templates'); function post_type_templates() { $post_type = get_query_var('post_type'); if (!empty($post_type)) { locate_template(array("{$post_type}.php","index.php"), true); die; } }
Now you can create a "movies.php" template in your theme and customize the loop output to your liking..
UPDATE: having the archive functionality for custom types is great, but I realized I needed a way to access them. You can obviously hard-code buttons somewhere that point to the slugs, but I made a function to generate a wp3.0 navbar with all my custom types in it. Right now it spawns a new navbar and makes it the primary, but you could change it to be the secondary, or to just add the items to an existing navbar. Note: the nav links will only work if you're using the rewrite rules from above.
function register_typenav() { $mainnav = wp_get_nav_menu_object('Types Nav'); if (!$mainnav) { $menu_id = wp_create_nav_menu( 'Types Nav' ); // vav item for each post type $types = get_post_types( array( 'exclude_from_search' => false ), 'objects' ); foreach ($types as $type) { if (!$type->_builtin) { wp_update_nav_menu_item( $menu_id, 0, array( 'menu-item-type' => 'custom', 'menu-item-title' => $type->labels->name, 'menu-item-url' => get_bloginfo('url') . '/' . $type->rewrite['slug'] . '/', 'menu-item-status' => 'publish' ) ); } } if ($mainnav && !has_nav_menu( 'primary-menu' ) ) { $theme = get_current_theme(); $mods = get_option("mods_$theme"); $key = key($mods['nav_menu_locations']); $mods['nav_menu_locations'][$key] = $mainnav->term_id; update_option("mods_$theme", $mods); } } add_action('init', 'register_typenav');
-
Grazieper questo,loproveròe accetterò latua risposta/proporròmodifiche sepossofarlofunzionare ...Thanks for this, I'll try it out and accept your answer / propose changes if I can make it work...
- 0
- 2010-09-22
- Werner
-
Questo è FANTASTICO!Una domanda veloce,come aggiungereinomi ditassonomiapersonalizzati come voci secondariein unmenu.This is GREAT! One quick question, how would I add custom taxonomy names as sub items on a menu.
- 0
- 2010-09-26
- Brad
-
Brad,immagino chepubblicare unanuova domandaper questo siailmodomiglioreper andare avanti,ameno chenonmodifichi somaticamenteil suopost?Brad, I guess posting a new question for that is the best way forward, unless somatic edits his post?
- 0
- 2010-09-27
- Werner
-
ciò richiederebbe un set di codice completamentenuovo,e sarebbemeglio come domanda separata ... a cui sareifelice di rispondere ;-) Werner- ho risposto alla domanda originale?Ti sareigrato se scegliessi lamia risposta come "accettata".that would require a whole new set of code, and would be best as a separate question... which I'd be happy to answer ;-) Werner- have I answered the original question? I would appreciate you choosing my answer as "accepted".
- 0
- 2010-10-10
- somatic
-
- 2010-09-15
Itipi dipostpersonalizzatinon sonoprogettatiperfornire un archivio comefailtipo dipost diblog comune.Questopotrebbeessere qualcosa che verrà cambiatoin futuro.
Questo èil collegamentomancante: miglioramenti ai Custom Post Types (CPT) chemeritanoconsiderazionein 3.1 .
Custom Post Types are not designed to provide archive as the common blog post post type does. This might be something that will be changed in the future.
This is the missing link: Custom Post Types (CPT) enhancements that deserve consideration in 3.1.
-
- 2012-03-14
Questopluginfornisceesattamente quello che vuoi.Funzionabene con Wordpress 3.3.1.
This plugin provides the exactly what you want. It works well with Wordpress 3.3.1.
Usiamoil classicoesempio di untipo dipostpersonalizzato chiamato "film",con unapropriatassonomia chiamata "genere".
Registrandoiltipo dipostpersonalizzato (con uno slug "film"),i permalink sonogiàimpostatiper
...per vederetuttii film delgenere d'azione.
Ma archiviaper data,come
...non conoscoiltipo dipostpersonalizzato.
L'archiviobasato sulla datapiù vicino che riesco atrovare è:
... cheelencatuttii tipi dipostpersonalizzatipubblicati durante l'annoin corso (2010). Per qualchemotivo,ilmese,latassonomiae unterminenonpossonoessere aggiunti all'URLper ottenereil risultatoprevisto.
Cosabisognafareper abilitare URL come questi ...
...perfunzionare comeprevisto,quindiperelencaretuttii film d'azionepubblicatinel settembre 2010?