Wie verwenden Sie einen CPT als Standard-Homepage?

Ich habe einen Kunden, dessen Website die benutzerdefinierten Beitragstypen zur Konfiguration ihrer Website stark nutzt. Aber ich bin zwischen einem Stein und einem harten Platz für ihre angeforderte Homepage.

In Wirklichkeit ist die Startseite ein Stapel bestimmter “Seiten” in WordPress. Grundsätzlich gibt es Seiten für: Intro , Blog , Über uns , Portfolio und Kontakt . Sie werden alle übereinander gestapelt, so dass Sie von einer Seite zur nächsten blättern können.

Mein erster Instinkt war, einfach eine Seite ( Home ) zu verwenden und einen Shortcode einzubetten, der Seiten-Slugs akzeptiert und die richtige Reihenfolge ausgibt ( [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder] ). Die Seite würde eine benutzerdefinierte Seitenvorlage verwenden, um Dinge festzulegen, die Schleife zu steuern und die Navigation auf der linken Seite der Seite hinzuzufügen. Aber das alles scheint klunkig.

Meine ideale Lösung wäre, einen benutzerdefinierten Post-Typ ( Stack genannt ) zu erstellen, mit dem der Endbenutzer die Seiten per Drag-Drop positionieren kann und der CPT sich um das Layout und die Navigation kümmert.

Das Problem mit meiner idealen Lösung sind Einstellungen. Mit WordPress können Sie eine Seite für die Standard-Homepage der Site auswählen. Aber es ist an einen Post-Typ einer Seite gebunden, und ich bin mir nicht sicher, wo ich mich anmelden muss, um das zu ändern, damit Benutzer auch einen Stack als Standard-Homepage auswählen können.

Also, wo hake ich mich ein, um ein CPT zum Dropdown der verfügbaren Seiten für die Standard-Homepage hinzuzufügen?

Solutions Collecting From Web of "Wie verwenden Sie einen CPT als Standard-Homepage?"

Danke an @toscho für die nützliche Antwort, aber es fühlte sich ein bisschen hackisch an, also stocherte ich ein wenig herum und fand heraus, dass ich stattdessen einen Filter hinzufügen konnte:

 function wpa18013_add_pages_to_dropdown( $pages, $r ){ if('page_on_front' == $r['name']){ $args = array( 'post_type' => 'stack' ); $stacks = get_posts($args); $pages = array_merge($pages, $stacks); } return $pages; } add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 ); 

Aktualisieren

Nachdem ich den obigen Code hinzugefügt hatte, war ich zwar in der Lage, einen benutzerdefinierten Post-Typ als Startseite zu verwenden, aber WordPress würde die Permalinks redirect, weil es kein Post-Typ “Seite” war. Also würde http://localhost/test zu http://localhost/test/stacks/home-stack redirect, was nicht das war, was ich wollte.

Durch das Hinzufügen dieser Aktion wurde das jedoch behoben und mein benutzerdefinierter Beitragstyp wird zusammen mit Seiten für die Startseite abgefragt:

 function enable_front_page_stacks( $query ){ if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id']) $query->query_vars['post_type'] = array( 'page', 'stack' ); } add_action( 'pre_get_posts', 'enable_front_page_stacks' ); 

Vielleicht so? Raffinierte Version meiner früheren Lösung .

 add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 ); /** * Adds CPTs to the list of available pages for a static front page. * * @param string $select Existing select list. * @return string */ function add_cpt_to_front_page_dropdown( $select ) { if ( FALSE === strpos( $select, '', $options . '', $select ); } 

Warum erstellen Sie nicht einfach eine front-page.php Template-Datei, die entweder eine normale Abfrage / Loop verwendet oder (wenn eine benutzerdefinierte Theme-Option zum Anzeigen des CPT auf der Startseite eingestellt ist), eine benutzerdefinierte Abfrage / Loop basierend darauf ausgibt der CPT?

Das Problem besteht darin, dass Sie eine separate Theme-Option erstellen müssen, um die Ausgabe auf der Vorderseite zu steuern, während Sie gleichzeitig die Benutzer auffordern, die Startseite auf die statische Seite zu setzen.

Um die Dinge einfacher zu machen, könnten Sie Ihre Theme-Option in die Einstellungen-Lesen einbinden, indem Sie die Optionsgruppe “Reading” in Ihrem Aufruf von register_setting über die Einstellungs-API verwenden, sodass sie mit den vorhandenen Optionen auf der Vorderseite angezeigt wird.

Ich denke, dass sich etwas geändert haben könnte, seit EAMann 2011 sein Update geschrieben hat und die wpa18013_add_pages_to_dropdown () function, die er liefert, nicht mehr funktioniert. Wie in einem Kommentar von Dameer erwähnt, triggers diese function derzeit (Dezember 2013) den Fehler “Fehlendes Argument 2 für wpa18013_add_pages_to_dropdown ()” aus.

Die Lösung bestand für mich jedenfalls darin, die function ohne diesen zweiten Parameter oder die Überprüfung ihres Inhalts neu zu schreiben. Der vollständige Codeblock wird dann zu:

 function add_unbox_tabs_to_dropdown( $pages ){ $args = array( 'post_type' => 'unbox_tabs' ); $items = get_posts($args); $pages = array_merge($pages, $items); return $pages; } add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' ); function enable_front_page_unbox_tabs( $query ){ if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id']) $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' ); } add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' ); 

Beachten Sie, dass der benutzerdefinierte Post-Typ, den ich hinzufüge, im obigen Beispiel “unbox_tabs” statt “stack” ist.

Ich verwende diese Technik , um eine Vorlage aus einem Plugin zu integrieren. Also, @ ChipBennett’s Lösung trifft nicht zu.

Um die CPTs ( 'hierarchical' => 'false' ) aus dem Plugin in der Liste der statischen Seiten hinzuzufügen, habe ich @ EAManns Lösung wie folgt geändert:

 add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' ); add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' ); function wpse_18013_modify_front_pages_dropdown() { // Filtering /wp-includes/post-templates.php#L780 add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' ); } function wpse_18013_add_cpt_to_pages_on_front( $r ) { $args = array( 'post_type' => 'stack' ); $stacks = get_posts( $args ); $r = array_merge( $r, $stacks ); return $r; } function wpse_18013_enable_front_page_stacks( $query ) { if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] ) $query->query_vars['post_type'] = array( 'page', 'stack' ); } 

corereferenz v3.4.2:
geringfügiger Unterschied der Zeilennummern in 3.5 RC3, aber der Code bleibt gleich

 /** * wp-admin/options-reading.php#L96 * Happens inside a 
  • */ wp_dropdown_pages( array( 'name' => 'page_on_front' , 'echo' => 0 , 'show_option_none' => __( '— Select —' ) , 'option_none_value' => '0' , 'selected' => get_option( 'page_on_front' ) ) ) /** * wp-includes/post-template.php#L768 */ function wp_dropdown_pages($args = '') { $defaults = array( /* defaults array */ ); $r = wp_parse_args( $args, $defaults ); extract( $r, EXTR_SKIP ); $pages = get_pages( $r );