wake-up-neo.net

Benutzerdefinierte Beitragstypen, Seitenvorlagen und Paginierung. Warum erhalte ich einen 404-Fehler?

Ich habe heute Stunden mit einem verrückten Problem verbracht, das ich beim Anzeigen eines benutzerdefinierten Beitragstyps hatte. Alles war wunderschön dargestellt, außer dass die Paginierung einfach nicht richtig funktionieren würde.

Ich habe ein Seitenvorlagen-Setup, um eine "Seite mit Beiträgen" (siehe Codex: Seite mit Beiträgen ) für einen benutzerdefinierten Beitragstyp ("Nachrichten") anzuzeigen.

Wenn ich auf "Ältere Beiträge" klicke, wird immer wieder eine 404-Fehlermeldung angezeigt. Ich habe bemerkt, dass viele andere Leute dieses Problem haben oder hatten.

Warum passiert dies? Hier ist meine Abfrage & Loop-Code:

<?php 
    // Enable Pagination
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    // The Args
    $args= array(
        'post_type' => 'news',
        'paged' => $paged,
        );

    // The Query
    query_posts($args); 

    // The Loop
    while ( have_posts() ) : the_post(); ?>
// ...
2
timshutes

Ich habe dieses Problem buchstäblich Sekunden vor dem Posten der Frage herausgefunden und dachte, ich würde die Antwort hier posten. Ich habe bemerkt, dass es nicht viele konsolidierte Hilfen für dieses Problem gibt.

Dies hilft Ihnen, wenn Ihre Links "Ältere Beiträge" oder "Neuere Beiträge" beim Versuch, benutzerdefinierte Beiträge auf einer Seitenvorlage anzuzeigen, einen 404-Fehler verursachen.

Hier sind die Schritte, um das 404-Problem zu lösen (in den meisten Fällen), wenn Sie es haben. Überprüfen Sie nacheinander, ob das Problem behoben ist.

Schritt 1: Flush deine Permalinks

Gehe zu settings => permalinks. Standard auswählen. Sparen. Prüfung. Wählen Sie Ihre Präferenz. Sparen. Nochmal testen.

Schritt 2: Überprüfen Sie Ihre Abfrage.

Wenn das Problem durch Löschen der Permalinks nicht behoben werden kann, überprüfen Sie Ihre Abfrage noch einmal. Verwenden Sie den Codex (siehe: Seiten> Seite der Beiträge ). Sie müssen die Variable $ paged definieren und in Ihren Abfrageoptionen verwenden.

Schritt 3: Stellen Sie sicher, dass Ihre posts_per_page nicht mit der Standardeinstellung in Konflikt steht.

Es gibt einige Leute, die dies als Fehler im WordPress-Kern diskutieren. Unabhängig davon, ob dies der Fall ist oder nicht, kann die Option posts_per_page => x Probleme mit der Paginierung verursachen, wenn x kleiner als die Standardoption ist.

Eine Hack-ish-Lösung für dieses Problem besteht darin, die Standardeinstellung auf 1 zu setzen (Einstellungen> Lesen> "Blogs zeigen höchstens _ Seiten").

HINWEIS: Zu diesem Zeitpunkt hatte ich NOCH immer das Problem. Es war Schritt 4, der es endgültig für mich behoben hat.

Schritt 4: Stellen Sie sicher, dass Ihre Seite Slug! = Ihr post_type.

In meinem Fall hatte ich post_type => 'news'. Und die Seite, die ich benutzte, war www.mysite.com/news. Dies verursachte den Konflikt, der letztendlich die Paginierung vermasselte. Um das Problem zu beheben, habe ich meinen post_type in 'news-articles' geändert und die Permalinks erneut gelöscht. Das Problem ging weg.

Hoffentlich hilft Ihnen das, wenn Sie das gleiche Problem haben. Ich habe das Gefühl, dass viele Leute in diese Falle geraten - es ist einfach und nicht sehr intuitiv herauszufinden. (Zumindest war es nicht für mich).

5
timshutes

Zu Schritt 3: Hier finden Sie eine Erklärung, warum dies passiert: "Die Paginierung wird berechnet, bevor Sie zu der Vorlagendatei gelangen, in der query_posts ausgeführt wird. Die korrekte Methode zum bedingten Ändern von posts_per_page besteht darin, den Hook pre_get_posts zum Ändern der Hauptabfrage zu verwenden." https://wordpress.stackexchange.com/a/42063/17177 Ich habe eine Implementierung "pre_get_posts" gefunden, die für mich funktioniert http://uncommoncontent.com/2012/01/28/add-custom- post-types-to-the-loop :

if ( ! function_exists( 'ucc_add_cpts_to_pre_get_posts' ) ) {
    function ucc_add_cpts_to_pre_get_posts( $query ) {
        if ( $query->is_main_query() && ! is_post_type_archive() && ! is_singular() && ! is_404() ) {
        $my_post_type = get_query_var( 'post_type' );
            if ( empty( $my_post_type ) ) {
                $args = array(
                    'exclude_from_search' => false,
                    'public' => true,
                    '_builtin' => false
                );
                $output = 'names';
                $operator = 'and';
                $post_types = get_post_types( $args, $output, $operator );

                // Or uncomment and edit to explicitly state which post types you want.
                // $post_types = array( 'event', 'location' );
                // Add 'link' and/or 'page' to array() if you want these included.
                // array( 'post', 'link', 'page' ), etc.
                $post_types = array_merge( $post_types, array( 'post' ) );
                $query->set('post_type', $post_types );
            }
        }
    } 
}

add_action( 'pre_get_posts', 'ucc_add_cpts_to_pre_get_posts' );
4
Dmitry Misharov

Ich habe nach stundenlanger Recherche eine einfache Lösung gefunden :)

Ich habe alles schön auf den Blog gestellt für alle, die auf dieses Problem stoßen sollten :)

http://www.jqui.net/wordpress/wp-post-type-pagination/

Hoffe, dass jemand etwas Freude daran hat :)

0
Val