web-dev-qa-db-ja.com

ページ付けが機能しない

私は次の内容でmyfile.phpを作成しました:

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

$args = array(
    'post_type' => array('my_custom_post_type'),
    'paged' => $paged,
    'posts_per_page' => 3,
    'ignore_sticky_posts' => 1
);

$wp_query = new WP_Query( $args );
var_dump($wp_query);
if($wp_query->have_posts()) :
    while($wp_query->have_posts()) : $wp_query->the_post();
        // show post
    endwhile;
endif;

next_posts_link('Next posts');

wp_reset_query();
wp_reset_postdata();

そして:

  • それがSettings> Readingで "Static Front Page"に設定されているときは、ページ付けでうまく動作します。 http://example.com/page/2 にアクセスできます
  • settings> Permalinksが "Default Permalinks Structure"に設定されている場合は、 http://example.com/?page_id=1234&paged=2 で動作します。
  • settings> Permalinksが "Custom Structure"に設定されている場合、以下の http://example.com/mypage/page/2 は404.phpを起動します。

何が足りないのか私にはわかりませんが、このページのトラブルシューティングガイドからすべての提案を試してみました。 https://codex.wordpress.org/Pagination - 彼らはそれを示唆しています」パーマリンクが "カスタム構造"に設定されている場合、404 - 見つかりません "がよくある問題の一つですのでWP開発者は何らかのバグや問題を認識していますが、修正方法を述べていません。

私のサーバーはWAMP for Windows 7です(PHP 5.4.3、Apache 2.4.2、mod_rewrite対応、 "myfile.php"が "静的フロントページ"以外のページとして使用されている場合、カスタムリンク構造はページネーションを期待して動作します)。

"カスタムパーマリンク構造"が "投稿名"に設定されている場合の私の.htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>

# END WordPress

http://example.com/mypage/page/2 と入力すると(動作しません):SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'page' AND wp_posts.post_type = 'my_custom_post_type' ORDER BY wp_posts.post_date DESC

http://example.com/?page_id=1234&paged=2 と入力すると(作品):SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'my_custom_post_type' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 2, 2

1
Paul

私は自分のカスタム投稿タイプとカスタム分類法のための数値ページ付けを表示しようとしている間、私自身のいくつかのプラグインでこれを経験しました。

(デフォルト以外の)独自の方法でデータベースから投稿を取得するために WP_Query を使用すると、このような関数を使用できなくなることを理解しています期待されています。

これらはデフォルトの投稿クエリに使用されることを意図しています。そのため、これらの関数を意図したとおりに使用したい場合は、クエリを実行する前にデフォルトのクエリを変更する必要があります。フックpre_get_postsを使ってこれを行うことができます。

ただし、WP_Queryを使用して独自のカスタムクエリを使用したい場合は、数値ページ付けの仕組みをカスタマイズする必要もあります。標準のWordPress機能を使用して同じ最終結果を得ることができますが、数値ページネーションを予想どおりに達成するには、追加の数行のコードが必要です。

WP_Queryを使ったカスタムクエリがあるとしましょう。それは次のようになります。

$query = new WP_Query( $query_args );

これは、ページがロードされたときに実行されるメインのデフォルトクエリとは異なる完全に真新しいクエリがあることを意味します。

これでWordPressは現在のページに対する2つのクエリを認識します:

  1. クエリ#1デフォルトクエリです。
  2. クエリ#2WP_Queryを使用して作成したカスタムクエリです。

あなたがあなたのカスタムクエリであなたの数字のページ付けを機能させたいなら、あなたはリクエストが実行される現在のページを知っている必要があります。

現在のページ番号は実際にはpagedとして参照されます。現在のページ番号は、次のようなコードを使って確認できます。

$current_page = 1;

if ( get_query_var( 'paged' ) ) {
    $current_page = get_query_var( 'paged' );
}

現在のページが決まったら、次のようにカスタムクエリを設定できます。

$query_args = array(
    'post_type'      => 'products',
    'post_status'    => 'publish',
    'posts_per_page' => 10,
    'paged'          => absint( $current_page )
);

$query = new WP_Query( $query_args );

クエリが実行されたら、次に、それがデータベース内で自分の基準に一致する投稿があるかどうかを確認する必要があります。

if ( $query->have_posts() ) {

    while ( $query->have_posts() ) {

        $query->the_post();

        // Post content here...

    }

} else {

    // No posts...

}

数値ページネーションのために今すぐ!この部分には、 paginate_links() というWordPress関数を使用することをお勧めします。

私はbaseの本当にありそうもない整数部分を本当に理解していません、しかしそれは上でリンクされたWordPress Codexページで示されているものです。

  • 現在のページ(paged)を指定する必要があります - もう一度。
  • 投稿の総数を知る必要があります(これは$query変数オブジェクトから取得できます)。
  • この関数には戻り型を指定する必要があります。 (個人的には、配列形式にするのが好きなので、ページ分割をカスタマイズすることができます。

$big = 999999999; // need an unlikely integer

$previous_text = '&laquo; Previous';
$next_text     = 'Next &raquo;';

$pagination = paginate_links( array(
    'base'      => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format'    => '?current_page=%#%',
    'current'   => max( 1, $current_page ),
    'total'     => $query->max_num_pages,
    'type'      => 'array',
    'prev_text' => $previous_text,
    'next_text' => $next_text
) );

このコードは、投稿があることを示す条件内に配置する必要があります。ループの内側ではなく、すぐにループの後に。

数値ページ付けが設定されると、それは出力の準備ができています(または表示される準備ができています)。これはページ付けされたアイテムがarrayフォーマットで返される場所です。

私はそれを条件付きチェックでラップしてから、アイテムをループ処理していく過程で追加の条件付きチェックを実行するのが好きです。

if ( $pagination ) {

    $content .= '<div class="clearfix"></div>' . PHP_EOL;
    $content .= '<nav id="numerical-pagination" class="text-center">' . PHP_EOL;
    $content .= '<ul class="pagination">' . PHP_EOL;

    foreach ( $pagination as $pagination_item ) {

        $class = '';

        if ( stripos( $pagination_item, 'current' ) !== false ) {
            $class = ' class="active"';
        }

        if ( stripos( $pagination_item, 'dots' ) !== false ) {
            $class = ' class="disabled"';
        }

        $content .= '<li' . $class . '>' . $pagination_item . '</li>' . PHP_EOL;

    }

    $content .= '</ul>' . PHP_EOL;
    $content .= '</nav><!-- end #numerical-pagination .text-center -->' . PHP_EOL;
    $content .= '<div class="clearfix"></div>' . PHP_EOL;

    echo $content;

}

注:私はWordPressテーマにブートストラップを使用しています。つまり、最小限の労力で、ページ付けを素晴らしいものにしたい場合です。ブートストラップ を試してください

WP_Queryを使用してカスタム投稿クエリで数値ページ付けを作成しようと考えている人のための、オールインワンコピー/ペーストスターターソリューションです。

$current_page = 1;

if ( get_query_var( 'paged' ) ) {
    $current_page = get_query_var( 'paged' );
}

$query_args = array(
    'post_type'      => 'products',
    'post_status'    => 'publish',
    'posts_per_page' => 10,
    'paged'          => absint( $current_page )
);

$query = new WP_Query( $query_args );

if ( $query->have_posts() ) {

    while ( $query->have_posts() ) {

        $query->the_post();

        // Post content here...

    }

    $big = 999999999; // need an unlikely integer

    $previous_text = '&laquo; Previous';
    $next_text     = 'Next &raquo;';

    $pagination = paginate_links( array(
        'base'      => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format'    => '?current_page=%#%',
        'current'   => max( 1, $current_page ),
        'total'     => $query->max_num_pages,
        'type'      => 'array',
        'prev_text' => $previous_text,
        'next_text' => $next_text
    ) );

    $content = '';

    if ( $pagination ) {

        $content .= '<div class="clearfix"></div>' . PHP_EOL;
        $content .= '<nav id="numerical-pagination" class="text-center">' . PHP_EOL;
        $content .= '<ul class="pagination">' . PHP_EOL;

        foreach ( $pagination as $pagination_item ) {

            $class = '';

            if ( stripos( $pagination_item, 'current' ) !== false ) {
                $class = ' class="active"';
            }

            if ( stripos( $pagination_item, 'dots' ) !== false ) {
                $class = ' class="disabled"';
            }

            $content .= '<li' . $class . '>' . $pagination_item . '</li>' . PHP_EOL;

        }

        $content .= '</ul>' . PHP_EOL;
        $content .= '</nav><!-- end #numerical-pagination .text-center -->' . PHP_EOL;
        $content .= '<div class="clearfix"></div>' . PHP_EOL;

        echo $content;

    }

    wp_reset_postdata();

} else {
    // No posts...
}

wp_reset_query();
1
Michael Ecklund

以下のコードを試すこともできます。

function custom_type_archive_display($query) {

    if (is_post_type_archive('custom_post_type') )
    {
        $query->set('posts_per_page',10);
        return;
    }
}

add_action('pre_get_posts', 'custom_type_archive_display');
0
Jigar Gorakhiya