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:

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

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

  2. single-{post-type}.php – If the post type is product, WordPress would look for single-product.php.

  3. single.php – WordPress then falls back to single.php.

  4. singular.php – Then it falls back to singular.php.

  5. 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!