WordPress loop

WordPressの肝はポストされた記事やデータをループで取り出すところです。この動作をWordPress loopという言い方をしているようです。Wordpressの基本的な使い方の中核になるかと思います。

基本的なWordpress loop

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <div><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
    <div><?php the_time('Y年n月j日'); ?></div>
    <div><?php the_content(); ?></div>
    <div><?php the_category(', '); ?></div>
<?php endwhile; else: ?>
    <div>記事がありません。</div>
<?php endif; ?>

カスタム投稿タイプ

loopは全記事を出力するだけではなくて、パラメータでいろいろ制御できます。カスタム投稿タイプのみを表示する場合は、query_posts()という関数にpost_typeを加えます。

<?php query_posts('post_type=[カスタム投稿タイプ]'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <div><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
    <div><?php the_time('Y年n月j日'); ?></div>
    <div><?php the_content(); ?></div>
    <div><?php the_category(', '); ?></div>
<?php endwhile; else: ?>
    <div>記事がありません。</div>
<?php endif; ?>

記事に投稿された画像(サムネイル)を表示させる

記事内にメディアで投稿された画像のみを抽出します。

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php
    $id = get_the_ID();
    $images = get_children("post_parent=$id&amp;post_type=attachment&amp;post_mime_type=image");
    if ($images) {
        $keys = array_keys($images);
        $lastkeys = array_pop($keys);
        $num = $lastkeys;
        $thumbnail = wp_get_attachment_image_src($num,'medium');
        print '<img src="' . $thumbnail[0] . '" width="' . $thumbnail[1] . '" height="' . $thumbnail[2] . '" alt="' . $post->post_title . '">' . "n";
    } else {
        print "画像がない場合の処理";
    }
?>
<?php endwhile; else: ?>
    <div>記事がありません。</div>
<?php endif; ?>

phpだけでかくやつ

https://codex.wordpress.org/The_Loop

<?php 
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post(); 
        //
        // Post Content here
        $title = get_the_title();
        echo $title;
    } // end while
} // end if
?>

やたらと細かい条件でループさせるとき

やたらと細かい条件でループさせたいときは、get_posts()を使うのが断然楽な気がしてます。

      <?php
       $args = array(
        'posts_per_page'   => 5,
        'offset'           => 0,
        'category'         => '',
        // none|ID|author|title|date|modified|parent|rand|comment_count|menu_order|meta_value|meta_value_num|post__in
        'orderby'          => 'modified',
        'order'            => 'DESC',
        'include'          => '',
        'exclude'          => '',
        'meta_key'         => '',
        'meta_value'       => '',
        'post_type'        => 'post',
        'post_mime_type'   => '',
        'post_parent'      => '',
        'post_status'      => 'publish',
        'suppress_filters' => true );

        $myposts = get_posts( $args );
      ?>

      <?php foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
      <li>
          <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      </li>
      <?php endforeach; wp_reset_postdata(); ?>

メインループとサブループ

複数の投稿タイプなどを混在させながら表示するときはループを複数回まわす必要があるかもしれません。そういうときはメインループとサブループを使い分ける必要があります。
Wordpressのメインループは文脈によって自動的に何を表示するのかを判断してくれるわけですが、サブループは明示的に何を表示するのか(何を取得するのか)を指し示してあげる必要があります。
WordPressで押さえておきたい!get_posts,WP_Query,query_posts の違いと用例という感じで、サブループにはいくつかのやり方があります。本題からいってしまうとquery_postsは使わない方がいいです。実感として遅いし中身の機能としてもかなり無駄な動きをしてます。メインループに影響を与える(というかメインループの亜種と考えた方がいいかも)というのも考えものです。結果的にはget_postsを使うということでよいのではと思っております。

Last update: 2018.11.16 (金)