Einen Custom Post Type einrichten ohne eigene „Detailseite“ mit „publicly_queryable“
Benötigt man einen eigenen Beitragstypen bzw. "Custom Post Type" wird in der Regel auch eine dazu passende Detailseite benötigt. Wer zum Beispiel einen eigenen Beitragstypen "Immobilie" erstellt, wird neben der Archiv-Ansicht bzw. Übersicht womöglich auch eine Detailseite für seine Immobilie benötigen. Manchmal wird aber nur ein Beitragstyp benötigt, der keine Detailseite besitzt. Wir zeigen wie das funktioniert.
Angenommen wir registrieren in WordPress einen Custom Post Type „Immobilie“, wird WordPress gemäß der Template-Hierarchie erstmal schauen, ob es innerhalb des Themes eine Datei single-immobilie.php findet. Ist dies nicht der Fall, wird die Datei single.php gesucht. Das ist mitunter aber schon gar nicht gewünscht, zum Beispiel wenn die single.php bereits für die Detailansicht der „normalen Beiträge“ genutzt wird.
Nun könnte man eine Datei single-immobilie.php mit einer Weiterleitung ausstatten. Eleganter wäre es aber, die Detailansicht eines Custom Post Types abzuschalten.
Folgender Code registriert den Custom Post Type innerhalb von WordPress – und sorgt dafür, dass die Posts zwar über die Funktion wp_query() weiterhin öffentlich ausgelesen werden können, aber keine Detailansicht „gesucht“ wird.
Achtung: Keine Vorschau oder Beitrags-Ansicht innerhalb des Dashboards möglich
Diese Einstellung hat ebenfalls zur Folge, dass ausgehend vom "Backend" keine Vorschau oder Seiten-Ansicht aufgerufen werden kann. Logisch: Es gibt ja keine Detailansicht, entsprechend kann vom Backend heraus auch nichts aufgerufen werden (der Custom Post Type selber kann natürlich bearbeitet werden).
<?php
// Register Custom Post Type
function pixelbar_immofunc() {
$labels = array(
'name' => _x( 'Immobilien', 'Post Type General Name', 'pixelbar' ),
'singular_name' => _x( 'Immobilie', 'Post Type Singular Name', 'pixelbar' ),
'menu_name' => __( 'Immobilien', 'pixelbar' ),
'name_admin_bar' => __( 'Immobilien', 'pixelbar' ),
'archives' => __( 'Immobilie Archive', 'pixelbar' ),
'attributes' => __( 'Immobilie Eigenschaften', 'pixelbar' ),
'parent_item_colon' => __( 'Übergeordnetes Immobilie', 'pixelbar' ),
'all_items' => __( 'Alle Immobilien', 'pixelbar' ),
'add_new_item' => __( 'Neues Immobilie hinzufügen', 'pixelbar' ),
'add_new' => __( 'Neues hinzufügen', 'pixelbar' ),
'new_item' => __( 'Neues Immobilie', 'pixelbar' ),
'edit_item' => __( 'Immobilie bearbeiten', 'pixelbar' ),
'update_item' => __( 'Immobilie aktualisieren', 'pixelbar' ),
'view_item' => __( 'Immobilie ansehen', 'pixelbar' ),
'view_items' => __( 'Immobilien ansehen', 'pixelbar' ),
'search_items' => __( 'Immobilie suchen', 'pixelbar' ),
'not_found' => __( 'Nicht gefunden', 'pixelbar' ),
'not_found_in_trash' => __( 'Nicht gefunden im Papierkorb', 'pixelbar' ),
'featured_image' => __( 'Aufnahme der Immobilie', 'pixelbar' ),
'set_featured_image' => __( 'Aufnahme festlegen', 'pixelbar' ),
'remove_featured_image' => __( 'Aufnahme entfernen', 'pixelbar' ),
'use_featured_image' => __( 'Als Immobilien-Aufnahme einsetzen', 'pixelbar' ),
'insert_into_item' => __( 'In Element einfügen', 'pixelbar' ),
'uploaded_to_this_item' => __( 'Zu diesem Element hinzugefügt', 'pixelbar' ),
'items_list' => __( 'Immobilien-Liste', 'pixelbar' ),
'items_list_navigation' => __( 'Navigation der Immobilien-Liste', 'pixelbar' ),
'filter_items_list' => __( 'Immobilien-Liste filtern', 'pixelbar' ),
);
$args = array(
'label' => __( 'Immobilie', 'pixelbar' ),
'description' => __( 'Ihre Immobilienverwaltung', 'pixelbar' ),
'labels' => $labels,
'supports' => array( 'title', 'editor' ),
'taxonomies' => array( 'Immobiliecat' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-thumbs-up',
'show_in_admin_bar' => true,
'show_in_nav_menus' => true,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => false,
'capability_type' => 'post',
'show_in_rest' => true,
);
register_post_type( 'immo', $args );
}
add_action( 'init', 'pixelbar_immofunc', 0 );
Und welcher Teil sorgt nun innerhalb dieses Codes dafür, dass keine Detailseite erstellt wird?
Konkret sorgt die Anweisung publicly_queryable dafür, dass im Frontend die Detailansicht gar nicht erst aufgerufen werden kann (und man wie erwähnt vom Backend aus den Beitrag – auch nicht via Vorschau – ansehen kann). Steht diese auf false, kann einfach keine Detailseite aufgerufen werden vom Frontend aus.
'publicly_queryable' => false,