web-dev-qa-db-ja.com

メタ値でソートする方法

メタ値で並べ替えるにはどうすればよいですか。メタ値では "price"(float)があります。

私はこの質問をします、しかし常に得ます

申し訳ありませんが、条件に一致する投稿はありませんでした。

$posts = query_posts( $query_string . '&orderby=meta_value_num&meta_key=Notes&meta_value_num=price&order=ASC');

編集:

meta_value value:
"a:6:{s:5:"width";s:3:"580";s:6:"**price**";s:3:"99"".

出来ますか?

1
user319854

あなたのメタ値は直列化された配列です。

あなたがそれを求めているのは、キー'Notes'と値'price'を持つメタを持つすべての投稿です。あなたのメタ値は'price'ではありません

a:6:{s:5:"width";s:3:"580";s:6:"price";s:3:"99"

あなたが価格で注文するためにあなたがする必要がある最初の事は有用なキー/値構造を使い始めることです。私はあなたが投稿メタを保存するためにこのようなものを使っていると思います:

update_post_meta( $post_id, 'foobar', array( 'width' => 580, 'price' => 99 ), true );

あなたの必要性があなたがこのようなことをする必要があることを示しているとき:

update_post_meta( $post_id, 'width', 580, true );
update_post_meta( $post_id, 'price', 99, true );

メタ値をその形式で保存したら、meta_queryを使用します。

global $query_string;
parse_str( $query_string, $my_query );
$my_query['meta_query'] = array(
    array(
         'key' => 'price',
         'value' => 0,
         'type' => 'SIGNED',
         'compare' => '>=',
    )
);
$my_query['orderby'] = 'meta_value_num';
$my_query['order'] = 'ASC';
query_posts( $my_query );

メタクエリーはWordPress 3.1で新しく追加されたので、これを行うには少なくともそのバージョンを使用する必要があります。

あなたが問題にぶつかったかどうか私に知らせて!

5
John P Bloch

たぶんこの解決策はあなたを助けることができる、私はこのようにフィルタを作成したので私はすべてのリクエストでmeta_keyとmeta_valueでソート投稿を制御する必要がありました:

/**
* Filter for every the loop request
* 
* @param mixed $request
*/
function request( $request ) {
    $option = $_REQUEST['mysortoption'] ? $_REQUEST['mysortoption'] : 'default';

    switch ( strtolower($option) ) {
        case 'most-viewed':
            $request['meta_key'] = 'most-viewed';
            $request['orderby'] = "meta_value";
            break;
        case 'hot':
            $request['orderby'] = 'comment_count';
            break;
        default:
            break;
    }

    return $request;
}
add_filter('request', 'request');

さて、このソリューションは大きな要件の一部ですが、ここで行っていることはすべてのリクエストを傍受することです。前に追加した特別なソートオプションがあることを確認し、対応するソートをmetaで適用します。

これがお役に立てば幸いです。

1
Mario