Archives de type de message personnalisé par date et taxonomie
3 réponses
- votes
-
- 2010-09-18
Oui,iln'y a actuellementpas de supportintégrépour les archives CPT,mais celane signifiepas que vousne pouvezpas étendre WPpour lefournir. Je viens defaire çamoi-même l'autrejour ...
Celane créerapas les archivesbasées sur la date que vous recherchez,mais cela vous donnera un comportement d'archivage virtuelpour lestypes depublicationpersonnalisés. L'ajout de la date devrait simplement être une question depeaufiner les règles de réécriture (enfait,lespermaliensbasés sur la datepeuventfonctionnertels quels) ...
EXEMPLE: vous avez untypepersonnalisé de "films"et un seulpost defilmintitulé "parti avec le vent". Ce code vous donnera une structure d'URL de website.com/movies/gone-with-the-wind. Deplus,aller sur website.com/moviesne listera que lesfilms (tout comme une archive de catégorie,bien qu'iln'appellepas lemodèle archive.phppour la sortie,maisformatera la sortie comme lemodèle deboucle standardindex.php).
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'); } }
appelez cettefonctionjuste après avoirgénéré votretype depublicationpersonnalisé:
register_post_type('movies', $args); register_post_type_archives('movies');
Ensuite,si vous souhaitezpouvoir utiliser desmodèlespersonnaliséspour contrôler la sortie de ces listes quasi-archivées,vouspouvez utiliser ceci:
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; } }
Vouspouvezmaintenant créer unmodèle "movies.php" dans votrethèmeet personnaliser la sortie de laboucle à votreguise.
MISE À JOUR: avoir lafonctionnalité d'archivagepour lestypespersonnalisésestgénial,maisj'ai réalisé quej'avaisbesoin d'unmoyen d'y accéder. Vouspouvez évidemment coderen dur desboutons quelquepart quipointent vers les slugs,maisj'ai créé unefonctionpourgénérer unebarre denavigation wp3.0 avectousmestypespersonnalisés. À l'heure actuelle,ilgénère unenouvellebarre denavigationet enfait laprincipale,mais vouspouvez la changerpour qu'elle soit secondaire ou simplement ajouter les éléments à unebarre denavigationexistante. Remarque: les liens denavigationne fonctionneront que si vous utilisez les règles de réécriture ci-dessus.
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');
-
Mercipour cela,je vais l'essayeret accepter votre réponse/proposer desmodifications sije peux lefairefonctionner ...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
-
C'estbien!Une question rapide,comment ajouter desnoms detaxonomiepersonnalisésen tant que sous-éléments d'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,je suppose quepublier unenouvelle questionest lameilleurefaçon d'avancer,àmoins que Somaticne modifie sonmessage?Brad, I guess posting a new question for that is the best way forward, unless somatic edits his post?
- 0
- 2010-09-27
- Werner
-
celanécessiterait untoutnouvelensemble de code,et seraitpréférable comme question séparée ... à laquelleje serais heureux de répondre ;-) Werner- ai-je répondu à la question d'origine?J'apprécierais que vous choisissiezma réponse comme «acceptée».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
Lestypes depublicationpersonnalisésne sontpas conçuspourfournir des archives comme lefait letype depublication deblog commun.Celapourrait être quelque chose qui sera changé à l'avenir.
Voici le lienmanquant: améliorations destypes demessagespersonnalisés (CPT) quiméritentpriseen compteen 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
Cepluginfournitexactement ce que vous voulez.Celafonctionnebien avec Wordpress 3.3.1.
This plugin provides the exactly what you want. It works well with Wordpress 3.3.1.
Utilisons l'exemple classique d'untype depublicationpersonnalisé appelé "films",avec sapropretaxonomie appelée "genre".
Enenregistrant letype depublicationpersonnalisé (avec un slug "film"),lespermaliens sont déjà configuréspour
...pour voirtous lesfilms dugenre action.
Mais,les archivespar date,comme
...je ne connaispas letype demessagepersonnalisé.
L'archivebasée sur la date laplusproche sur laquelleje peuxtravaillerest:
... qui répertorietous lestypes d'articlespersonnaliséspubliés au cours de l'annéeen cours (2010). Pour une raison quelconque,lemois,lataxonomieet untermene peuventpas être ajoutés à l'URLpour obtenir le résultat attendu.
Quefaut-ilfairepour activer les URL comme celles-ci ...
...pourtravailler commeprévu,doncpour listertous lesfilms d'actionpostésen septembre 2010?