wake-up-neo.com

Wie lege ich einen benutzerdefinierten Beitragstyp als statische Startseite fest?

Ich schreibe mein benutzerdefiniertes Design von Grund auf neu und habe den benutzerdefinierten Beitragstyp 'my_frontpage' und möchte einen seiner Beiträge als Startseite deklarieren. Ich möchte dies über den Admin tun, füge also einfach mein cpt in das Front Page Auswahlfeld in Aussehen >> Anpassen >> Statische Front Page ein.

Dieses Thema wurde im Internet schon einige Male diskutiert. Ich konnte jedoch keine Anleitung finden, die alle Schritte zum Erreichen dieses Ziels ausführlich erklärt.

Bisher habe ich verstanden, dass ich eine Art Hook verwenden muss, um die Auswahl der verfügbaren Titelseiten mit Beiträgen aus meinem cpt zu erweitern. Aber welchen Haken soll man benutzen? Ich würde nicht einmal wissen, ob ich eine Aktion oder einen Filterhaken verwenden muss? Könnte mich bitte jemand durch dieses Thema führen, wenn es sich um Laien handelt?

Das nächste Ergebnis, das ich finden konnte, war Diese Frage . Ich kann jedoch noch nicht ganz nachvollziehen, was dort passiert ...

3
Bunjip

Ich hatte Zeit, mir Ihr Problem und die Seite options-reading.php anzusehen, die als Vorlage für das Rendern der Seite mit den Leseeinstellungen im Backend dient.

Es gibt leider keine Filter zum Filtern oder Hinzufügen von benutzerdefinierten Beiträgen als Haftnotizen in einer auswählbaren Dropdown-Liste. Es gibt zwei versteckte Filter, die wir verwenden können

IMHO, ich denke get_pages hier ist eine bessere Option. Auf diese Weise lassen wir wp_dropdown_pages() das gesamte Markup erledigen. Wir müssen hier jedoch aufpassen, wenn wir den get_pages-Filter verwenden

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

Sie müssen entscheiden, ob Seiten mit benutzerdefinierten Beitragstypen angezeigt werden sollen oder nur die benutzerdefinierten Beitragstypen

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 );

In der Dropdown-Liste sollten jetzt Ihre benutzerdefinierten Posts angezeigt werden. Beachten Sie, dass dieser Code auch die Dropdown-Liste für die Blog-Seite beeinflusst.

Um dies zu vermeiden, können Sie einen statischen Leistungsindikator verwenden, um zu ermitteln, wie oft der Filter ausgeführt wurde, und ihn dann kurz vor dem Anwenden des Filters auf das Dropdown-Menü der Blog-Seite freizugeben. Der Filter wird insgesamt dreimal ausgeführt, da get_pages() dreimal ausgeführt wird:

  • überprüfen Sie zunächst, ob tatsächlich Seiten als statische Startseite festgelegt werden sollen.

  • der zweite Lauf befindet sich in wp_dropdown_pages(), das vom statischen Dropdown-Menü der Startseite verwendet wird

  • der letzte Lauf befindet sich in wp_dropdown_pages(), das von der Dropdown-Liste der Blogseiten verwendet wird

Auf dieser Grundlage 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 Front-End und die Front-Page besuchen, werden Sie feststellen, dass die Weiterleitung zur einzelnen Post-Page erfolgt. Das liegt daran, dass die Hauptabfrage auf einer statischen Startseite standardmäßig so eingestellt ist, dass sie den Beitragstyp page abfragt. Dies führt dazu, dass ein 404 zurückgegeben wird und redirect_canonical() dann auf die einzelne Beitragsseite umleitet. Dies ist einfach zu lösen. Wir müssen lediglich die Hauptabfrage auf der statischen Startseite 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' );
    }
});

Ihre statische Startseite wird nun korrekt angezeigt.

Sie müssen lediglich eine Vorlage festlegen. Sie können einfach einen front-page.php erstellen, der von WordPress automatisch verwendet wird

2
Pieter Goosen

Nun, es gibt auch eine zusätzliche Möglichkeit, die Verwendung einer Seitenvorlage zu vermeiden und Wordpress das Laden der Startseite zu überlassen, indem Sie die richtige Vorlage für den Beitragstyp verwenden. So vermeiden Sie das Duplizieren von Code, wenn Sie möchten, dass die Titelseite für den einzelnen Beitrag selbst gleich aussieht:

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;  
}
0
cruzquer

Während Pieter das Problem ohne Zweifel elegant und umfassend löste, entschied ich mich schließlich für eine andere Lösung, die ich auch hier mitteilen möchte. Vielleicht stehen einige Leute in der kommenden Zeit vor ähnlichen Problemen.

Für die Definition des benutzerdefinierten Beitragstyps, 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, hielt ich es für hilfreich, meine Frage auch in ihrem Support-Kanal zu stellen.

Es war ein sehr hilfsbereiter Typ aus dem Pods-Entwicklungsteam, der mich in die Richtung wies, mit der ich schließlich ging. Anstatt einen benutzerdefinierten Beitragstyp für die Erstellung einer sehr individuellen statischen Startseite zu definieren, empfahl er, einer Standardseite, die zur Startseite werden sollte, benutzerdefinierte Felder hinzuzufügen. Das habe ich getan, um mein Ziel zu erreichen, und das empfehle ich auch anderen Benutzern.

Aus Sicht der Datenmodellierung gibt es keinen Grund, einen vollständigen Datentyp oder eine Klasse zu definieren, wenn Sie ihn nur auf ein einzelnes Element anwenden möchten - in meinem Fall auf eine einzelne Titelseite. Ich habe ein anderes Plugin namens Erweiterte benutzerdefinierte Felder verwendet, da dies erweiterte Datentypen für Ihre benutzerdefinierten Felder ermöglicht, als Wordpress standardmäßig anbietet. Sie können Ihre benutzerdefinierten Felder auch über functions.php hinzufügen. Hoffentlich hilft das.

0
Bunjip