it-swarm.asia

query_posts -> استخدام meta_compare/حيث تكون قيمة التعريف أصغر أو أكبر أو تساوي

أنا أستخدم 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');

3
Joakim

منذ 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 );
11
scribu

من نظرة سريعة على الوثائق meta_value ، يبدو أنها مخصصة للسلاسل ، وبالنسبة للقيم العددية ، هناك meta_value_num.

راجع معلمات Orderby

تحديث

هل بعض الحفر.

يتم تجاهل meta_value_num بالفعل لغرض التصفية. أعتقد أنهم نسوا ببساطة إضافة هذا الجزء. :)

المشكلة هي أن WP_Query يتلقى الرقم بشكل صحيح كـ int (لا يُعتبر تمرير كـ صفيف) ، لكنه يمر شرط 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 WordPress بتقييم meta_values الخاص بك كأرقام بدلاً من السلاسل.

0
EAMann