Seitentypen (CPT)¶
Einstimmung: immer sauber die Seiten (Pages) und die Beiträge (Posts) auseinanderhalten!
Die Technik müsste (in deutsch) eigentlich Beitragstypen heißen!
Der WordPress Standard kennt die folgendenen zwei Typen: (siehe auch Beiträge vs. Seiten: Gegenüberstellung)
Beiträge (Blog-Posts - die klassische Auslieferung: Blogtechnik)
Seiten (Pages - Statische Seiten; keine Kategorien, keine Tags, Menü für Linking benötigt, …)
Wir wollen uns jetzt eigene Seitentypen für Beiträge erstellen: Custom Post Types (CPT)
Hinweis
Für die Profis: besser werden die CPT-Code später in eigenen Plugins ausgelagert.
CPT Linksammlung¶
Anleitungen:
https://www.cpu20.de/2015/wordpress-cms-eigene-seiten-typen-definieren/
https://www.drweb.de/wordpress-intern-einstieg-custom-post-types-50402/
mit Video und Plugin vs. manuell
https://www.wpbeginner.com/wp-tutorials/how-to-create-custom-post-types-in-wordpress/
Custom Post Type als Plugin
Icons für Dashboard
Plug-ins für Custom Post Types
CPT Beispiel¶
Praxisbeispiel für einen neuen Seitentyp Veranstaltungen
nach Anleitung „WordPress 5 - Das umfassende Handbuch - Richard Eisenmenger - Kap. 19.1“
1<?php
2/**
3 * Plugin Name: WH Custom Post Type
4 */
5function add_wh_events() {
6 $labels = array(
7 'name' => 'Veranstaltungen',
8 'singular_name' => 'Veranstaltung',
9 'add_new' => 'Erstellen',
10 'add_new_item' => 'Neue Veranstaltung erzeugen',
11 'edit_item' => 'Veranstaltung bearbeiten',
12 'new_item' => 'Neue Veranstaltung',
13 'view_item' => 'Veranstaltung ansehen',
14 'view_items' => 'Veranstaltungen ansehen',
15 'search_items' => 'Nach Veranstaltungen suchen',
16 'not_found' => 'Nichts gefunden',
17 'not_found_in_trash' => 'Nichts im Papierkorb gefunden',
18 'all_items' => 'Alle Veranstaltungen',
19 'archives' => 'Veranstaltungsarchiv',
20 'attributes' => 'Veranstaltungsattribute',
21 'insert_into_item' => 'Einfügen',
22 'uploaded_to_this_item' => 'Medien für Veranstaltungen',
23 'featured_image' => 'Veranstaltungs-Flyer',
24 'set_featured_image' => 'Veranstaltungs-Flyer festlegen',
25 'remove_featured_image' => 'Veranstaltungs-Flyer entfernen',
26 'use_featured_image' => 'Veranstaltungs-Flyer verwenden',
27 'menu_name' => 'Veranstaltungen',
28 'filter_items_list' => 'Veranstaltungen',
29 'items_list_navigation' => 'Veranstaltungen',
30 'items_list' => 'Weitere Veranstaltungen',
31 'name_admin_bar' => 'Veranstaltung',
32 );
33
34 $args = array(
35 'labels' => $labels,
36 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'comments', 'trackbacks', ),
37 'taxonomies' => array( 'category', 'post_tag' ),
38 'hierarchical' => false,
39 'public' => true,
40 'show_in_rest' => true,
41 'show_ui' => true,
42 'show_in_menu' => true,
43 'show_in_nav_menus' => true,
44 'show_in_admin_bar' => true,
45 'menu_position' => 5,
46 'can_export' => false,
47 'has_archive' => true,
48 'exclude_from_search' => false,
49 'publicly_queryable' => true,
50 'rewrite' => array('slug' => 'veranstaltung'),
51 'capability_type' => 'page',
52 );
53 register_post_type( 'wh_event', $args );
54}
55add_action( 'init', 'add_wh_events', 0);
Die Skriptbezeichnung wh-custon-post-type.php
weist auf das WordPress Handbuch hin.
Die Datei muss im Ordnerpfad ./wp-content/plugins/wh-custom-post-type.php
gespeichert sein.
Der Post-Type heißt wh_event - siehe hierzu auch Quellcode im Dashboard: CSS-ID menu-posts-wh_event
. Darüber könnte
man dann auch ein individuelles Icon stylen: Dashicons .
Hierzu im Code einfach im Array $args (ab Zeile 34) eine neue Array-Zeile 'menu_icon' = 'dashicons-tickets',
hinzufügen.
Damit die Veranstaltungen in der Site (im Frontend) auch ausgeliefert werden, kann man einzelne Veranstaltungen oder auch eine Blogging-Ansicht aller Veranstaltungen (siehe Veranstaltungsarchiv) in ein Menü aufnehmen.
Die speziellen Felder für die Spezial-Posts Veranstaltungen werden natürlich nicht einfach mit ausgegeben, da die Theme-Techniken nur die Normal-Posts - also die Beiträge (bzw. Seiten) - kennen und deren Infos ausgeben.
Für eine einfache - und technisch unsaubere - Lösung kann man die nötigen DB-Feldinformationen auch direkt mit ein paar PHP-Zeilen in den Standard-Templates-Skripten für die Ausgabe einzelner Beiträge / Seiten integrieren.
Für diese Einzelseiten kennt die WordPress-Architektur (siehe WP Hierarchy ) für Posts folgende Reihenfolge: Template Hierarchy
single-{post-type}-{slug}.php – (Since 4.4) First, WordPress looks for a template for the specific post. For example, if post type is product and the post slug is dmc-12, WordPress would look for single-product-dmc-12.php.
single-{post-type}.php – If the post type is product, WordPress would look for single-product.php.
single.php – WordPress then falls back to single.php.
singular.php – Then it falls back to singular.php.
index.php – Finally, as mentioned above, WordPress ultimately falls back to index.php.
Man könnte also die singular.php
aus dem Theme „Twenty Twenty“ wie folgt ergänzen:
1<?php
2/**
3 * The template for displaying single posts and pages.
4 *
5 * @link https://developer.wordpress.org/themes/basics/template-hierarchy/
6 *
7 * @package WordPress
8 * @subpackage Twenty_Twenty
9 * @since Twenty Twenty 1.0
10 */
11
12get_header();
13?>
14
15<main id="site-content" role="main">
16
17 <?php
18
19 if ( have_posts() ) {
20
21 while ( have_posts() ) {
22 the_post();
23
24 if ( $custom = get_post_custom() ) {
25 $location = ( isset($custom['location'][0] )) ? 'in ' . $custom['location'][0] : '';
26 $eventdate = ( isset($custom['eventdate'][0] )) ? 'am ' . date_i18n(get_option( 'date_format' ), strtotime($custom['eventdate'][0])) : '';
27 if ( !empty( $location ) || !empty ($eventdate)) {
28 echo ' <h3 class="comments-area">Veranstaltung ' . $location . ' ' . $eventdate . '</h3>';
29 }
30 }
31
32 get_template_part( 'template-parts/content', get_post_type() );
33 }
34 }
35
36 ?>
37
38</main><!-- #site-content -->
39
40<?php get_template_part( 'template-parts/footer-menus-widgets' ); ?>
41
42<?php get_footer(); ?>
Oder man könnte sich eine passende single-wh_event.php
schreiben, denn der Post Type ist ja wh_event
.
Bitte später unbedingt für solche Ausgaben besser eigene Child-Themes nutzen, da man sonst bei Theme-Updates die Anpassungen wieder verliert!