wordpress WP_Query で添付ファイルを取得する際にアイキャッチ画像を除外

2019年5月26日

WordPress で WP_Query を使ってまとめて添付ファイル画像を取得して表示する際に、アイキャッチ画像を除外する方法についての覚え書きです。

投稿に添付(挿入)された画像やアイキャッチ画像など WordPress でアップロードしたメディアは、内部的には投稿と同じように扱われているので、WP_Query を使ってそれらをまとめて取得することが可能です。

以下は WP_Query を使って取得した画像を表示する際に、アイキャッチ画像を除外する例です。

WP_Query で特定の投稿を除外するには post__not_in パラメータに ID の配列を指定します。

以下の方法はあまり効率が良くないかも知れませんが、全ての投稿を get_posts で $all_posts に取得し、 foreach でそれぞれのアイキャッチ画像の ID を get_post_thumbnail_id() で取得して、post__not_in パラメータに指定しています。

また、タイトルには画像の属する投稿へのリンクを付けています。

<?php 
//全ての投稿を取得
$all_posts = get_posts(array('numberposts' => -1));
$post_thumbnail_ids = array();
foreach($all_posts as $my_post) {
  //アイキャッチ画像の ID を配列に追加
  $post_thumbnail_ids[] = get_post_thumbnail_id($my_post -> ID);
}
$args = array(    //添付メディアファイルを取得
  'post_type' => 'attachment', //投稿タイプ:メディア(添付ファイル)
  'post_status' =>'inherit', //投稿の状態:継承(添付ファイル)
  'post_mime_type' => 'image',//MIME タイプ:画像
  'post__not_in' => $post_thumbnail_ids, //除外する投稿の ID の配列を指定
  'posts_per_page' => 10 //取得件数
);
$image = new WP_Query( $args ); 
?>
<?php if ( $image->have_posts() ) : ?>
<?php while ( $image->have_posts() ) : $image->the_post(); ?>
<section>
<h3>
  <a href="<?php echo esc_url(get_permalink(get_post($image->ID)->post_parent));?>">
    <?php the_title(); ?>
  </a>
</h3>
<?php the_content(); //添付画像(本文)とその「説明」を出力 ?>
<?php the_excerpt(); //「キャプション」を出力 ?>
</section>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata();  ?>  

アイキャッチ画像や添付ファイルの表示方法などに関する詳細は以下をご覧ください。

WordPress アイキャッチ画像や添付画像