web-dev-qa-db-ja.com

Wp_query:並び替え PHP 変数

これが私の問題です:

私の記事では、私はカスタム投稿タイプ "展覧会"と他のすべてのニュースの投稿を使用します。それらを1つのクエリで表示しています['post_type' = array( 'exhibitions'、 'posts')]。

投稿のorderbyパラメータは、公開日にする必要があります。展覧会の場合は、カスタムメタ値にする必要があります。 (プロジェクトの終了日)こうすると、投稿は次の順序で表示されます。

  1. 展示会1(公開日:2.1。2013、終了日:4.4。2013)
  2. 投稿1(公開日:2013年13月13日)
  3. 展示会2(発行日:1.4。2012、終了日:1.3。2013)
  4. 投稿2(公開日:2013年2月28日)

日付(投稿)と終了日のメタ値(展示会)からPHP変数を定義して、それからソートしますか?

私はPHP変数(展覧会の終了日メタ値、投稿の公開日)を定義し、それによってwp_queryをソートするというアイデアを思いつきました。

私は正しい方向に進んでいるのでしょうか。もしそうなら、どのようにwp_queryに変数を組み込むには?私はいくつかの関連記事/質問を見つけました、しかしそれらのどれもこれまで私を助けませんでした。

オーダーバイフィルター?

Orderbyフィルタは、進むべき道としても聞こえます: Orderby filter @ Wordpress.orgフォーラム

ありがとうございます。

///

Johanessのソリューションは、私が目指していたものとほとんど同じです。これが私のわずかに修正された関数です:

function save_sort_meta( $post_id ) {
$prev_val = get_post_meta( $post_id, 'sort_date', true );
/* set value only if not set yet (i.e. if this is a new post and not an update ) */
if ( 'exhibitions' === $_POST['post_type'] ) {
        $my_meta = get_post_meta( $post_id, '_my_meta', true );
    $datum_end_hidden = $my_meta['datum-end-hidden'];
    update_post_meta( $post_id, 'sort_date', $datum_end_hidden);
} else {
    /* using time() assuming "end_date" is a unix timestamp, adjust if not */
    update_post_meta( $post_id, 'sort_date', time());
}
}
add_action( 'save_post', 'save_sort_meta' );

そして、これが私の質問です:

$args = array(
'showposts' => '22',
'post_type' => array('post','exhibitions'),
'post_status' => 'publish',
'meta_key' => 'sort_date',
'order' => 'DESC',
'orderby' => 'meta_value_num'
);

何らかの理由で、 "post"投稿はwp_queryの最後に残ります(ただし、カスタム値 "sort_date"をエコーすると、正しく表示され、展覧会よりも大きくなりますが、 "bellow"のままにする必要があります)。

それは私が投稿の更新をチェックすることの削除と何らかの関係があるか?更新時にも値を変更したいので、それを行いました。

編集:上記のコードは動作します!

さて、私は問題がどこにあったか見つけました - それはかなり恥ずかしいです。 :) "展覧会"投稿タイプの "終了日"メタ値はjQuery UI Datepickerによって提供されました - 日付をミリ秒単位で保存します。

私がしなければならなかったのは$ datum_end_hiddenを1000で割ることだけでした:)

どうもありがとうございました!

1
Petr Cibulka

私の知る限りでは、取り出された投稿に対して追加の繰り返しを行わないと、2つの異なるパラメータでクエリをソートすることはできません。

これは理想的には避けるべきなので、別のアプローチを提案しましょう。

追加のメタ値 "sort_date"などを組み込んではどうでしょうか。次に、保存ルーチンで、展覧会の終了日または公開日のいずれかを "sort_date"として保存します。

保存中:

function save_sort_meta( $post_id ) {
    $prev_val = get_post_meta( $post_id, 'sort_date', true );
    /* set value only if not set yet (i.e. if this is a new post and not an update ) */
    if ( empty($prev_val) ) {
        if ( 'exhibitions' === $_POST['post_type'] ) {
            update_post_meta( $post_id, 'sort_date', $_POST['end_date'] );
        } else {
            /* using time() assuming "end_date" is a unix timestamp, adjust if not */
            update_post_meta( $post_id, 'sort_date', time() );
        }
    }
}
add_action( 'save_post', 'save_sort_meta' );

クエリ:

$args = array(
    'post_status' => 'publish',
    'post_type' = array( 'exhibitions', 'posts' ),
    'meta_key' => 'sort_date',
    'order' => 'DESC',
    'orderby' => 'meta_value_num'
);
$exhibitions_and_posts = new WP_Query( $args );

余談ですが、投稿タイプには単数形の名前を付けることをお勧めします。

1
Johannes Pille

同じページに2つの投稿タイプを表示することを意味しているかどうか、どちらも異なる並べ替え順序を使用しているのかどうかわかりません。

Archive-exhibitions.phpのように自身のアーカイブに展示を表示している場合は、そのページのクエリを設定して、定義したメタ値でソートすることができます。

$args = array(
    'post_status' => 'publish',
    'post_type' => 'exhibition',
    'meta_key' => 'project_end_date',
    'orderby' => 'meta_value',
    'order' => 'DESC'
);

$my_own_query = new WP_Query($args);

当然、プロジェクトの終了日メタ値のキー名を反映するようにproject_end_dateを変更します。変数の保存方法に応じて、orderbymeta_value_numに変更します。 meta_valueはおそらく大丈夫です。

ループの場合は、次のものを使用する必要があります。

<?php if ($my_own_query->have_posts()) : while ($my_own_query->have_posts()) : $my_own_query->the_post(); ?>

さて、そのアーカイブ( http://example.com/exhibitions/ )をロードしても通常のWP_Queryは無視され、ループにはmy_own_queryが使われます。

0
Marc Dingena