どのように並べ替え'query_posts"機能によりカスタム項目を関連付けを制限による別のカスタムフィールド

StackOverflow https://stackoverflow.com/questions/4111255

  •  29-09-2019
  •  | 
  •  

質問

私タシリーズのポス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日間とします。

ができますこれらを組み合わせ。とすることはできるボタンを再度のクエリではありながらも、ベッドルームなどが有ります。こちらは日本もに特異的なWP?

役に立ちましたか?

解決

うまいます。このクラスと呼ばれ 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 ファイルのプラグインできます。

したい場合は試験られなかったのでうれしいですん セバーコード る要旨をダウンロードでき、コピーをwebサーバのルートとして test.php, 変更のご利用の場合、その請求からブラウザを使用URLのように http://example.com/test.php.

武器agiは、dexで下がらないboxerぐ.

-マイク

P.S.この答えは 非常に類似した応答った上でWordPressの回答, は、姉妹サイトのStackOverflowは多数のWordPressの愛好家ような疑問に答えます。するために この答えにも では足りな説明とか見たい WordPressの回答.んかを検討することになるだろう投稿"WordPressの問題 あり ものですか。

他のヒント

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

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

アップデート

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top