كيفية فرز وظيفة "Query_Posts" عن طريق الحقل المخصص ، مع الحد من المشاركات بواسطة حقل مخصص آخر

StackOverflow https://stackoverflow.com/questions/4111255

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أستفسر عن سلسلة من المنشورات في WP مع الوظيفة التالية:

<?php 
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array( 
    'post_type' => array('post', 'real-estate'), 
    'meta_key' => 'Time          Available', 
    'meta_compare' => '<=', 
    'meta_value' => $thirtydays, 
    'paged' => $paged )); 
?>

هذا الجزء يعمل بشكل جيد. إنها تسحب جميع مشاركاتي العقارية بشكل أساسي ، ولكن فقط النتائج التي تتمتع بـ "وقت متاح" لمدة 30 يومًا أو أقل.

أحتاج إلى ذلك أيضًا لطلب المنشورات بترتيب تصاعدي من منخفض إلى أعلى باستخدام البيانات من حقل مخصص آخر ، "السعر".

كلما أضفت المعيار 'orderby' => 'meta_value', 'meta_key' => 'Price' لم يعد يظهر النتائج في غضون 30 يومًا.

هل هناك أي طريقة يمكنني الجمع بين هذين؟ وهل من الممكن إضافة زر يعيد تشغيل الاستعلام وفرزه حسب السعر وغرف النوم وما إلى ذلك؟ أم أن هذا محدد للغاية بالنسبة لـ WP؟

هل كانت مفيدة؟

المحلول

أعتقد أن هذا سيوفر لك تريدك تحتاج. إنه فصل يسمى PostsOrderedByMetaQuery هذا يمتد WP_Query ويقبل الحجج الجديدة 'orderby_meta_key' و 'orderby_order':

class PostsOrderedByMetaQuery extends WP_Query {
  var $posts_ordered_by_meta = true;
  var $orderby_order = 'ASC';
  var $orderby_meta_key;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
    $this->posts_ordered_by_meta = true;
    $this->orderby_meta_key = $args['orderby_meta_key'];
    unset($args['orderby_meta_key']);
    if (!empty($args['orderby_order'])) {
      $this->orderby_order = $args['orderby_order'];
      unset($args['orderby_order']);
    }
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
       AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
    }
    return $join;
  }
  function posts_orderby($orderby,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $orderby = "postmeta_price.meta_value {$this->orderby_order}";
    }
    return $orderby;
  }
}

سوف تسميها مثل هذا:

$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
  'post_type' => array('post', 'real-estate'),
  'meta_key' => 'Time Available',
  'meta_compare' => '<=',
  'meta_value' => $thirtydays,
  'paged' => $paged,
  'orderby_meta_key' => 'Price',
  'orderby_order'    => 'DESC',
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

يمكنك نسخ PostsOrderedByMetaQuery الفصل إلى موضوعك functions.php ملف ، أو يمكنك استخدامه داخل .php ملف البرنامج المساعد الذي قد تكتبه.

إذا كنت ترغب في اختباره بسرعة ، فقد نشرت نسخة قائمة بذاتها من الكود إلى gist الذي يمكنك تنزيله ونسخه إلى جذر خادم الويب الخاص بك كـ test.php, ، تعديل لحالة الاستخدام الخاصة بك ، ثم طلب من متصفحك باستخدام عنوان URL مثل http://example.com/test.php.

أتمنى أن يساعدك هذا.

-أيك

ملاحظة: هذه الإجابة هي يشبه إلى حد كبير الإجابة التي أعطيتها للتو في إجابات WordPress, ، وهو الموقع الشقيق لـ Stackoverflow حيث يجيب الكثير من عشاق WordPress مثلي على الأسئلة يوميًا. قد ترغب في ذلك انظر هذا الإجابة أيضًا لأنه يحتوي على مزيد من التفسير ولأنك قد ترغب في رؤيته إجابات WordPress. آمل أن تفكر في نشر أسئلة WordPress الخاصة بك هناك أيضا في المستقبل؟

نصائح أخرى

لان 'orderby' => 'meta_value' يستوجب meta_key, ، وخاصتك meta_key قيد الاستخدام بالفعل للمقارنة ، لا أعتقد أنه يمكنك القيام بذلك. meta_key يقبل فقط قيمة واحدة وليس مجموعة من الخيارات. هذا بالتأكيد قيود وأشجعك على فتح طلب إذا لم تجد حلًا.

بقدر الزر لإعادة تشغيل الاستعلام ، يمكنك ببساطة إعادة تحميل الصفحة وتمرير متغير استعلام لتغيير هذا النوع. لسوء الحظ ، لا يزال يتعين عليك حل الجزء الأول من سؤالك.

تحديث

يمكنك دائمًا فرز الصفيف الذي تم إرجاعه بنفسك باستخدام PHP.

أيضًا ، لست متأكدًا مما تقوم بفحصه مع مرور الوقت ، لكن يمكنك تسجيل مرشح قد يساعدك على تخصيص الاستعلام قليلاً add_filter('posts_where', ...); http://codex.wordpress.org/function_reference/query_posts

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top