Проблема разбиения на страницы Wordpress с `new WP_Query ();` при использовании в шаблоне страницы - PullRequest
2 голосов
/ 05 ноября 2019

Сценарий

Я пытаюсь понять, где я ошибся с моей петлей в отношении использования моего крючка для нумерации страниц. Я использую тему Understrap с Understrap-child, и я не вносил правки в готовый хук, который можно найти здесь .

Я использовал этот хукв цикле, указанном ниже, который находится в файле шаблона страницы. Однако крючок для нумерации страниц не выводится? Однако остальная часть цикла работает отлично.

Вот кикер, я использовал точно такую ​​же структуру в моем файле index.php. и это работает совершенно нормально. Что заставляет меня верить, что мне, возможно, нужно объявить что-то, но я не уверен, что это может быть.

Вопрос

Мне интересно, если при использованиишаблон страницы и new WP_Query(); нужно ли мне указывать какие-либо глобальные переменные, чтобы $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; заработал?

Код вопроса

Дляссылка Я включил свой цикл, хотя я уверен, что все в порядке.

<div class="bg-light">
  <div class="container space-top-3 space-bottom-2">
    <div class="row">
      <?php
      $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
       $args = array(
          'post_type' => 'post',
          'orderby' => 'post_date',
          'order' => 'desc',
          'perm' => 'readable',
          'show_post_views' => true,
          'posts_per_page' => 9,
          'paged' => $paged
      );

      $latestArticles = new WP_Query( $args );
      if( $latestArticles->have_posts() ):
         /* Start the Loop */
         while( $latestArticles->have_posts() ) : $latestArticles->the_post();
            get_template_part( 'loop-templates/content-search', get_post_format() );
         endwhile;
      endif;?>
    </div>

    <div class="row mt-3">
      <div class="col-auto">
        <!-- The pagination component (currently not being output. not sure why.) -->
        <?php understrap_pagination(); ?>
      </div>
    </div>

    <?php wp_reset_query(); ?>
    <?php else : ?>
    <!-- do nothing -->
    <?php endif; ?>
  </div>
</div>

Заранее спасибо за помощь.

Редактировать-7/11/19:

Пробная передача $latestArticles->max_num_pages в understrap_pagination(); как таковая understrap_pagination($latestArticles->max_num_pages);. - Все еще не повезло. : |

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Функция разбиения на страницы опирается на $wp_query->max_num_pages (т. Е. Максимальное количество страниц для основного запроса ), поэтому функция не будет работать с пользовательскими запросами:

function understrap_pagination( $args = array(), $class = 'pagination' ) {

    if ( $GLOBALS['wp_query']->max_num_pages <= 1 ) {
        return;
    }

    ...
}

Ихотя ваш подход работает, на самом деле не стоит менять глобальный объект $wp_query, потому что это по сути то же самое, что и использование query_posts(), которое вообще не рекомендуется - вы можете понять, почему это так, проверив документы здесь .

Однако, если вы не хотите редактировать функцию нумерации страниц (или создавать свою собственную), то временным обходным путем, позволяющим получить нумерацию страниц с вашим пользовательским запросом, является временноеизменение - и только - $wp_query->max_num_pages:

$orig_max_num_pages = $wp_query->max_num_pages; // backup

// Change it just for the pagination.
// and $latestArticles is your custom WP_Query instance.
$wp_query->max_num_pages = $latestArticles->max_num_pages;

$paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
understrap_pagination( [
    'current' => $paged,
] );

$wp_query->max_num_pages = $orig_max_num_pages; // restore

Образец шаблона страницы на основе вашего исходного кода .

A Лучшая практика: Копирование / редактирование функции нумерации страниц .

Поскольку вы используете дочернюю тему , а этот Understrap использует locate_template() для загрузкифайл (inc/pagination.php), который определяет pagination функция, вы можете просто скопировать файл в дочернюю тему (your-theme/inc/pagination.php) и отредактировать функцию так, чтобы она работала с пользовательскими запросами WP_Query. или , поскольку функция является подключаемой (т.е. определяется с помощью блока if ( ! function_exists() )), вы можете просто скопировать код в файл functions.php вашей дочерней темы.

  1. Вы можете использовать эту модифицированную функцию (которая хорошо работает для меня) или использовать ее в качестве ссылки для создания своей собственной:

    function understrap_pagination( $args = array(), $class = 'pagination' ) {
    
        $args = wp_parse_args(
            $args,
            array(
                'mid_size'           => 2,
                'prev_next'          => true,
                'prev_text'          => __( '&laquo;', 'understrap' ),
                'next_text'          => __( '&raquo;', 'understrap' ),
                'screen_reader_text' => __( 'Posts navigation', 'understrap' ),
                'type'               => 'array',
                'current'            => max( 1, get_query_var( 'paged' ) ),
                'total'              => $GLOBALS['wp_query']->max_num_pages,
            )
        );
    
        // Nothing to paginate, so let's bail.
        if ( ! $links = paginate_links( $args ) ) {
            return;
        }
    
        ?>
    
        <nav aria-label="<?php echo $args['screen_reader_text']; ?>">
    
            <ul class="pagination">
    
                <?php
                foreach ( $links as $key => $link ) {
                    ?>
                    <li class="page-item <?php echo strpos( $link, 'current' ) ? 'active' : ''; ?>">
                        <?php echo str_replace( 'page-numbers', 'page-link', $link ); ?>
                    </li>
                    <?php
                }
                ?>
    
            </ul>
    
        </nav>
    
        <?php
    }
    
  2. Затем в своем шаблоне вызовите функцию следующим образом:

    $paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );
    understrap_pagination( [
        'current' => $paged,
        'total'   => $latestArticles->max_num_pages,
    ] );
    

Образец шаблона страницы на основе вашего исходного кода .

paged против page

paged и page - это номер текущей страницы , однако:

  • paged используется с запросами / URL-адресами на основе архива, такими как категорияархивы и страницы результатов поиска. На эти запросы page не устанавливается по умолчанию. Также следует отметить, что paged используется с is_paged().

  • page используется с единичными запросами / URL, такими как одиночная публикация и страницастраницы. По этим запросам paged не устанавливается по умолчанию.

И Codex рекомендует следующий подход для получения правильного номера страницы для отдельных запросов / URL:

if ( get_query_var( 'paged' ) ) { $paged = get_query_var( 'paged' ); }
elseif ( get_query_var( 'page' ) ) { $paged = get_query_var( 'page' ); }
else { $paged = 1; }

Или более простая версия: $paged = max( get_query_var( 'paged' ), get_query_var( 'page' ), 1 );

Примечание: эта статья Кодекса относится к статической титульной странице, но эта информация также относится к любым страницам / постам.


И последнее, но не менее важное ... со вторичными WP_Query вызовами (такими как $latestArticles = new WP_Query( $args )), вам просто нужно позвонить wp_reset_postdata() и не нужно звонить wp_reset_query(). :)

0 голосов
/ 07 ноября 2019

Итак, я смог найти этот пост здесь с помощью CSS-хитрости, в которой описывается метод, который обнуляет текущую переменную $wp_query и заменяет его новым экземпляром WP_Query();

Мой цикл теперь работает как положено однако у меня сложилось впечатление, что $wp_query зарезервировано, не так ли? Безопасно ли использовать этот метод?

Мой новый цикл выглядит следующим образом:

<div class="bg-light">
  <div class="container space-top-3 space-bottom-2">
    <div class="row">
      <?php
            $temp = $wp_query; 
            $wp_query = null; 
            $wp_query = new WP_Query(); 

            $args = array(
                'post_type' => 'post',
                'orderby' => 'post_date',
                'order' => 'desc',
                'perm' => 'readable',
                'show_post_views' => true,
                'posts_per_page' => $posts_per_page,
                'paged' => $paged
            ); ?>
      <?php $wp_query->query($args); ?>

      <?php if ( $wp_query->have_posts() ) : ?>
      <?php /* Start the Loop */ ?>
      <?php while ( $wp_query->have_posts() ) : $wp_query->the_post();  ?>
      <?php get_template_part( 'loop-templates/content-search', get_post_format() ); ?>
      <?php endwhile; ?>
    </div>

    <div class="row mt-3">
      <div class="col-auto">
        <!-- The pagination component -->
        <?php understrap_pagination(); ?>
      </div>
    </div>
    <?php else : ?>
    <!-- do nothing -->
    <?php endif; ?>
    <?php $wp_query = null; 
        $wp_query = $temp;  // Reset ?>
  </div>
</div>

Если кто-нибудь знает о лучшем подходе, мне было бы интересно услышать его. Спасибо заранее. -B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...