web-dev-qa-db-ja.com

ページネーションが壊れています

現在作業中のサイトでページネーションに問題があります。クライアントは、自分のカテゴリページで、ページ区切りがpage 1の後で機能しないことに気付きました。 pages 2以降の投稿はWordPressループから表示されなくなりました。これがなぜなのか、またどうすれば修正できるのか疑問に思いました。

カテゴリページのテンプレートページコードは次のとおりです。

<?php
get_header();?>
<div class="section blog">
    <div class="container">
        <div class="row">
            <div class="col-xs-12 col-md-8">
                <div class="share">
                        <span>Share:</span>
                        <a href="#" target="_blank">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-Twitter fa-stack-1x"></i>
                            </span>
                        </a>
                        <a href="#" target="_blank">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-facebook fa-stack-1x"></i>
                            </span>
                        </a>
                        <a href="#" target="_blank">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-linkedin fa-stack-1x"></i>
                            </span>
                        </a>
                </div>
                        <?php

                            $link = $_SERVER[HTTP_Host] . $_SERVER[REQUEST_URI];
                            $link_array = explode('/',$link);
                            $page = $link_array[count($link_array)-2];

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

                            $args = array(
                            'post_type' => 'post',
                            'posts_per_page' => 4,
                            'paged' => $paged,
                            'category_name' => $page
                            );

                            $post_query = new WP_Query( $args );

                            if($post_query->have_posts() ) {
                                while($post_query->have_posts() ) {
                                    $post_query->the_post();
                                    $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
                                    if($image[0] == ''){
                                        $image[0] = get_template_directory_uri() . '/img/placeholder-blog.jpg';
                                    }
                        ?>

                <article>
                    <div class="post">
                        <div class="row">
                            <div class="col-xs-12 col-md-12">
                                <div class="head">  
                                    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                                    <span><?php the_time('F j, Y'); ?> by <?php echo get_the_author(); ?> | <a href="<?php the_permalink(); ?>">Leave a Comment</a></span>
                                </div>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-xs-12 col-md-3 feature-image">
                                <img src="<?php echo $image[0]; ?>" alt="">
                            </div>
                            <div class="col-xs-12 col-md-9">
                                <p><?php $content = get_the_content(); echo mb_strimwidth($content, 0, 400, '...'); ?></p>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-xs-12 col-md-12">
                                <div class="category">
                                    <p>
                                        Filed Under: 
                                        <?php
                                            $category = get_the_category();
                                            foreach($category as $key=>$cat){
                                                echo '<a href="' . get_site_url() . '/blog/' . $cat->slug . '">' . $cat->name . '</a>';
                                                if(($key+1) != count($category)){
                                                    echo ', ';
                                                }
                                            }
                                        ?>
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </article>
                <hr>
                        <?php
                                }
                            }
                        ?>


                        <div class="section nav text-center">
                            <!-- pagination here -->
                            <?php
                                if (function_exists(custom_pagination)) {
                                custom_pagination($custom_query->max_num_pages,"",$paged);
                                }
                            ?>

                        </div>


            </div>
            <div class="col-xs-12 col-md-4">
                <?php include('inc/sidebar.php'); ?>
            </div>
        </div>
    </div>
</div>
<?php 
include('inc/connect.php');
get_footer(); 
?>

ページネーション用のfunctions.phpに組み込まれたカスタム関数もあります。これはおそらく問題としても含まれています。

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

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

  /**
   * This first part of our function is a fallback
   * for custom pagination inside a regular loop that
   * uses the global $paged and global $wp_query variables.
   * 
   * It's good because we can now override default pagination
   * in our theme, and use this function in default quries
   * and custom queries.
   */
  global $paged;
  if (empty($paged)) {
    $paged = 1;
  }
  if ($numpages == '') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) {
        $numpages = 1;
    }
  }

  /** 
   * We construct the pagination arguments to enter into our paginate_links
   * function. 
   */
  $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'       => __('<i class="fa fa-angle-left"></i>'),
    'next_text'       => __('<i class="fa fa-angle-right"></i>'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
  );

  $paginate_links = paginate_links($pagination_args);

  if ($paginate_links) {
    echo "<nav class='custom-pagination'>";
      echo $paginate_links;
    echo "</nav>";
  }

}

これがその実例です。

https://www.staceybarr.com/measure-up/category/podcast/page/2/
https://www.staceybarr.com/measure-up/category/podcast/page/1/

すべてが私には正しいように見えますが残念ながらまだ問題があります、私はこれでいくらかの助けを得ることができるかどうか疑問に思いました?任意の助けは大歓迎です!

1
NeoLobster

最初のページがうまくいくのに2番目のページがうまくいかないのはよくわかりませんが、これは問題へのヒントになるかもしれません。カテゴリテンプレートページの下部には、次のものがあります。

if (function_exists(custom_pagination)) {
    custom_pagination($custom_query->max_num_pages,"",$paged);
}

上記を検討すると、$custom_queryという変数があります。これは、max_numb_pages項目をその中に含めることができるはずのWordPressクエリのように見えます。問題は$custom_queryがページの他のどこにも存在せず、グローバルであるようには見えないということです。あなたのクエリを$post_queryページに反映するようにそれを変更するべきです。更新されたコードは次のようになります。

if (function_exists(custom_pagination)) {
    custom_pagination($post_query->max_num_pages,"",$paged);
}

これにより、ページ数が多くなり、正しいリンクがレンダリングされる可能性があることがページ付けに伝えられます。

さらに、print_r$link$link_array、および$pageの出力を$pagedに出力して、これらすべての変数が正しい応答を出力しているかどうかを確認することをお勧めします。

$link = $_SERVER[HTTP_Host] . $_SERVER[REQUEST_URI];
$link_array = explode('/',$link);
$page = $link_array[count($link_array)-2];

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

$args = array(
'post_type' => 'post',
'posts_per_page' => 4,
'paged' => $paged,
'category_name' => $page
);

print_r($link);
print_r($link_array);
print_r($page);
print_r($paged);
print_r($args);

$argsの場合、WordPressにpaged属性の正しいページを伝えていることを確認してください。

2
Tom