0

カスタム投稿タイプとして学校の時間割があります。各投稿は、クラスが開始する時間と分を 24 時間形式で指定するための 2 つのテキスト フィールドを含む投稿メタ ボックスを含む学校のクラスです。

_start_hour
_start_minute

投稿を時間順に出力しようとしています。

    // the args
$args = array(
    'post_type' => 'my-cpt',
    'meta_key' => '???????',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'posts_per_page' => -1,
);

// The Query
$the_query = new WP_Query( $args );

    while ( $the_query->have_posts() ) : $the_query->the_post();

            // ordered output according to time

           endwhile;

「meta_key」で 2 つのメタ キーを連結する方法はありますか?

私は試し'meta_key' => '_start_hour' && '_start_minute'ましたが、これはクエリを壊します。

4

1 に答える 1

2

残念ながら、wordpress はこの機能をサポートしていません。データベースから取得した後、ループの前に自分でソートする必要があります。

免責事項 これは設計上非常に醜いですが、これはWordpressなので、得たものをいじる必要があります.SQLクエリを自分で書くことにフォールバックすれば、醜さを軽減できます.私の意見では、Wordpressはパフォーマンスに依存します.適切に処理しないとパフォーマンスが低下するため、代わりに SQL クエリを使用することを検討する必要があります。

// Fetch all posts - (1 SQL Query)
$query = new WP_Query(array(
    'post_type' => 'my-cpt',
    'order' => 'ASC',
    'posts_per_page' => -1,
));

foreach ($query->posts as &$post) { // N queries as the number of posts you have - totally inefficient 
 $post->meta = get_post_meta($post->ID);
}

usort($query->posts, function($a, $b) {
   $a_time = strtotime($a->meta['_start_hour'][0] . ':' . $a->meta['_start_minute'][0]);
   $b_time = strtotime($b->meta['_start_hour'][0] . ':' . $b->meta['_start_minute'][0]);
   if ($a_time > $b_time)
      return 1;
   else if ($a_time < $b_time)
      return -1;
   else
      return 0;
}); // Sorting by date

... the_loop ...

これは完全にテストされていないので、時間のポインタを提供するだけであることに注意してください。繰り返しますが、これをリファクタリングして事前にメタキーを結合する必要があります。 PHP...

于 2013-03-30T13:31:23.250 に答える