Wie verwende ich ein benutzerdefiniertes Post-Archiv als Startseite?


16

Ich möchte ein benutzerdefiniertes Post-Archiv als Startseite für eine Site verwenden

 http://the_site.com/

wird ein benutzerdefiniertes Posttyp-Archiv entsprechend meiner archive-{post-type}.phpDatei angezeigt .

Idealerweise möchte ich die Abfrage mit is_front_page()in meiner functions.phpDatei ä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?


is_front_page () funktioniert nicht mit pre_get_posts
Brad Dalton

Antworten:


27

Nachdem Sie eine statische Seite als Startseite festgelegt haben, können Sie diese zu Ihrer hinzufügen functions.phpund loslegen. Dadurch wird die archive-POSTTYPE.phpVorlage ebenfalls 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;

}

Diese Funktion muss ganz if(is_admin()) return;am Anfang stehen, sonst versaut sie den Admin-Bereich.
Brasofilo

1
Während dies für mich funktionierte, verschwanden meine primären und sekundären Menüs als Ergebnis.
Super9

Es ist fast richtig. Dieser Code ändert alle wp_queries, also sollte es sein, wenn (is_home ()) statt if ($ wp_query-> get .....)
Leo Caseiro

Ich verwende das gleiche, aber auf meiner benutzerdefinierten Seitenvorlage anstelle der Startseite. Es werden keine Ergebnisse angezeigt (als ob keine benutzerdefinierten Beiträge hinzugefügt wurden). Irgendwelche Gedanken?
trainoasis

Diese Lösung unterstützt kein Paging. Jede / page / 2-URL zeigt weiterhin die ersten 10 Beiträge an.
rg89

6

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.


2
endlich eine klare, praktikable erklärung!
Jack

1

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;

2
Hallo Eli, willkommen bei WPSE. "Antworten" sollen die ursprüngliche Frage beantworten (Stapelaustausch-Sites sind keine Diskussionsforen mit Threads ). Das wäre viel besser für einen Kommentar .
Johannes Pille

Danke für die Klarstellung Johannes. Das habe ich mir gedacht, obwohl ich nicht herausfinden konnte, wie ich die Antwort kommentieren soll, da es keine Funktion zum Hinzufügen von Kommentaren gibt. Ist dies eine zeitkritische Funktion oder bin ich blind?
Eli

0

Dies funktioniert besser, wenn ich sowohl Blogeinträge als auch statische Seiten in Einstellungen> Lesen> Anzeigen 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, indem ich die Filter verwende front_page_templateund home_templateeine benutzerdefinierte Vorlage zurückgebe.


0

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:

  • Bei Indexseite (Standard): Die 404-Seite
  • Im Fall einer statischen Seite: Die gleichen Ergebnisse wie auf Seite 1: Das Argument "paged" wird dann so interpretiert, dass die Seitentyp-Paginierung und nicht die Seitentyp-Listen-Paginierung angezeigt wird.

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.