Wordpress Custom Post type Category View with Pagination

У меня есть настраиваемый тип сообщения "charters", и на моей странице category.php у меня есть цикл, в котором отображаются сообщения "Charter" для текущего идентификатора категории. У меня есть настраиваемая настройка разбивки на страницы, отображающая номера страниц, когда я нажимаю ссылку на страницу 2, она переходит на URL / page / 2, который отображает ошибку 404. Я не могу понять, почему я получаю 404. Если я настраиваю свои сообщения на страницу, разбивка на страницы обновляется и отображает правильное количество страниц, но ссылки не отображаются.

Код Category.php:

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

  $product_args = array(
      'post_type' => 'charters',
      'posts_per_page' => 10, //the same as the parse_query filter in our functions.php file
      'paged' => $paged,
      'page' => $paged,
      'cat' => $cat
    );

  $product_query = new WP_Query( $product_args ); ?>

  <?php if ( $product_query->have_posts() ) : ?>

    <!-- the loop -->
    <?php while ( $product_query->have_posts() ) : $product_query->the_post(); ?>
      <article class = "loop">
        <h3><?php the_title(); ?></h3>
        <div class = "content">
          <?php the_excerpt(); ?>
        </div>
      </article>
    <?php endwhile; ?>
    <!-- end of the loop -->


    <!-- pagination here -->
    <?php
       if (function_exists( 'custom_pagination' )) :
          custom_pagination( $product_query->max_num_pages,"",$paged );
      endif;
   ?>


  <?php wp_reset_postdata(); ?>

  <?php else:  ?>
    <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
  <?php endif; ?>

Код Functions.php:

function prefix_change_cpt_archive_per_page( $query ) {

    //* for cpt or any post type main archive
    if ( $query->is_main_query() && ! is_admin() && is_post_type_archive( 'product' ) ) {
        $query->set( 'posts_per_page', '10' );
    }

}
add_action( 'pre_get_posts', 'prefix_change_cpt_archive_per_page' );


function prefix_change_category_cpt_posts_per_page( $query ) {

    if ( $query->is_main_query() && ! is_admin() && is_category( 'test-category' ) ) {
        $query->set( 'post_type', array( 'product' ) );
        $query->set( 'posts_per_page', '2' );
    }

}
add_action( 'pre_get_posts', 'prefix_change_category_cpt_posts_per_page' );



function custom_pagination( $numpages = '', $pagerange = '', $paged='' ) {

  if (empty($pagerange)) {
    $pagerange = 2;
  }


  global $paged;
  if (empty($paged)) {
    $paged = 1;
  }
  if ($numpages == '') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if (!$numpages) {
        $numpages = 1;
    }
  }


  $pagination_args = array(
    'base'            => get_pagenum_link(1) . '%_%',
    'format'          => 'page/%#%',
    'total'           => $numpages,
    'current'         => $paged,
    'show_all'        => False,
    'end_size'        => 1,
    'mid_size'        => $pagerange,
    'prev_next'       => True,
    'prev_text'       => __('&laquo;'),
    'next_text'       => __('&raquo;'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
  );

  $paginate_links = paginate_links($pagination_args);

  if ($paginate_links) {
    echo "<nav class='custom-pagination'>";
      echo "<span class='page-numbers page-num'>Page " . $paged . " of " . $numpages . "</span> ";
      echo $paginate_links;
    echo "</nav>";
  }

В моих настройках постоянных ссылок установлено значение «Имя сообщения». Я чувствую, что это как-то связано с перезаписью, но я не могу понять, как заставить URL-адреса страниц работать правильно. Примеры моих категорий следующие:

/ категория / длинный пляж /
/ категория / сан-диего /

Привет, вы можете добавить несколько вариантов в $args, что-то вроде этого $args = array( 'post_type' => 'charters', 'cat'=> $cat, 'posts_per_page' => 10, 'offset' => 0, );, чтобы получить первые 10 сообщений. Вы можете настроить offset, чтобы получить следующий набор сообщений.

Long Kim 05.10.2018 07:14

Можете ли вы указать мне правильное направление, как отрегулировать смещение?

oompahlumpa 05.10.2018 07:26

Вы можете добавить смещение в свою кнопку загрузки, что-то вроде этого <button class = "loadmore" data-offset=10></button> Затем вы можете вызвать ajax с этим смещением в файл php, в этом файле php вы можете использовать это смещение и сгенерировать новый WP_Query, вы можете вернуть результат этот запрос и добавьте его в конец своего 10-го поста.

Long Kim 05.10.2018 07:56

Блин, это звучит как отличный метод, но, к сожалению, я не знаю, как это сделать. Потребуется некоторая документация.

oompahlumpa 05.10.2018 17:04

Я внес изменения в свой исходный код / ​​вопрос, см. Выше.

oompahlumpa 05.10.2018 19:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
1 671
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы используете пагинацию по умолчанию, используйте приведенный ниже код.

<?php
$current_page = get_queried_object();
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
'post_type' => 'charters',
'paged'         => $paged,
'cat'=> $cat);

$my_query = new WP_Query( $args );

if ( $my_query->have_posts() ) {
    while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <p><a href = "<?php the_permalink() ?>" rel = "bookmark" title = "Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p><?php
    endwhile;
}
next_posts_link( 'Older Entries', $my_query->max_num_pages );
previous_posts_link( 'Newer Entries' );
wp_reset_query();
?>

Добавьте ниже код в свой function.php

function posts_on_categorypage( $query ) {
    if ( $query->is_category()) {
        $query->set( 'posts_per_page', '10' );
    }
}
add_action( 'pre_get_posts', 'posts_on_categorypage' );

Когда я нажимаю ссылку «старый Entires», я получаю ошибку 404, когда пытаюсь перейти к / page / 2 /. Есть идеи, что с этим происходит?

oompahlumpa 05.10.2018 07:25

не могли бы вы сообщить мне, используете ли вы какой-либо плагин для разбивки на страницы?

raju_odi 05.10.2018 07:27

Это все еще дает мне страницу 404. Я не использую плагины.

oompahlumpa 05.10.2018 16:58

Я внес изменения в свой исходный код / ​​вопрос, см. Выше.

oompahlumpa 05.10.2018 19:10

вы должны попробовать это:

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
    'post_type' => 'charters',
    'cat'=> $cat,
    'post_per_page'=> 6, 
    'paged' => $paged 
    );

    $my_query = new WP_Query( $args );

    if ( $my_query->have_posts() ) {
        while ($my_query->have_posts()) : $my_query->the_post(); ?>
            <p><a href = "<?php the_permalink() ?>" rel = "bookmark" title = "Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p><?php
        endwhile;
    }

    wp_reset_query();

?>

<?php echo pnavigation( $query ); ?>

тогда вам нужно добавить следующий код в function.php:

function pnavigation( $wp_query ) {

  $big = 999999999; // need an unlikely integer
  $pages = paginate_links( array(
  'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
  'format' => '?paged=%#%',
  'current' => max( 1, get_query_var('paged') ),
  'total' => $wp_query->max_num_pages,
  'prev_next' => false,
  'type'  => 'array',
  'prev_next'   => TRUE,
  'prev_text'    => '&larr;',
  'next_text'    => '&rarr;',
  ) );
  if ( is_array( $pages ) ) {
    $paged = ( get_query_var('paged') == 0 ) ? 1 : get_query_var('paged');
    echo '<ul class = "pagination pagination-lg">';
    foreach ( $pages as $page ) {
      echo "<li>$page</li>";
    }
    echo '</ul>';
  }
}

вам нужно просто заменить url (client-testimonials) на ваш url

function pagination_rewrite() {
  add_rewrite_rule('client-testimonials/page/?([0-9]{1,})/?$', 'index.php?pagename=client-testimonials&paged=$matches[1]', 'top');
}
add_action('init', 'pagination_rewrite');

Я не верю, что это решение подойдет мне, так как название моей категории будет отличаться для каждой категории .. примеры категорий: / category / san-diego /, / category / long-beach /

oompahlumpa 05.10.2018 17:05

Я внес изменения в свой исходный код / ​​вопрос, см. Выше.

oompahlumpa 05.10.2018 19:10
Ответ принят как подходящий

В моем коде было несколько ошибок. Это то, что я получаю за копирование / вставку кода, а не за его выполнение построчно. Спасибо всем, кто помог, но я заставил это работать, изменив:

Плохой код:

function prefix_change_category_cpt_posts_per_page( $query ) {

    if ( $query->is_main_query() && ! is_admin() && is_category( 'test-category' ) ) {
        $query->set( 'post_type', array( 'product' ) );
        $query->set( 'posts_per_page', '2' );
    }

}

Хороший код:

function prefix_change_category_cpt_posts_per_page( $query ) {

    if ( $query->is_main_query() && ! is_admin() && is_category( $cat ) ) {
        $query->set( 'post_type', array( 'charters' ) );
        $query->set( 'posts_per_page', '10' );
    }

}

Другие вопросы по теме