Wie stelle ich einen benutzerdefinierten Beitragstyp als statische Titelseite ein?

Ich schreibe mein benutzerdefiniertes Thema von Grund auf und ich habe einen benutzerdefinierten Post-Typ ‘my_frontpage’ und möchte einen seiner Beiträge als Startseite deklarieren. Ich möchte dies über Admin tun, daher fügen Sie einfach meine cpt auf der Vorderseite Auswahlfeld in Aussehen >> Anpassen >> Statische Vorderseite .

Dieses Problem wurde schon einige Male im Internet diskutiert. Allerdings konnte ich nicht finden, wie statementen, die alle Schritte zum Erreichen dieses Ziels umfassend erklären.

Bis jetzt habe ich verstanden, dass ich eine Art Haken verwenden muss, um die Auswahl der verfügbaren Titelseiten mit Posts von meinem cpt zu erweitern. Aber welcher Haken zu benutzen? Ich würde nicht einmal wissen, ob ich eine Aktion oder einen Filterhaken benutzen muss? Könnte mich bitte jemand durch dieses Thema in Laiensprache führen?

Das nächste Ergebnis, das ich finden konnte, war diese Frage . Allerdings kann ich noch nicht ganz verstehen, was dort passiert …

Solutions Collecting From Web of "Wie stelle ich einen benutzerdefinierten Beitragstyp als statische Titelseite ein?"

Ich hatte Zeit, Ihr Problem und die Seite options-reading.php zu betrachten, die die Vorlage ist, die verwendet wird, um die Seite mit den Leseeinstellungen im Backend zu rendern.

Es gibt leider keine Filter zum Filtern oder Hinzufügen von benutzerdefinierten Posts als klebrige Posts in einem wählbaren Dropdown-Menü. Es gibt zwei versteckte Filter, die wir verwenden können, sie sind

  • wp_dropdown_pages innerhalb der wp_dropdown_pages() function die vom Dropdown verwendet wird, die die Liste der Seiten anzeigt, die als statische Titelseite eingestellt werden können

  • get_pages innerhalb der function get_pages() , die für die Rückgabe der Seiten zuständig ist, die von wp_dropdown_pages()

Ich denke, get_pages hier ist eine bessere Option. Auf diese Weise lassen wir wp_dropdown_pages() sich um alle wp_dropdown_pages() kümmern. Wir müssen jedoch hier get_pages wenn wir den get_pages Filter verwenden

  • Wir müssen sicherstellen, dass wir nur auf den Admin-Bereich und insbesondere auf die Seite mit den get_pages() andernfalls werden wir jede function / Seite ändern, die die function get_pages() verwendet

Sie müssen entscheiden, ob Sie Seiten benötigen, die mit den benutzerdefinierten Post-Posts angezeigt werden sollen, oder nur die benutzerdefinierten Post-Typen benötigen

Sie können Folgendes versuchen:

 add_filter( 'get_pages', function ( $pages, $args ) { // First make sure this is an admin page, if not, bail if ( !is_admin() ) return $pages; // Make sure that we are on the reading settings page, if not, bail global $pagenow; if ( 'options-reading.php' !== $pagenow ) return $pages; // Remove the filter to avoid infinite loop remove_filter( current_filter(), __FUNCTION__ ); $args = [ 'post_type' => 'my_frontpage', 'posts_per_page' => -1 ]; // Get the post type posts with get_posts to allow non hierarchical post types $new_pages = get_posts( $args ); /** * You need to decide if you want to add custom post type posts to the pages * already in the dropdown, or just want the custom post type posts in * the dropdown. I will handle both, just remove what is not needed */ // If we only need custom post types $pages = $new_pages; // If we need to add custom post type posts to the pages // $pages = array_merge( $new_pages, $pages ); return $pages; }, 10, 2 ); 

Sie sollten nun Ihre benutzerdefinierten Post-Posts im Dropdown-Menü sehen. Beachten Sie, dass sich dieser Code auch auf das Dropdown-Menü für die Blog-Seite auswirkt.

Um dies zu vermeiden, können Sie einen statischen Zähler verwenden, um die Häufigkeit zu zählen, mit der der Filter ausgeführt wurde, und dann eine Sicherheitsverletzung auslösen, bevor der Filter auf das Dropdown-Menü der Blogseite angewendet wird. Der Filter wird insgesamt dreimal ausgeführt, wenn get_pages() dreimal ausgeführt wird:

  • Zuerst prüfen wir, ob wir tatsächlich Seiten als statische Titelseite haben.

  • Der zweite Lauf befindet sich innerhalb von wp_dropdown_pages() das von der statischen Titelseite verwendet wird

  • Der letzte Lauf wird innerhalb von wp_dropdown_pages() das vom blogpage Dropdown verwendet wird

Also, basierend darauf können wir es versuchen

 add_filter( 'get_pages', function ( $pages, $args ) { // First make sure this is an admin page, if not, bail if ( !is_admin() ) return $pages; // Make sure that we are on the reading settings page, if not, bail global $pagenow; if ( 'options-reading.php' !== $pagenow ) return $pages; // Remove the filter to avoid infinite loop remove_filter( current_filter(), __FUNCTION__ ); // Setup our static counter static $counter = 0; // Bail on the third run all runs after this. The third run will be 2 if ( 2 < = $counter ) return $pages; // Update our counter $counter++; $args = [ 'post_type' => 'my_frontpage', 'posts_per_page' => -1 ]; // Get the post type posts with get_posts to allow non hierarchical post types $new_pages = get_posts( $args ); /** * You need to decide if you want to add custom post type posts to the pages * already in the dropdown, or just want the custom post type posts in * the dropdown. I will handle both, just remove what is not needed */ // If we only need custom post types $pages = $new_pages; // If we need to add custom post type posts to the pages // $pages = array_merge( $new_pages, $pages ); return $pages; }, 10, 2 ); 

Wenn Sie das Frontend besuchen und die Startseite besuchen, werden Sie feststellen, dass es auf die einzelne Post-Seite umgeleitet wird. Dies liegt daran, dass die Hauptabfrage auf einer statischen Titelseite standardmäßig so eingestellt ist, dass der Seitenpostentyp abgefragt wird. Dies führt dazu, dass 404 zurückgegeben wird und redirect_canonical() dann zu der einzelnen Post-Seite umleitet. Das ist einfach zu lösen, wir müssen lediglich die Hauptabfrage auf der statischen Titelseite anpassen.

 add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Only target the front end && $q->is_main_query() // Only target the main query && 'page' === get_option( 'show_on_front' ) // Only target the static front page ) { $q->set( 'post_type', 'my_frontpage' ); } }); 

Jetzt wird Ihre statische Titelseite korrekt angezeigt.

Sie müssen lediglich eine Vorlage festlegen. Sie können einfach eine front-page.php , WordPress wird sie automatisch verwenden

Während Pieter das Thema ohne Zweifel elegant und umfassend triggerse, ging ich schließlich mit einer anderen Lösung, die ich hier auch teilen möchte. Vielleicht haben einige Leute ähnliche Probleme in der kommenden Zeit.

Für die benutzerdefinierte Post-Typ-Definition, wie in meiner Frage beschrieben, habe ich ein Plugin namens Pods verwendet . Da die Plugin-Entwickler und die Community wahrscheinlich regelmäßig mit benutzerdefinierten Post-Typen umgehen, dachte ich, es könnte hilfreich sein, meine Frage auch in ihrem Support-Kanal zu stellen.

Es war ein sehr hilfsbereiter Typ aus dem Entwicklungsteam von Pods, der mich in die Richtung wies, mit der ich schließlich ging. Anstatt einen benutzerdefinierten Post-Typ zu definieren, um eine sehr individuelle statische Titelseite zu erstellen, empfiehlt er stattdessen, benutzerdefinierte Felder zu einer Standardseite hinzuzufügen, die zur Startseite werden soll. Das habe ich getan, um mein Ziel zu erreichen, und das empfehle ich auch anderen Nutzern.

Aus Sicht der Datenmodellierung gibt es keinen Grund, einen vollständigen Datentyp oder, sagen wir, eine class zu definieren, wenn Sie sie nur auf einen einzelnen Artikel anwenden wollen – in meinem Fall eine einzelne Titelseite. Ich habe ein anderes Plugin mit dem Namen ” Erweiterte benutzerdefinierte Felder” verwendet , da dies erweiterte Datentypen für Ihre benutzerdefinierten Felder ermöglicht, die WordPress standardmäßig bereitstellt. Sie können Ihre benutzerdefinierten Felder auch über functions.php hinzufügen. Ich hoffe, das hilft.

Nun, es gibt auch eine zusätzliche Möglichkeit, die Verwendung einer Seitenvorlage zu vermeiden und WordPress die Titelseite laden zu lassen, indem Sie die richtige Vorlage für den Post-Typ verwenden. Dadurch vermeiden Sie doppelten Code, wenn Sie die Titelseite für den einzelnen Post selbst gleich aussehen lassen möchten:

 add_filter( 'template_include', 'add_front_page_template_path', 10, 1); function add_front_page_template_path( $template_path ) { if ( is_front_page() && get_option( 'show_on_front' ) == 'page' && ( $post_id = get_option( 'page_on_front' ) ) && ( $post_type = get_post_type( $post_id ) ) != 'page' ) { $_template_path = get_single_template( $post_type ); /* In case there's no template */ $template_path = ( $template_path == '' ) ? $template_path : $_template_path; } return $template_path; }