私は次の内容で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();
そして:
何が足りないのか私にはわかりませんが、このページのトラブルシューティングガイドからすべての提案を試してみました。 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
私は自分のカスタム投稿タイプとカスタム分類法のための数値ページ付けを表示しようとしている間、私自身のいくつかのプラグインでこれを経験しました。
(デフォルト以外の)独自の方法でデータベースから投稿を取得するために WP_Query
を使用すると、このような関数を使用できなくなることを理解しています期待されています。
これらはデフォルトの投稿クエリに使用されることを意図しています。そのため、これらの関数を意図したとおりに使用したい場合は、クエリを実行する前にデフォルトのクエリを変更する必要があります。フックpre_get_posts
を使ってこれを行うことができます。
ただし、WP_Query
を使用して独自のカスタムクエリを使用したい場合は、数値ページ付けの仕組みをカスタマイズする必要もあります。標準のWordPress機能を使用して同じ最終結果を得ることができますが、数値ページネーションを予想どおりに達成するには、追加の数行のコードが必要です。
WP_Query
を使ったカスタムクエリがあるとしましょう。それは次のようになります。
$query = new WP_Query( $query_args );
これは、ページがロードされたときに実行されるメインのデフォルトクエリとは異なる完全に真新しいクエリがあることを意味します。
これでWordPressは現在のページに対する2つのクエリを認識します:
WP_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 = '« Previous';
$next_text = 'Next »';
$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 = '« Previous';
$next_text = 'Next »';
$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();
以下のコードを試すこともできます。
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');