1

次の関数を使用して、WP で一連の投稿をクエリしています。

<?php 
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array( 
    'post_type' => array('post', 'real-estate'), 
    'meta_key' => 'Time          Available', 
    'meta_compare' => '<=', 
    'meta_value' => $thirtydays, 
    'paged' => $paged )); 
?>

この部分は正常に動作しています。これは基本的に私のすべての不動産の投稿をプルしていますが、「利用可能な時間」が 30 日以下の結果のみを返します。

別のカスタム フィールド「価格」のデータを使用して、低いものから高いものへの昇順で投稿を並べ替えるためにも、これが必要です。

標準を追加すると、'orderby' => 'meta_value', 'meta_key' => 'Price'30 日以内に結果が表示されなくなります。

これら2つを組み合わせる方法はありますか?また、クエリを再実行し、価格、ベッドルームなどで並べ替えるボタンを追加することは可能ですか? それとも、これは WP にはあまりにも具体的ですか?

4

2 に答える 2

4

私はこれがあなたが必要とするものを提供すると信じています. これは、新しい引数と 'PostsOrderedByMetaQueryを拡張WP_Queryして受け入れると呼ばれるクラスです。'orderby_meta_key'orderby_order'

class PostsOrderedByMetaQuery extends WP_Query {
  var $posts_ordered_by_meta = true;
  var $orderby_order = 'ASC';
  var $orderby_meta_key;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
    $this->posts_ordered_by_meta = true;
    $this->orderby_meta_key = $args['orderby_meta_key'];
    unset($args['orderby_meta_key']);
    if (!empty($args['orderby_order'])) {
      $this->orderby_order = $args['orderby_order'];
      unset($args['orderby_order']);
    }
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
       AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
    }
    return $join;
  }
  function posts_orderby($orderby,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $orderby = "postmeta_price.meta_value {$this->orderby_order}";
    }
    return $orderby;
  }
}

次のように呼び出します。

$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
  'post_type' => array('post', 'real-estate'),
  'meta_key' => 'Time Available',
  'meta_compare' => '<=',
  'meta_value' => $thirtydays,
  'paged' => $paged,
  'orderby_meta_key' => 'Price',
  'orderby_order'    => 'DESC',
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

PostsOrderedByMetaQueryクラスをテーマのfunctions.phpファイルにコピーするか、作成中.phpのプラグインのファイル内で使用できます。

すぐにテストしたい場合は、コードの自己完結型バージョンを Gist に投稿しました。これをダウンロードして Web サーバーのルートにコピーしtest.php、ユースケースに合わせて変更してから、次のような URL を使用してブラウザからリクエストできます。http://example.com/test.php.

お役に立てれば。

-マイク

PS この回答は、私のような多くの WordPress 愛好家が毎日質問に回答している StackOverflow の姉妹サイトであるWordPress Answers で提供した回答と非常によく似ています。もう少し説明があり、 WordPress Answersを見たいと思うかもしれないので、あなたもその答えを見たいと思うかもしれません. 今後、WordPress に関する質問をそちらにも投稿することを検討していただけないでしょうか?

于 2010-11-06T09:11:25.207 に答える
0

'orderby' => 'meta_value'が必要meta_keyであり、あなたはmeta_keyすでに比較に使用されているため、これを行うことはできないと思います。meta_keyオプションの配列ではなく、単一の値のみを受け入れます。これは間違いなく制限です。解決策が見つからない場合は、リクエストを開くことをお勧めします。

クエリを再実行するボタンに関しては、ページをリロードしてクエリ変数を渡して並べ替えを変更するだけです。残念ながら、まだ質問の最初の部分を解決する必要があります。

アップデート

PHP を使用して、返された配列をいつでも自分で並べ替えることができます。

また、利用可能な時間で何をチェックしているのかわかりませんが、クエリをもう少しカスタマイズするのに役立つフィルタを登録できますadd_filter('posts_where', ...); http://codex.wordpress.org/Function_Reference/query_posts

于 2010-11-06T00:51:02.930 に答える