Чому "/ 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, що не потребує возитися із запитами
Tom J Nowell

Відповіді:


15

Знайшов відповідь:

Після довгого налагодження через ядро ​​Wordpress, мені вдалося вирішити цю проблему.

В основному, ви CANT мають сторінку з тим же ім'ям 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; 
}

Зараз все працює нормально!


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

Не забудьте уточнити правила на приладовій панелі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.