web-dev-qa-db-ja.com

query_posts - > meta_compare /の使用。ここで、メタ値はより小さいか大きいか等しい。

ループをフィルタリングするためにquery_posts( $args )を使用しています。私は彼らのmeta_value "投票"に基づいて投稿をフィルターにかけたいです。

私はquery_posts()関数を絶対に使用し、私のフィルタを$argsに渡したいと思います。 add_filter('posts_where', 'filter_where');を使用してからANDステートメントをクエリに追加したくありません。

WordPressの与えられた機能を使って、meta_keymeta_valuemeta_compareで投稿をフィルタリングしたいです。

$args = array( 'meta_key'=>'vote', 'meta_compare'=>'>=', 'meta_value'=>5, 'posts_per_page'=>100 ) )

query_posts( $args );

この結果は次のとおりです。

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'vote' AND wp_postmeta.meta_value >= '5' GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 100

その問題は:

wp_postmeta.meta_value >= '5' 

そのはず:

wp_postmeta.meta_value >= 5

それからそれはうまくいきます。

WordPressが引用符を追加する理由がわかりません。

私はWordPressの定義済みパラメータ(<><=>=)を使用していますが、これは引用符で囲む必要がある文字列ではなく数字でのみ機能することは明らかです。

ドキュメントは言う:

カスタムフィールドキーが 'miles'で、カスタムフィールド値がLESS THAN OR EQUAL TO 22の投稿を返します

query_posts('meta_key=miles&meta_compare=<=&meta_value=22');

3
Joakim

WP 3.1以降、 'meta_query'の 'type'引数を使用して、必要な値にメタ値をキャストできます。

$args = array(
  'meta_query'=> array(
    array(
      'key' => 'vote',
      'compare' => '>=',
      'value' => 5,
      'type' => 'numeric',
    )
  )
  'posts_per_page' => 100
) );

query_posts( $args );
11
scribu

クイックルックのドキュメントからmeta_valueは文字列と数値のために意図されているように思われますmeta_value_numがあります。

オーダーパラメータを参照

更新

いくつか掘り下げました。

フィルタリングのためにmeta_value_numは実際には無視されます。私は彼らが単にその部分を追加するのを忘れたと思います。 :)

問題はWP_Queryintとして正しく数値を受け取ることです(配列として渡すことは関係ありません)が、生成されたmeta_compare条件を$wpdb->prepare()を通して渡し、明示的に%s文字列として値をマークします。その場合、prepareはそれを強制的に一重引用符で囲みます。

だから結局のところposts_whereをフィルタリングする必要があるようです。手動で条件を生成する代わりに、その特定の文字列の引用符を外さないでください。

3
Rarst

$argsに渡す前に、query_posts配列を解析して文字列に変換することをお勧めします。 $args配列を作成すると、配列が文字列に戻されるときに、システムは自動的に番号5を文字列「5」に変換します。

だから代わりにこれを使用してください:

query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100');

それでも同じ情報がquery_postsに渡されますが、文字列 "5"ではなく5を渡してください。


更新

Meta_valueが数字ではなく文字列を格納することを発見したので、文字列との比較で大なり小なり比較を行うことは事実上できません。しかし、 もう少し調べた後 私はクエリフラグmeta_value_numにつまずいた。

次のquery_posts呼び出しを実行したとします。

query_posts('meta_key=vote&meta_compare=>=&meta_value=5&posts_per_page=100&orderby=meta_value_num');

それからあなたはあなたが望む行動になるはずです。 meta_value_numは、あなたのmeta_valueを文字列ではなく数字として評価するようにWordPressに指示します。

0
EAMann