LoginSignup
fj7839
@fj7839 (Junki Furukawa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Wordpressの投稿オブジェクトの値を用いたソートと並び替え

解決したいこと

Wordpressの投稿オブジェクトの値を用いたソートと並び替えについて質問です。

■扱っているデータ

  • アーティスト情報
    • アーティストに関連するコンサート情報が投稿オブジェクトで紐付けされている。
  • コンサート情報
    • 日付情報(カスタムフィールド名:date)
  • カスタムフィールドはAdvanced custom fieldsを使って登録しております。

発生している問題・エラー

  • 投稿オブジェクトの出力は https://hirashimatakumi.com/blog/7.html
    の方法で成功したが、日付ごとの並び替えと非公開投稿の非表示などの条件の加え方がわからない。

▼紹介されているコード

<?php $acf_post_objects = get_field('post_objects'); if( $acf_post_objects ): ?>
<ul>
<?php foreach( $acf_post_objects as $post): // ループの開始 ?>
<?php setup_postdata($post); // 重要! setup_postdata でポストオブジェクトを呼び出します ?>
  <li>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    <span>カスタムフィールド<?php the_field('field_name'); ?></span>
  </li>
<?php endforeach; // ループの終了 ?>
</ul>
<?php wp_reset_postdata(); // ページの残りの部分は正常に動作するように、ポストオブジェクトをリセットします ?>
<?php endif; ?>

上記に絞り込みや並び替えの条件を加えるには、どのように記述したら良いのでしょうか。

自分では、$argsの部分に条件を書いてみたのですが、
投稿の並びに特に変化がありませんでした。

▼自分で書いてみたコード

<?php 
$acf_post_objects = get_field('relate-concerts');
$args = array(
  'post_status' => 'publish',
  'meta_key' => 'relate-concerts' ...
);
$the_query = new WP_Query( $args ); ?>
<?php if( $acf_post_objects ): ?>

  <?php foreach ($acf_post_objects as $post) : ?>
  <?php setup_postdata($post); ?>

    // ループする内容

  <?php endforeach; ?>

<?php wp_reset_postdata(); ?>
<?php else : ?>

  <p>ループするものがありません。</p>

<?php endif; ?>

PHPに慣れておらず基本的なことがわかっていないかもしれないのですが、
数日調べたり考えても全く進展がなく、質問させていただきました。
どうかよろしくお願いいたします。

0

1Answer

初めまして!

条件を指定して取得した

$the_query

でループを回してないためではないでしょうか?

以下の記事が参考になるかと思います。

0

Comments

  1. @fj7839

    Questioner
    参考記事いただきありがとうございます!

    現在のソースから大きい変更ないように、工夫しまして思い通りのソートができました!
    最後に一つだけどうしてもわからない部分があり…

    以下のソースが現在のソースです。
    // 投稿オブジェクトを取得する
    <?php $acf_post_objects = get_field('relate-concerts'); ?>
    <?php if ($acf_post_objects) : ?>
     // 本日の変数と投稿のカウントを設定する
     <?php
      $today = date('Ymd'); //今日の日付
      $post_count = 1;//投稿数カウント
     ?>
     <ul class="artist-news__list">

     // ループ処理開始
     <?php foreach ($acf_post_objects as $post) : ?>
       <?php setup_postdata($post); ?>

       // 投稿があれば、今日以降の日付を出力
       <?php if(get_field('date',$post_id) >= $today) : ?>

       // 出力した投稿をソートするクエリを設定
       <?php
         $args = array(
           'post_type' => 'concerts',
           'meta_key' => 'date',
           'meta_value' => get_field('date',$post_id),
           'order' => 'ASC',
           'orderby' => 'meta_value_num',
           'meta_value_num' => 3
         );
         $the_query = new WP_Query( $args );

         // 試しに、クエリの配列を出力
         print_r($args);
       ?>

       // クエリを元に投稿を出力する
       <?php if ( $the_query->have_posts() ) : ?>
          // ループする内容
       <?php $post_count++; ?>
         <?php else: ?>
         <?php endif; ?>
       <?php else: ?>
       <?php endif; ?>

     <?php endforeach; ?>

     </ul>
     <?php wp_reset_postdata(); ?>
    <?php endif; ?>

    一人のアーティストのページのみ、日付の順番通りに出力できません。
    他のアーティストのページは日付の順番で問題なく出力されております。

    ということは、テンプレートファイルの記述自体に問題はないし、
    元のコンサートデータにも問題はないと思いました。

    他に問題がありそうな部分が思い当たらないのですが、
    原因または解決策がお分かりになれば、助言いただければ幸いですm(__)m
  2. 回答遅くなりました。

    ほかのアーティストでは正しく出力されているということなので、コード自体はあってそうですね...

    環境が見れないのでともですがほかに考えられることとして、投稿自体の投稿日や更新日が違う・投稿にカテゴリーやタグが付いていないなど投稿自体の問題が考えられるかなと思います。

Your answer might help someone💌