私はこれがあなたが必要とするものを提供すると信じています. これは、新しい引数と '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 に関する質問をそちらにも投稿することを検討していただけないでしょうか?