サポート » 使い方全般 » 固定ページでのカスタムフィールドの値の順番で出力できません。

  • 解決済 goodsun.taichi

    (@goodsuntaichi)


    はじめて投稿いたします。よろしくお願いします
    もし似たような質問が場合はすみません。色々と見てみたのですが解決出来なかったので
    投稿いたしました。

    現在、カスタムフィールドテンプレートを使ってカスタム投稿「イベント情報」のページを設けているのですが、このイベント記事の一覧表示を、記事を投稿した日付順ではなく、カスタムフィールドで作ったイベント開催日順で【カスタムフィールドのkeyはdateとしています】固定ページに表示したいのですが、投稿日順でしか表示されずうまくいかないのです。

    ※出力する日付のカスタムフィールドは【 2014年03月24日(月)】というように記述しています。

    そして固定ページ(event.phpというものを用意)には

    <?php $args = array(
    'posts_per_page' => 5,//表示件数。
    'post_type' => 'events',//カスタム投稿タイプ
    'meta_key' => 'date', //カスタムフィールドのキー。
    'orderby' => 'meta_value',//カスタムフィールドの値順に並び替える
    'order' => 'ASC'
    ); ?>
    <?php $loop = new WP_Query( $args ); ?>
    <?php if($loop -> have_posts()): ?>
    <?php while($loop -> have_posts()): $loop->the_post();?>
    <div class="entry">
    <h3 class="box">"><?php echo get_the_title(); ?></h3>
    <ul class="list-group">
    <li class="list-group-item"><i class="fa fa-calendar"></i>  日程:<?php echo get_post_meta($post->ID , 'date' ,true); ?>
    <li class="list-group-item"><i class="fa fa-clock-o"></i>  時間:<?php echo get_post_meta($post->ID , 'time' ,true); ?>
    <li class="list-group-item"><i class="fa fa-map-marker"></i>  場所:<?php echo get_post_meta($post->ID , 'place' ,true); ?>

    <p class="more">">詳細を見る</p>
    </div>
    <?php endwhile; endif; ?>
    <?php wp_reset_postdata(); ?>

    という風に書いています。

    このような場合どのように記述をすればうまく表示されるのでしょうか?
    教えていただければ幸いです。よろしくお願い致します

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • <?php $loop = new WP_Query( $args ); ?>

    の直後で、

    <?php echo $loop->request; ?>

    すると、何が表示されますか?

    トピック投稿者 goodsun.taichi

    (@goodsuntaichi)

    kjmtshさん
    返信ありがとうございます。
    早速やってみますと下記のように書かれました

    SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = ‘events’ AND (wp_posts.post_status = ‘publish’) AND (wp_postmeta.meta_key = ‘date’ ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value ASC LIMIT 0, 5

    PHPを深く知っていないのでなんともいえませんが
    上記内容でいくとSQLが影響あるのでしょうか
    今後の為にも、ご解説していただけると助かります。
    よろしくお願い致します

    ちゃんと指定したとおりの命令がデータベースに飛んでいます。

    SELECT ...

    は、データベースへの命令で、「wp_posts テーブルと wp_postmeta テーブルを ID をもとにして結合し、post_type が events で、かつ、post_status が publish で、かつ、meta_key が date になっているものを、重複しないようにして、ID ごとに集計して選択し、meta_value で昇順に並べ替えて、0番目から5番目までの投稿 ID データをよこせ」という意味になります。goodsun.taichi さんが、そうなってほしいと思うとおりの命令ですよね?

    SQL_CALC_FOUND_ROWS というのは、これをつけていると、次回に

    SELECT FOUND_ROWS()

    すると、同じ命令を、0番目から5番目という指定なしで実行した場合、合計でいくつデータがあるのかがわかる(実際に取得する必要がないので速い)ので、WordPress では、これを使って、ページング情報を作っています。そして、2ページ目の要求では、LIMIT 6, 10 と書き変えて(6番目から10番目という意味)データを取得します。

    さて、結果ですが、謎です。いやな予感がしますが… 試しに、

    'order' => 'ASC'

    を、

    'order' => 'DESC'

    に変えると変化がありませんか? あるいは、

    if ($loop->have_posts()) {
        while ($loop->have_posts()) {
            $loop->the_post();
            the_ID();
            echo ': ' . get_the_date(); // 同じ日付があるかもしれないので the_date() は使わない
            echo ': ' . get_post_meta($post->ID, 'date', true);
            echo '<br />';
        }
    }

    として比較すると、たまたまカスタムフィールドの並びが投稿日付と同じ順ということはありませんか?

    それでも投稿日付で並んでいる、ということなら、またお知らせください。

    カスタムフィールドには2014年03月24日(月)のように日付型ではなく整形された形で保存されているのですよね?
    その場合日付の形でソートではなく文字列としてソートされるのでその結果想定している値と違う出力がされるのではないでしょうか?

    トピック投稿者 goodsun.taichi

    (@goodsuntaichi)

    kjmtshさん>
    丁寧な解説ありがとうございました!
    凄く勉強になりました!

    その後の結果としまして。
    ‘order’ => ‘DESC’の書き換えだけでも出来なかったのですが、
    loopを記述どおりに書くとうまく出力ができました。

    後ご報告もかねて書き込みをしますと
    その後さらに色々と検証していって分かったことなんですが
    元々質問時に書いていた

    ‘posts_per_page’ => 5,//表示件数。
    ‘post_type’ => ‘events’,//カスタム投稿タイプ
    ‘meta_key’ => ‘date’, //カスタムフィールドのキー。
    ‘orderby’ => ‘meta_value’,//カスタムフィールドの値順に並び替える
    ‘order’ => ‘ASC’

    の順番を変えて

    ‘orderby’ => ‘meta_value’,
    ‘order’ => ‘ASC’,
    ‘post_type’ => ‘events’,
    ‘posts_per_page’ => 5,
    ‘meta_key’ => ‘date’

    と順番を変えたら実は出力がされたのです。
    それがなんでかは僕にはわからないのですが。。。。。。

    ですがkjmtshさんのコードでうまく行きとても助かりました。
    ありがとうございました!

    gogowebさん>
    確かに今回は日付型にしていなかったのですが確かにカスタムフィールドを日付型に
    するという事のほうが管理運営上楽かもしれません。
    今回は無事に解決できましたが時間をみて更にメンテ・ビルドアップする際に
    日付型の方での出力の方もやってみようと思います。

    返信&アドバイスありがとうございました!

    今回はこれで解決済みにさせていただきます。
    本当にありがとうございました!

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「固定ページでのカスタムフィールドの値の順番で出力できません。」には新たに返信することはできません。