Почему «/ page / 2 /» не работает?

11

Наконец-то появилась пагинация для работы с приведенным ниже кодом, но теперь пагинация ссылается на / videos / page / 2 /, которого не существует. Как мне заставить страницу 2 работать?

<?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();
 ?>
Дейв
источник
Я бы не советовал переопределять основной запрос таким образом, вы рассматривали возможность использования pre_get_posts? Тогда вы можете использовать встроенный код разбиения на страницы, а не писать свой собственный, и вы можете упростить до стандартного пост-цикла
Tom J Nowell
Кроме того, WordPress предоставляет стандартную страницу архива для типов записей, поэтому у вас уже должен быть архив записей, /videos/который будет загружаться archive-videos.php, не требующий возни с запросами
Том Дж. Новелл

Ответы:

15

Нашел ответ:

После долгого дня отладки через ядро ​​WordPress мне удалось решить эту проблему.

В основном, вы НЕ МОЖЕТЕ иметь PAGE и CUSTOM POST TYPE с тем же именем. Если вы это сделаете, правила перезаписи постоянных ссылок запутаются и вызовут 404.

Очень простое решение, которое я использую, заключается в следующем: страница со списком пользовательских типов записей вызывается во множественном числе (например, продукты), а фактическое имя типа записей - в единственном числе (например, продукт). Так что они не конфликтуют, и все в порядке.

Сделано! Надеюсь, это сэкономит время людей.

Дейв
источник
6
Я предполагаю, что не просто пользовательский пост, вы не можете иметь пост и страницу с тем же именем.
Rutwick Gangurde
4

Спустя долгое время я нашел решение этой проблемы (спасибо franzblog ).

Если вы используете версию 4.2 или выше, вам необходимо добавить следующие строки в ваш functions.phpфайл:

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

Теперь все работает нормально!

Dneiz
источник
1

Вы не можете иметь страницу и тип почтового отправления с тем же именем

Может быть, дерево лет назад это было невозможно, но теперь вы можете.

Во-первых, добавьте эти строки $argsв ваш тип сообщения:

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

Во-вторых, в functions.phpдобавлении действий:

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

Не забудьте сбросить правила в панели инструментов.

ruorc
источник