Warum funktioniert "/ page / 2 /" nicht?

11

Endlich hat die Paginierung mit dem folgenden Code funktioniert, aber jetzt verlinkt die Paginierung auf / videos / page / 2 /, was nicht existiert. Wie bringe ich Seite 2 zum Laufen?

<?php
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('post_type=videos&showposts=1'.'&paged='.$paged);

while ($wp_query->have_posts()) : $wp_query->the_post();
  //display stuff
endwhile;           

php  wp_pagenavi();
 ?>
Dave
quelle
Ich würde nicht empfehlen, die Hauptabfrage so zu überschreiben. Haben Sie darüber nachgedacht, sie zu verwenden pre_get_posts? Dann können Sie den eingebauten Paginierungscode verwenden, anstatt Ihren eigenen zu schreiben, und Sie können bis zu einer Standard-Post-Schleife vereinfachen
Tom J Nowell
Außerdem bietet WordPress eine Standardarchivseite für Beitragstypen, sodass Sie bereits ein Beitragsarchiv haben sollten /videos/, das geladen werden kann archive-videos.php, ohne dass Sie mit Abfragen herumspielen müssen
Tom J Nowell

Antworten:

15

Die Antwort gefunden:

Nach einem langen Tag beim Debuggen durch den WordPress-Kern gelang es mir, dieses Problem zu lösen.

Grundsätzlich KÖNNEN Sie KEINE SEITE und einen CUSTOM POST TYPE mit demselben Namen haben. Wenn Sie dies tun, werden die Regeln zum Umschreiben von Permalinks verwirrt und lösen einen 404 aus.

Eine sehr einfache Lösung, die ich verwende, ist: Die Seite, auf der die benutzerdefinierten Beitragstypen aufgelistet sind, wird im Plural (z. B. Produkte) aufgerufen, und der tatsächliche Name des Beitragstyps wird im Singular (z. B. Produkt) angegeben. Sie streiten sich also nicht und es ist alles in Ordnung.

Fertig Fertig! Ich hoffe, das spart den Leuten Zeit.

Dave
quelle
6
Ich denke, nicht nur benutzerdefinierte Posts, Sie können auch keinen Post und keine Seite mit demselben Namen haben.
Rutwick Gangurde
4

Nach langer Zeit habe ich eine Lösung für dieses Problem gefunden (danke an franzblog ).

Wenn Sie Version 4.2 oder höher verwenden, müssen Sie der functions.phpDatei die folgenden Zeilen hinzufügen :

add_filter( 'redirect_canonical', 'custom_disable_redirect_canonical' );
function custom_disable_redirect_canonical( $redirect_url ) {
    if ( is_paged() && is_singular() ) $redirect_url = false; 
    return $redirect_url; 
}

Jetzt funktioniert alles gut!

Dneiz
quelle
1

Sie KÖNNEN KEINE SEITE und einen CUSTOM POST TYPE mit demselben Namen haben

Vielleicht Baum vor Jahren war es unmöglich, aber jetzt können Sie.

Fügen Sie diese Zeilen zunächst $argsIhrem Beitragstyp hinzu:

'has_archive' => false,
'rewrite'     => array(
                 'slug'       => 'your slug', // if you need slug
                 'with_front' => false,
                 ),

Zweitens in functions.phpAktion hinzufügen:

add_action('init', 'custom_rewrite_basic');
function custom_rewrite_basic() {
    global $wp_post_types;
    foreach ($wp_post_types as $wp_post_type) {
        if ($wp_post_type->_builtin) continue;
        if (!$wp_post_type->has_archive && isset($wp_post_type->rewrite) && isset($wp_post_type->rewrite['with_front']) && !$wp_post_type->rewrite['with_front']) {
            $slug = (isset($wp_post_type->rewrite['slug']) ? $wp_post_type->rewrite['slug'] : $wp_post_type->name);
            $page = get_page_by_slug($slug);
            if ($page) add_rewrite_rule('^' .$slug .'/page/([0-9]+)/?', 'index.php?page_id=' .$page->ID .'&paged=$matches[1]', 'top');
        }
    }
}

function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
    global $wpdb;

    $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) );

    return ($page ? get_post($page, $output) : NULL);
}

Vergessen Sie nicht, die Regeln im Dashboard zu leeren.

ruorc
quelle