Ich möchte ein benutzerdefiniertes Archiv für Beitragstypen als Startseite einer Website verwenden
http://the_site.com/
ist ein benutzerdefiniertes Posttyp-Archiv, das gemäß meiner archive-{post-type}.php
-Datei angezeigt wird.
Idealerweise möchte ich die Abfrage mit is_front_page()
in meiner functions.php
-Datei ändern. Ich habe Folgendes versucht, mit einer Seite namens "Home" als Startseite:
add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
global $wp_the_query;
if(is_front_page()&&$wp_the_query===$query){
$query->set('post_type','album');
$query->set('posts_per_page',-1);
}
return $query;
}
die Startseite gibt jedoch den Inhalt von "Home" zurück und scheint die benutzerdefinierte Abfrage zu ignorieren.
Was mache ich falsch? Gibt es im Allgemeinen einen besseren Weg, dies zu tun?
Nachdem Sie eine statische Seite als Startseite festgelegt haben, können Sie diese zu Ihrem functions.php
hinzufügen, und Sie können loslegen. Dadurch wird auch die Vorlage archive-POSTTYPE.php
korrekt aufgerufen.
add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
//Ensure this filter isn't applied to the admin area
if(is_admin()) {
return;
}
if($wp_query->get('page_id') == get_option('page_on_front')):
$wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
$wp_query->set('page_id', ''); //Empty
//Set properties that describe the page to reflect that
//we aren't really displaying a static page
$wp_query->is_page = 0;
$wp_query->is_singular = 0;
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
endif;
}
Benennen Sie Ihr CPT-Archiv in home.php um
Verwenden Sie dann pre_get_posts, um die Homepage-Abfrage so zu ändern, dass nur die CPT-Anzeige erfolgt
function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
}
}
add_action('pre_get_posts','wpsites_home_page_cpt_filter');
Ersetzen Sie your-cpt durch den Namen Ihres benutzerdefinierten Beitragstyps.
Vielen Dank für die Antwort, ljaas - ich wollte genau dieses Problem lösen. Um die benutzerdefinierte Archivvorlage für Beitragstypen aufzurufen, musste ich die folgenden Bedingungen hinzufügen:
$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;
Dies funktioniert besser, wenn ich sowohl Blogeinträge als auch statische Seiten in Einstellungen> Lesen> Anzeige der Startseite überschreibe:
<?php
/**
* Set custom post type archive as front page.
*
* @since 1.0.0
*/
function ql_set_as_front_page( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( ql_is_front_page( $query ) ) {
$query->set( 'page_id', '' );
$query->is_page = false;
$query->is_singular = false;
$query->set( 'post_type', 'MYCPT' );
$query->is_archive = true;
$query->is_post_type_archive = true;
}
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );
/**
* Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
*
* @since 1.0.0
*
* @param object $query The main WP Query.
*/
function ql_is_front_page( $query ) {
if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
return true;
elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
return true;
else
return false;
}
Ich verwende es in Verbindung mit einer Vorlagenüberschreibung, die die Filter front_page_template
und home_template
verwendet, um eine benutzerdefinierte Vorlage zurückzugeben.
Für mich bricht es die Paginierung: Entweder Sie wählen den Index oder eine statische Seite als Startseite, die Paginierungslinks werden angezeigt, aber wenn Sie auf Seite 2 klicken, erhalte ich:
Ich denke, es braucht einige Regeln zum Umschreiben, um das ausgelagerte Argument abzufangen und es richtig zu übergeben.
Auf jeden Fall sollte eine benutzerdefinierte Vorlagenseite die Lösung mit einigen zusätzlichen Umschreiberegeln sein.