PHPの理解はもちろんですが、wordpressの関数やグローバル変数についても理解が必要です。
wordpressは表示しているページに応じて、$wp_query
というグローバル変数にコンテンツを取得するクエリをセットしてくれます。(これがメインクエリと呼ばれるもので、中身はWP_Query
クラスのインスタンスです)
よくテンプレートの「おまじない」と言われるif (have_posts()) : while (have_posts()) : the_post();
は、このメインクエリからコンテンツを一個ずつ取り出し、$post
に投稿データをセットする関数になります。
もし今回のように、メインクエリとは別のクエリを使って追加のコンテンツを表示したいという場合、いくつか方法はありますが、質問者さんが使用されているWP_Query
クラスで別のクエリ(サブクエリ)を作成するのがおススメです。
ただ今回のケースだと、私が正しく仕様を理解できているとすれば、メインクエリ一つで作れそうです。(wordpressをいじっていたのがもう5年以上前のことなので思い出しながらですがご容赦ください。)
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<!-- 最初の投稿のレイアウト -->
<!-- 1件表示してbreakでループを抜ける -->
<?php break; ?>
<?php endwhile; ?>
<!-- 2件目からループが始まるはず -->
<?php while (have_posts()) : the_post(); ?>
<!-- 2件目以降の投稿のレイアウト -->
<?php endwhile; ?>
<?php endif: ?>
それでももしサブクエリを使いたい場合、質問に記載されたWP_Query
の使い方は間違っています。WP_Query
のインスタンスを使ってループを回す必要があります。
メインクエリとサブクエリで重複コンテンツをなくしたい場合、こちらのリンクの$do_not_duplicate
という変数の扱いが参考になるかと思います。
<?php
// argsの内容は適宜変更してください
$args = array( 'post_type' => 'Products' );
$the_query = new WP_Query($args);
?>
<!-- $the_queryのメソッドでループを作成します -->
<?php if($the_query->have_posts()): >
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<!-- 投稿のレイアウト -->
<?php endwhile; ?>
<!-- ループ後にwp_reset_postdataを実行するのを忘れずに -->
<?php wp_reset_postdata(); ?>
<?php else: ?>
<!-- 投稿が無い場合の処理 -->
<?php endif; ?>