web-dev-qa-db-ja.com

カスタムフィールドによる投稿のクエリと注文

メタデータ "data_de_lancamento"(開始日)が今日より<=小さいカスタム投稿タイプ "jogos"をクエリしています。そのフィールドはフォーマットdd/mm/yyを使います。

そのクエリから返された投稿は、カスタムフィールド "views"の降順に並べ替える必要があります。

私の現在のコードは:

date_default_timezone_set('Europe/Lisbon');
$data = date("d/m/y");
global $wpdb;

$sql = "SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->postmeta wpostmeta2
WHERE wposts.ID = wpostmeta.post_id
AND wposts.ID = wpostmeta2.post_id
AND wpostmeta.meta_key = 'views'
AND wpostmeta2.meta_key = 'data_de_lancamento'
AND wpostmeta2.meta_value < $data
AND wposts.post_type = 'jogos'
AND wposts.post_status = 'publish'
ORDER BY wpostmeta.meta_value ASC";

$resultado = $wpdb->get_results($sql, OBJECT);
1
Tiago

クエリを実行するときは、WP_Classのmeta_queryパラメータを使用する必要があります。このような何かがあなたを正しい方向に向けるはずです。

$data = date("Y-m-d");
$args = array(
    'post_type' => 'jogos',
    'meta_query' => array(
        array(
            'key' => 'data_de_lancamento',
            'value' => $data,
            'compare' => '<='
        )
    ),
    'meta_key' => 'views',
    'orderby' => 'meta_value',
    'order' => 'DESC'
 );
$query = new WP_Query( $args );

これに対するキャッチは 'dd/mm/yy'の形で日付を比較することはほとんど不可能であるということです。そのため、このコードはうまくいきません。あなたは最初にあなたの日付フォーマットを 'yyyy-mm-dd'に変更する必要があります。これは日付比較を実行するためのはるかに便利な方法です。また、あなたはそれが正しく機能していることを確認するためにオペレータといくつかのテストを行う必要があるかもしれません。

WP 3.1の新機能であるmeta_queryを使用するように指定したことに注意してください。 meta_keymeta_valueはWP 3.1以降では非推奨です。しかし、meta_valueで並べるには、実際にはmeta_keyを順序付けしたい値として指定する必要があります。混乱し、よく文書化されていません。

参考文献:

http://codex.wordpress.org/Function_Reference/WP_Query#Custom_Field_Parameters

http://codex.wordpress.org/Function_Reference/WP_Query#Order_.26_Orderby_Parameters

1
tollmanz