web-dev-qa-db-ja.com

制作サイトで作業していない作家のページ編集による関連記事

私が使用しているコードは この例の から順応していて、私のローカルホストでうまくテストされています。 (/%postname%/)とデフォルトのwpパーマリンク(?p = 123)でのみ動作します。問題は、404ページが表示されないことですが、2ページ目または3ページ目、または存在する場合は他のページにも移動できないことです。

これはリスティング(カスタム投稿タイプ)ページ(single-listing.php)で、このようなページがあります。

  1. 現在のシングルリスティングコンテンツ。
  2. コメント
  3. このコード(そのリストの作者によるすべての記事をリストするため)。
  4. 関連リスト

ページ付けされたアーカイブと単一の投稿のためのクエリ変数は "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を使用)で動作するのかを知りたいと思います...

あなたがこの質問に対する答えを知っているなら、コメントしてください。ありがとうございます。

3
Alex

私が言ったように、あなたがしているこの全体の設定はかなりパーマリンクでは本来可能ではありません。両方のクエリ(メインクエリとカスタムクエリ)が同じ方法でこれらのパーマリンクを読むので、あなたの設定はおそらくデフォルトのパーマリンク構造で動作します。かなりパーマリンクに切り替えると、単一ページ上の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 &raquo;' );
        }

        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 = __( '&laquo; 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;

}
2
Pieter Goosen