WP query_posts meta_query में तारीखों की तुलना करने का सही तरीका क्या है


32

WP टेम्पलेट में मेरे पास query_posts कॉल है। मोर फील्ड्स प्लगिन के उपयोग के माध्यम से मैं साइट को एक ईवेंट (कस्टम पोस्ट प्रकार) बनाने की क्षमता दे सकता हूं और फिर एक तारीख दर्ज कर सकता हूं जो प्रारूपित है: YYYY / mm / dd।

मुख्य प्रश्न यह है; मुझे मेटा_क्वेरी एरे में वैल्यू ऑप्शन के लिए क्या मान पास करना चाहिए? मैं वर्तमान में "तिथि (" Y / m / dh: i A ") पास करने की कोशिश कर रहा हूं (" उद्धरणों को घटाता हूं), क्योंकि, जैसा कि मैं इसे समझता हूं, कि आज की वर्तमान तिथि को प्रिंट करेगा। मैं तारीख के समय की परवाह नहीं करता ताकि अप्रासंगिक हो। Ulitimatly मैं इस साइट पर विभिन्न स्थानों में आने वाली घटनाओं, पिछली घटनाओं को दिखाने के लिए तुलना विकल्प का उपयोग करने की कोशिश कर रहा हूं। एक अन्य स्थान पर मुझे वास्तव में मूल्य विकल्प को पास करने की आवश्यकता है जो इस महीने में होने वाली घटनाओं के आउटपुट को सीमित करते हुए वर्तमान महीने के पहले और आखिरी दिन को प्रिंट करता है।

<?php 
            query_posts( array( 
              'post_type'  => 'event',        // only query events
              'meta_key'    => 'event_date',  // load up the event_date meta
              'orderby'     => 'meta_value',  // sort by the event_date
              'order'       => 'asc',         // ascending, so earlier events first
              'posts_per_page' => '2',
              'meta_query'  => array(         // restrict posts based on meta values
                  'key'     => 'event_date',  // which meta to query
                  'value'   => date("Y/m/d h:i A"),  // value for comparison
                  'compare' => '>=',          // method of comparison
                  'type'    => 'DATE'         // datatype, we don't want to compare the string values
                ) // end meta_query array
              ) // end array
            ); // close query_posts call
                 ?>

जवाबों:


44

मैं ठीक उसी चीज़ पर काम कर रहा हूं और यह पोस्ट बहुत मददगार थी। मैंने कस्टम फ़ील्ड्स का उपयोग किया और यहां वह कोड है जिसका उपयोग मैंने वर्तमान तिथि से अधिक सभी घटनाओं की एक सूची बनाने के लिए किया था । अतिरिक्त टैक्सोनॉमी आधारित फ़िल्टर पर ध्यान दें।

<?php // Let's get the data we need to loop through below

$events = new WP_Query( 
    array(
        'post_type' => 'event', // Tell WordPress which post type we want
        'orderby' => 'meta_value', // We want to organize the events by date    
        'meta_key' => 'event-start-date', // Grab the "start date" field created via "More Fields" plugin (stored in YYYY-MM-DD format)
        'order' => 'ASC', // ASC is the other option    
        'posts_per_page' => '-1', // Let's show them all.   
        'meta_query' => array( // WordPress has all the results, now, return only the events after today's date
            array(
                'key' => 'event-start-date', // Check the start date field
                'value' => date("Y-m-d"), // Set today's date (note the similar format)
                'compare' => '>=', // Return the ones greater than today's date
                'type' => 'DATE' // Let WordPress know we're working with date
                )
            ),
        'tax_query' => array( // Return only concerts (event-types) and events where "songs-of-ascent" is performing
            array(
                'taxonomy' => 'event-types',
                'field' => 'slug',
                'terms' => 'concert',
                ),
            array(
                'taxonomy' => 'speakers',
                'field' => 'slug',
                'terms' => 'songs-of-ascent',
                )
            )
        )
    );
?>

5
क्यों नहीं 'type' => 'DATE'?
फ्रांसिस्को कॉर्लेस मोरेल

मैं @FranciscoCorralesMorales के संदेह की पुष्टि कर सकता हूं: आपको 'DATE' प्रकार निर्दिष्ट करना होगा, विशेष रूप से क्योंकि दिनांक मेटा फ़ील्ड को संख्या के रूप में सहेजा नहीं गया है लेकिन "Ymd" (कृपया ध्यान दें हाइफ़न) के रूप में। मैंने जोनाथन के उत्तर को संपादित किया है।
मार्को पानिची

अंतर्राष्ट्रीयकरण के लिए, आप date_i18n()php के बजाय वर्डप्रेस फ़ंक्शन का उपयोग करना चाह सकते हैं date()
जेक

7

यह काफी हद तक इस बात पर निर्भर करता है कि पहली बार मेटा मूल्य में आपकी तारीख कैसे संग्रहीत की जाती है। सामान्य तौर पर, MySQL में डेट्स / टाइमस्टैम्प के रूप में तारीखों को स्टोर करना एक अच्छा विचार है।

MySQL टाइमस्टैम्प का प्रारूप है Y-m-d h:i:s

हालांकि, WP के स्वयं के दिनांक का उपयोग करने के लिए हमेशा एक अच्छा विचार है। जैसे, MySQL प्रारूप में वर्तमान दिनांक प्राप्त करने के लिए, उपयोग करें current_time('mysql')

प्रदर्शन के लिए MySQL की तारीख को प्रारूपित करने के लिए, उपयोग करें mysql2date($format, $mysql_date)। इस मामले में सेटिंग्स में कॉन्फ़िगर की गई तारीख को प्रदर्शित करना सबसे अच्छा है, इसलिए उपयोग करें $format = get_option('date_format');

उपयोगकर्ता-चयनित तिथि को संग्रहीत करने के लिए, आपको इसे MySQL तिथि में ट्रांसकोड करना होगा। ऐसा करने के लिए, सबसे आसान - लेकिन सबसे सुरक्षित नहीं है - तरीका है date('Y-m-d h:i:s', $unix_timestamp);$unix_timestampअक्सर के माध्यम से प्राप्त किया जा सकता है strtotime($user_input)

हालाँकि, strtotime()यह अपने आप में पवित्रता की जाँच नहीं करता है, इसलिए यह सबसे अच्छा है कि आप अपने स्वयं के अभिसरण समारोह को लिखें।

महीने की सीमा प्राप्त करने के लिए, यहाँ किसी भी MySQL टाइमस्टैम्प के लिए महीने की सीमाओं का उपयोग करने के लिए एक फ़ंक्शन है:

function get_monthrange($time) {
    $ym = date("Y-m", strtotime($time));
    $start = $ym."-01";
    $ym = explode("-", $ym);
    if ($ym[1] == 12) {
        $ym[0]++; $ym[1] = 1;
    } else {
        $ym[1]++;
    }
    $d = mktime( 0, 0, 0, $ym[1], 1, $ym[0] );
    $d -= 86400;
    $end = date("Y-m-d", $d);
    return array( $start, $end );
}

यदि आप सप्ताह की सीमाओं को प्राप्त करना चाहते हैं, तो WP पहले से ही इसके लिए एक फ़ंक्शन के साथ आता है: get_weekstartend($time);जो कि एक सरणी के रूप में सीमाओं को भी बचाता है।

फिर आप meta_queryदो अलग-अलग तुलना करके अपने तर्क में इनका उपयोग कर सकते हैं ।


क्या आपका मतलब "MySQL टाइमस्टैम्प्स का प्रारूप नहीं है Y-m-d G:i:s"? G:i:s24 घंटे है, h:i:s12 घंटे है।
प्रवेशांक

3

मैं निम्नलिखित के साथ जा रहा घाव। मैंने एक इवेंट-मॉम फील्ड सेट किया और वहां से तुलना की। सहायता के लिए धन्यवाद

<?php 
        $event_query = new WP_Query(
        array( 
          'post_type'   => 'event',        // only query events
          'meta_key'    => 'event-month',  // load up the event_date meta
          'order_by'        => 'event_date',
          'order'       => 'asc',         // ascending, so earlier events first
          'meta_query'  => array(
             array(         // restrict posts based on meta values
              'key'     => 'event-month',  // which meta to query
              'value'   => date("n"),  // value for comparison
              'compare' => '=',          // method of comparison
              'type'    => 'NUMERIC'         // datatype, we don't want to compare the string values
            ) // meta_query is an array of query ites
           ) // end meta_query array
          ) // end array
        ); // close WP_Query constructor call

 ?>
   <?php while($event_query->have_posts()): $event_query->the_post(); //loop for events ?>

1

हाय नीचे मैं अपना समाधान पोस्ट कर रहा हूं। जहाँ मैंने Y-m-d H:iप्रारूप में दिनांक जमा की है (जैसे 2013-07-31 16:45)।

  • घटना प्रारंभ तिथि के अनुसार क्रमबद्ध।
  • आज के बाद समाप्त होने वाली घटना को केवल द्वारा उद्धृत किया जाएगा meta_query

    date_default_timezone_set('Asia/Calcutta');

मैं date()फ़ंक्शन के लिए डिफ़ॉल्ट समय क्षेत्र सेट करता हूं ।

$args = array(
    'posts_per_page'  => 3,
    'orderby'         => 'meta_value',
    'meta_key'    => 'event_start_date_time',
    'order'           => 'ASC',
    'post_type'       => 'events',
    'meta_query' => array(
      array(
        'key' => 'event_end_date_time',
        'value' => date("Y-m-d H:i"),
        'compare' => '>=',
        'type' => 'DATE'
        )
      )
    ); 
query_posts( $args );

if( have_posts() ) : while ( have_posts() ) : the_post();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.