私が使用しているコードは この例の から順応していて、私のローカルホストでうまくテストされています。 (/%postname%/)とデフォルトのwpパーマリンク(?p = 123)でのみ動作します。問題は、404ページが表示されないことですが、2ページ目または3ページ目、または存在する場合は他のページにも移動できないことです。
これはリスティング(カスタム投稿タイプ)ページ(single-listing.php)で、このようなページがあります。
ページ付けされたアーカイブと単一の投稿のためのクエリ変数は "page"を使用し、 @ pietergoosen /に関するヒントのため this notice 私のローカルphp.iniでmysql.trace_modeをオンにすることで。その後、私はwamppのすべてのサービスを再起動し、localhostのページ付けが機能しているので、これが問題になるとは思わない。
これは私のコードです:
<?php
global $authordata, $post;
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$args = array(
'author' => $authordata->ID,
'post_type' => 'post',
'post__not_in' => array( $post->ID ),
'posts_per_page' => 3,
'paged' => $paged
);
$authors_posts = new WP_Query( $args );
if( $authors_posts->have_posts()) : while( $authors_posts->have_posts()) :
$authors_posts->the_post(); ?>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" ><?php the_title(); ?></a>
<?php the_post_thumbnail( array(80,135));?>
<?php $excerpt = get_the_excerpt(); echo string_limit_words($excerpt,40);?>
<?php endwhile; ?>
<?php if($authors_posts->max_num_pages)
if(function_exists('wp_pagenavi'))
wp_pagenavi(array(
'query' =>$authors_posts
)); ?>
<?php endif; wp_reset_query(); ?>
編集
私は自分の問題を解決するものとして @ pietergoosen answerを選択しましたが、コードがライブサーバーで動作しなくなる理由がわかりませんでした。さて、私はおそらくその情報を利用することは決してないでしょうが、私のコードがなぜライブサーバーではなくlocalhost(wampserverを使用)で動作するのかを知りたいと思います...
あなたがこの質問に対する答えを知っているなら、コメントしてください。ありがとうございます。
私が言ったように、あなたがしているこの全体の設定はかなりパーマリンクでは本来可能ではありません。両方のクエリ(メインクエリとカスタムクエリ)が同じ方法でこれらのパーマリンクを読むので、あなたの設定はおそらくデフォルトのパーマリンク構造で動作します。かなりパーマリンクに切り替えると、単一ページ上の2つのクエリでURLの解釈が異なるため、カスタムクエリにページ番号を付けようとすると、どちらか一方が失敗します。
シングルページは、この方法でページ分割されることを意図したものではなく、特にかなりのパーマリンクを使用しています。私はいくつかのアイデアで行ってきましたが、これを達成するための最良の方法は次のとおりです。
URLからページ番号を読み取ることができる独自のページ付け関数を書くには
単一のページのURLに/2/
を追加するような、ページ番号をURLに追加できる独自の関数を作成します。
単一の投稿を<!--nextpage-->
でページ区切りにしている場合、その投稿もカスタムクエリと共にページ区切りになります。また、パーマリンク構造が/%postname%/
に設定されていない場合、コードは失敗し、wp_die()
を通じてエラーメッセージを表示します。
これは、次/前のページを取得し、そのページ番号をURLに追加するコードです。
function get_single_pagination_link( $pagenum = 1 ) {
global $wp_rewrite;
if( is_singular() && $wp_rewrite->permalink_structure == '/%postname%/') {
$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 );
}else{
wp_die( '<strong>The function get_single_pagination_link() requires that your permalinks are set to /%postname%/</strong>' );
}
}
カスタムクエリをページ分割するときに、この関数を次のように使用して単一ページ内の任意のページへのリンクを取得できます。
get_single_pagination_link( 'pagenumber_of_previous_or_next_page' );
繰り返しになりますが、前述したように、カスタムクエリにページ番号を付けたり、URLからページ番号を読み取ったりすることができるページ付け機能はありません。そのため、独自に作成する必要があります。
これが、カスタムクエリの前後のページへのリンクを作成するという私の考えです。よく見ると、次のページと前のページへのリンクを取得するために、前の宣言済み関数get_single_pagination_link()
を使用した方法がわかります。
function get_next_single_page_link ( $label = null, $max_page = 0 ) {
global $wp_query;
if ( !$max_page ) {
$max_page = $wp_query->max_num_pages;
}
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
if( is_singular() ) {
$next_page = intval($paged) + 1;
if ( null === $label ) {
$label = __( 'Next Page »' );
}
if ( ( $next_page <= $max_page ) ) {
return '<a href="' . get_single_pagination_link( $next_page ) . '">' . $label . '</a>';
}
}
}
function get_previous_single_page_link( $label = null ) {
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
if( is_singular() ) {
$prev_page = intval($paged) - 1;
if ( null === $label ) {
$label = __( '« Previous Page' );
}
if ( ( $prev_page > 0 ) ) {
return '<a href="' . get_single_pagination_link( $prev_page ) . '">' . $label . '</a>';
}
}
}
これで、コード内でこの2つの関数を使用してカスタムクエリをページ分割することができます。どちらの関数も get_next_posts_link()
および get_previous_posts_link()
とまったく同じように機能し、同じものを使用します。正確なパラメータなので、カスタムクエリには$max_page
パラメータを渡す必要があることに留意する必要があります。
これがこれらの関数を使ったカスタムクエリです。
function get_related_author_posts() {
global $authordata, $post;
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$args = array(
'posts_per_page' => 2,
'paged' => $paged
);
$authors_posts = new WP_Query( $args );
$output = '';
if( $authors_posts->have_posts() ) {
$output = '<ul>';
while( $authors_posts->have_posts() ) {
$authors_posts->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a>' . get_the_excerpt() . '</li>';
}
$output .= '</ul>';
$output .= get_previous_single_page_link();
$output .= get_next_single_page_link( null , $authors_posts->max_num_pages );
wp_reset_postdata();
}
return $output;
}