ループをフィルタリングするためにquery_posts( $args )
を使用しています。私は彼らのmeta_value
"投票"に基づいて投稿をフィルターにかけたいです。
私はquery_posts()
関数を絶対に使用し、私のフィルタを$args
に渡したいと思います。 add_filter('posts_where', 'filter_where');
を使用してからAND
ステートメントをクエリに追加したくありません。
WordPressの与えられた機能を使って、meta_key
、meta_value
、meta_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');
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 );
クイックルックのドキュメントからmeta_value
は文字列と数値のために意図されているように思われますmeta_value_num
があります。
更新
いくつか掘り下げました。
フィルタリングのためにmeta_value_num
は実際には無視されます。私は彼らが単にその部分を追加するのを忘れたと思います。 :)
問題はWP_Query
がint
として正しく数値を受け取ることです(配列として渡すことは関係ありません)が、生成されたmeta_compare
条件を$wpdb->prepare()
を通して渡し、明示的に%s
文字列として値をマークします。その場合、prepare
はそれを強制的に一重引用符で囲みます。
だから結局のところposts_where
をフィルタリングする必要があるようです。手動で条件を生成する代わりに、その特定の文字列の引用符を外さないでください。
$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に指示します。