it-swarm.com.de

Wie verwende ich ein benutztes Posttyp-Archiv als Startseite?

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?

14
Isaac Lubow

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;

}
26
Ijaas

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.

5
Brad Dalton

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;
1
Eli

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.

0
Elliot

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.

0
nderambure