web-dev-qa-db-ja.com

ページが要求される前にページ番号urlからリダイレクトされているページ付け

私はスタッフと呼ばれるCPTを持っています。彼らのsingle-staff.phpページで、私は彼らが関連しているアイテムのリストを持っています。これは長すぎるので、今私たちはページネーションが欲しいです。私は問題なくページリンクを作成することができますが、それは/ page /番号なしでURLに自分自身をリダイレクトします。

http://wonkhedev.jynk.net/staff/mark-leach/ メインページ

http://wonkhedev.jynk.net/staff/mark-leach/page/2/ ページ2へのリンクが、 http://wonkhedev.jynk.net/staff/mark)に戻る-leach /

//in functions.php
function get_author_articles($id){

  // backwards finds CPT 'blogs' this staff member is related to.
  $meta_query = array(
    'paged' =>  get_query_var('paged'),
    'post_type' => 'blogs',
    'meta_query' => array(
      array(
        'key' => 'blog_author', // name of custom field, ACF
        'value' => '"' . $id . '"',  // CPT 'staff' id.
        'compare' => 'LIKE'
      )
    ),
    'posts_per_page' => 20,
  );

  $author_articles = query_posts($meta_query);

  return $author_articles;

}

// single-staff.phpで

$blog_articles = get_author_articles($post->ID);
$blog_articles_total = $wp_query->found_posts;    
<?php if ($wp_query->max_num_pages > 1) : ?>
      <nav class="post-nav">
        <ul class="pager">
          <li class="previous"><?php next_posts_link(__('&larr; Older Articles', 'roots')); ?></li>
          <li class="next"><?php previous_posts_link(__('Newer Articles &rarr;', 'roots')); ?></li>
        </ul>
      </nav>
    <?php endif; ?>
1
v3nt

query_postはメインのクエリオブジェクトを壊して現在のカスタムクエリにリセットするので、決して使用しないでください。これはプラグインや関連する投稿やページネーションのようなカスタム機能を壊します。私はそれについて 広範な答え をしましたので、それをチェックするようにしてください、それに @Rarstによる答え も。

また、通常のアーカイブページやページのように静的フロントページがpageではなくpagedを使用するのと同じように、単一ページも注意してください。

まずあなたの関連投稿機能を見てみましょう。

関連記事

最初に、安全で動的になるように関数を正しくコーディングしたいと思います。私は$idがあなたが見ている投稿の単一の投稿IDであるべきであることに同意します。

私たちがする前に、ほんのいくつかの注意事項:

  • コードはコメント化されているので、従うのは簡単でしょう

  • コードにはPHP 5.4 +が必要です

  • 必要に応じてコードを修正する

これがコードです

/**
 * Function to return realted posts_per_page
 *
 * @param (array) $args Compatible argumnets to pass to WP_Query
 * @return $author_articles
 */
function get_author_articles( $args = [] )
{
    // First make sure we are on a single page, else return false
    if ( !is_single() )
        return false;

    // Get the single post object we are on
    $current_post = get_queried_object();

    // Set our $page variable
    $page = get_query_var( 'page' ) ? get_query_var( 'page' ) : 0;

    // backwards finds CPT 'blogs' this staff member is related to.
    $meta_query_defaults = [
        'post__not_in'   => $current_post->ID, // Excludes the current post
        'paged'          => $page,
        'post_type'      => $current_post->post_type,
        'posts_per_page' => 20,
        'meta_query'     => [
            [
                'key'     => 'blog_author', // name of custom field, ACF
                'value'   => $current_post->ID,  // CPT 'staff' id.
                'compare' => 'LIKE'
            ]
        ],
    ];

    // Add our custom arguments to the $meta_query_defaults array
    if (    $args
         && is_array( $args )
    ) {
        $meta_query_defaults = wp_parse_args(  $args, $meta_query_defaults );
    }

    $author_articles = new WP_Query( $meta_query_defaults );

    return $author_articles;
}

WP_Queryに渡される関数のデフォルトのパラメータを調整および修正するために、WP_Queryに有効なパラメータの配列を最初のパラメータとして渡すことができます。

ページ付け

私が述べたように、単一の投稿ページと静的フロントページはpageではなくpagedを使用します。ページネーションを機能させるには、完全なカスタム機能が必要です。私はしばらく前にそのような機能をしました、あなたは ここ をチェックすることができます。

これはわずかに修正されたバージョンです

function get_single_pagination_link( $pagenum = 1 ) {
    global $wp_rewrite;

    if(    !is_single() 
        || !$wp_rewrite->permalink_structure 
    )
        return false;

    $pagenum = (int) $pagenum;

    $post_id = get_queried_object_id();
    $request = get_permalink( $post_id );

    if ( $pagenum > 1 )
        $request = trailingslashit( $request ) . user_trailingslashit( $pagenum );
   return esc_url( $request );
}

function get_next_single_page_link ( $label = null, $max_page = 0 ) {
    global $wp_query;

    if( !is_single() ) 
        return false;

    if ( !$max_page ) {
        $max_page = $wp_query->max_num_pages;
    }

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

    $next_page = intval($paged) + 1;

    if ( null === $label ) {
        $label = __( 'Next Page &raquo;' );
    }

    if ( ( $next_page <= $max_page ) ) {
        return '<a href="' . get_single_pagination_link( $next_page ) . '">' . $label . '</a>';
    } else {
        return false;
    }
}

function get_previous_single_page_link( $label = null ) {

    if( !is_single() ) 
        return false; 

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

    $prev_page = intval($paged) - 1;

    if ( null === $label ) {
        $label = __( '&laquo; Previous Page' );
    }

    if ( ( $prev_page > 0 ) ) {
        return '<a href="' . get_single_pagination_link( $prev_page ) . '">' . $label . '</a>';
    } else {
        return false;
    }
}

基本的な使い方

あなたは今、以下のようにそれを使うことができます

$q = get_author_articles();
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
    $q->the_post();

        // Add your markup, etc.

    }
    echo get_previous_single_page_link();
    echo get_next_single_page_link( null , $q->max_num_pages );

    wp_reset_postdata();
}    
3
Pieter Goosen