أنا أستخدم 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 (<
، >
، <=
، >=
) ومن الواضح أن هذا سيعمل فقط مع الأرقام وليس السلاسل التي يجب أن تكون في علامات اقتباس.
الوثائق تقول:
إرجاع المشاركات التي تحتوي على مفتاح حقل مخصص من "الأميال" بقيمة حقل مخصصة أقل من OR EQUAL TO 22
query_posts('meta_key=miles&meta_compare=<=&meta_value=22');
منذ WP 3.1 ، يمكنك إلقاء قيمة التعريف على أي شيء تريده باستخدام وسيطة "type" في "meta_query":
$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
.
راجع معلمات Orderby
تحديث
هل بعض الحفر.
يتم تجاهل 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
WordPress بتقييم meta_value
s الخاص بك كأرقام بدلاً من السلاسل.