web-dev-qa-db-fra.com

Comment trier par méta valeur?

Comment puis-je trier par méta valeur? En méta-valeur, j'ai le "prix" (float).

Je fais cette requête, mais toujours obtenir

Désolé, aucun article ne correspond à vos critères.

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

Modifier:

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

C'est possible?

1
user319854

Votre méta valeur est un tableau sérialisé.

Ce que vous lui demandez d’obtenir pour vous, ce sont toutes les publications avec une méta avec la clé 'Notes' et la valeur 'price'. Votre méta valeur n'est pas 'price', cependant, c'est

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

La première chose à faire pour commander par prix est de commencer à utiliser une structure clé/valeur utile. Je suppose que vous utilisez quelque chose comme ceci pour stocker le post-méta:

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

quand vos besoins indiqueraient que vous devez faire quelque chose comme ceci:

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

Une fois que vous avez enregistré vos méta-valeurs dans ce format, vous souhaiterez utiliser un 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 );

Les méta-requêtes sont nouvelles dans WordPress 3.1, vous devez donc utiliser au moins cette version pour ce faire.

Faites-moi savoir si vous rencontrez des problèmes!

5
John P Bloch

Peut-être que cette solution peut vous aider. Je devais contrôler les posts, triés par meta_key et meta_value sur chaque requête. J'ai donc créé un filtre de cette façon:

/**
* 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');

Ok, cette solution fait partie d’une exigence importante, mais ce que nous faisons ici consiste simplement à intercepter chaque demande, à vérifier s’il existe une option de tri spéciale que j’ai ajoutée auparavant et à appliquer le tri correspondant par méta.

J'espère que cela vous aide.

1
Mario