Dlaczego „/ page / 2 /” nie działa?

11

Ostatecznie paginacja działa z poniższym kodem, ale teraz paginacja prowadzi do / videos / page / 2 /, które nie istnieje. Jak sprawić, aby strona 2 działała?

<?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
źródło
Nie polecam zastępowania głównego zapytania w ten sposób, czy zastanawiałeś się nad użyciem pre_get_posts? Następnie możesz użyć wbudowanego kodu stronicowania zamiast pisać własny, i możesz uprościć standardową pętlę pocztową
Tom J Nowell
Ponadto WordPress zapewnia standardową stronę archiwum dla typów postów, więc powinieneś już mieć /videos/załadowane archiwum postów archive-videos.php, które nie wymaga bałagania się w zapytaniach
Tom J Nowell

Odpowiedzi:

15

Znaleziono odpowiedź:

Po długim dniu debugowania przez rdzeń WordPress udało mi się rozwiązać ten problem.

Zasadniczo NIE MOŻESZ mieć STRONY i TYPU NIESTANDARDOWEGO o tej samej nazwie. Jeśli to zrobisz, reguły przepisywania permalink zostaną pomylone i wywołają błąd 404.

Bardzo proste rozwiązanie, z którego korzystam to: Strona z listą niestandardowych typów postów jest wywoływana w liczbie mnogiej (np. Produkty), a rzeczywista nazwa typu posta jest pojedyncza (np. Produkt). Więc nie konfliktują i wszystko jest w porządku.

Gotowe gotowe! Mam nadzieję, że pozwoli to zaoszczędzić ludziom czas.

Dave
źródło
6
Chyba nie tylko niestandardowy post, ale nie możesz mieć posta i strony o tej samej nazwie.
Rutwick Gangurde,
4

Po długim czasie znalazłem rozwiązanie tego problemu (dzięki franzblog ).

Jeśli używasz wersji 4.2 lub nowszej, musisz dodać następujące wiersze do functions.phppliku:

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

Teraz wszystko działa dobrze!

Dneiz
źródło
1

NIE MASZ STRONY i TYPU NIESTANDARDOWEGO o tej samej nazwie

Być może drzewo lata temu było niemożliwe, ale teraz MOŻESZ.

Najpierw dodaj te wiersze do $argsswojego wpisu:

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

Po drugie, w functions.phpakcji dodawania:

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

Nie zapomnij opróżnić reguł na desce rozdzielczej.

ruorc
źródło