Benutzerdefinierte Post-Typ-Archive nach Datum und Taxonomie
3 Antworten
- Stimmen
-
- 2010-09-18
Ja,esgibt derzeit keineintegrierte Unterstützungfür CPT-Archive,aber dasbedeutetnicht,dass Sie WPnichterweitern können,umesbereitzustellen. Ich habe dasneulich selbstgemacht ...
Dadurch werdennicht die von Ihnengesuchten datumsbasierten Archiveerstellt,sondernes wirdein virtuelles Archivverhaltenfürbenutzerdefinierte Beitragstypen angezeigt. Das Hinzufügen des Datums solltenureine Frage der Anpassung der Umschreiberegeln sein (tatsächlichfunktionieren datumsbasierte Permalinksmöglicherweise so wie sie sind) ...
BEISPIEL: Sie habeneine benutzerdefinierte Art von "Filmen" undeinen einzelnen Filmbeitragmit dem Namen "Vom Winde verweht". Dieser Codegibt Ihneneine URL-Struktur von website.com/movies/gone-with-the-wind. Wenn Sie auf website.com/moviesgehen,werdennur die Filme aufgelistet (genau wiebei einem Kategoriearchiv,obwohl die Vorlage archive.phpnichtfür die Ausgabe aufgerufen wird,sondern die Ausgabegenau wiebei der Standardschleifenvorlageindex.phpformatiert wird).
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'); } }
Rufen Sie diese Funktion direktnach dem Generieren Ihresbenutzerdefinierten Beitragstyps auf:
register_post_type('movies', $args); register_post_type_archives('movies');
Wenn Siebenutzerdefinierte Vorlagen verwendenmöchten,um die Ausgabe dieser Quasi-Archiv-Listen zu steuern,können Sie Folgendes verwenden:
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; } }
Jetzt können Sieeine Vorlage "movies.php"in Ihrem Themaerstellen und die Schleifenausgabenach Ihren Wünschen anpassen.
UPDATE: Die Archivierungsfunktionfürbenutzerdefinierte Typenistgroßartig,abermir wurde klar,dassicheine Möglichkeitbrauchte,auf sie zuzugreifen. Sie könnennatürlichirgendwo Schaltflächenfest codieren,die auf die Slugs verweisen,aberich habeeine Funktion zum Generiereneiner wp3.0-Navigationsleistemit allmeinen benutzerdefinierten Typenerstellt. Im Momenterzeugteseine neue Navigationsleiste undmacht sie zurprimären,aber Sie können sie als sekundäre ändern oder die Elementeeinfach zueiner vorhandenen Navigationsleiste hinzufügen. Hinweis: Die Navigationslinksfunktionierennur,wenn Sie die obenbeschriebenen Umschreiberegeln verwenden.
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');
-
Vielen Dank dafür,ich werdees ausprobieren und Ihre Antwort akzeptieren/Änderungen vorschlagen,wenniches zum Laufenbringen kann ...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
-
Dasisttoll!Eine kurze Frage: Wie würdeichbenutzerdefinierte Taxonomienamen als Unterelementein einem Menü hinzufügen?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,ich denke,eine neue Frage zu stellenist derbeste Weg,es sei denn,somaticbearbeitet seinen Beitrag?Brad, I guess posting a new question for that is the best way forward, unless somatic edits his post?
- 0
- 2010-09-27
- Werner
-
das würdeeinen ganzneuen Codeerfordern und wäre ambesten als separate Frage ... dieichgernebeantworten würde ;-) Werner- habeich die ursprüngliche Fragebeantwortet?Ich würdemichfreuen,wenn Siemeine Antwort als "akzeptiert" wählen.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
Benutzerdefinierte Beitragstypen sindnicht dafür ausgelegt,ein Archivbereitzustellen,wie diesbeim allgemeinen Beitragstypfür Blog-Beiträge der Fallist.Dies könnte sichin Zukunft ändern.
Diesist dasfehlende Glied: CPT-Verbesserungen (Custom Post Types),diees verdienenBerücksichtigungin 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
Dieses Pluginbietet genau das,was Sie wollen.Esfunktioniertgutmit Wordpress 3.3.1.
This plugin provides the exactly what you want. It works well with Wordpress 3.3.1.
Verwenden wir das klassische Beispieleinesbenutzerdefinierten Beitragstypsnamens "Filme"mit einereigenen Taxonomienamens "Genre".
Durch Registrieren desbenutzerdefinierten Beitragstyps (miteinem "Film" -Schlitz) sind die Permalinksbereitsfür
eingerichtet... um alle Filmeim Action-Genre zu sehen.
Aber Archivenach Datum,wie
... weißnichts über denbenutzerdefinierten Beitragstyp.
Dasnächstgelegene datumsbasierte Archiv,an demich arbeiten kann,ist:
... listet allebenutzerdefinierten Beitragstypen auf,dieim laufenden Jahr (2010) veröffentlicht wurden. Ausirgendeinem Grund können der URLnicht der Monat,die Taxonomie undein Begriff hinzugefügt werden,um daserwartete Ergebnis zuerhalten.
Wasmussgetan werden,um URLs wie diese zu aktivieren ...
... um wieerwartet zu arbeiten und somit alleim September 2010 veröffentlichten Actionfilme aufzulisten?