この質問が古い場合でも、Google検索から来た人がより柔軟な回答を必要とする場合に備えて、ここで説明します。
時間の経過とともに、WP_Query
グローバルクエリに依存しないソリューションを開発しました。customを使用すると、WP_Query
のみを使用するinclude
かrequire
、で変数を使用できるように制限されます$custom_query
が、場合によっては(私にとってはほとんどの場合です!)、作成するテンプレートパーツはグローバルクエリで使用されることがあります(アーカイブテンプレートなど)またはカスタムWP_Query
(フロントページのカスタム投稿タイプのクエリなど)。つまり、クエリの種類に関係なく、グローバルにアクセスできるカウンターが必要です。WordPressではこれを利用できませんが、いくつかのフックのおかげでこれを実現する方法を次に示します。
これをfunctions.phpに配置します
/**
* Create a globally accessible counter for all queries
* Even custom new WP_Query!
*/
// Initialize your variables
add_action('init', function(){
global $cqc;
$cqc = -1;
});
// At loop start, always make sure the counter is -1
// This is because WP_Query calls "next_post" for each post,
// even for the first one, which increments by 1
// (meaning the first post is going to be 0 as expected)
add_action('loop_start', function($q){
global $cqc;
$cqc = -1;
}, 100, 1);
// At each iteration of a loop, this hook is called
// We store the current instance's counter in our global variable
add_action('the_post', function($p, $q){
global $cqc;
$cqc = $q->current_post;
}, 100, 2);
// At each end of the query, we clean up by setting the counter to
// the global query's counter. This allows the custom $cqc variable
// to be set correctly in the main page, post or query, even after
// having executed a custom WP_Query.
add_action( 'loop_end', function($q){
global $wp_query, $cqc;
$cqc = $wp_query->current_post;
}, 100, 1);
このソリューションの利点は、カスタムクエリを入力して一般的なループに戻ると、どちらの方法でも正しいカウンターにリセットされることです。クエリ内にいる限り(WordPressの場合は常にそうですが、ほとんど知りませんでした)、カウンターは正しくなります。これは、メインクエリが同じクラスで実行されるためです!
例:
global $cqc;
while(have_posts()): the_post();
echo $cqc; // Will output 0
the_title();
$custom_query = new WP_Query(array('post_type' => 'portfolio'));
while($custom_query->have_posts()): $custom_query->the_post();
echo $cqc; // Will output 0, 1, 2, 34
the_title();
endwhile;
echo $cqc; // Will output 0 again
endwhile;