पहले मेटा कुंजी द्वारा एक सूची को सॉर्ट करने की क्वेरी (यदि यह मौजूद है), और शीर्षक द्वारा आदेशित मेटा कुंजी के बिना शेष पोस्ट दिखाएं


22

मैं एक कस्टम टैक्सोनॉमी टर्म पेज टेम्प्लेट पर काम कर रहा हूं जहां हम चाहते हैं कि वे आइटम जो एक प्रकाशन तिथि (कस्टम दिनांक फ़ील्ड) द्वारा सॉर्ट किए गए शब्द से जुड़े हों - और यदि एक ही दिन में कई आइटम हैं (जैसे YYYY-MM- स्वरूपित डीडी) तब उन लोगों को शीर्षक के आधार पर छाँटना, और अंत में शीर्षक द्वारा छाँटना अगर कस्टम फ़ील्ड नहीं भरा गया है (पुराने आइटम)।

इसलिए, मैंने इसे WP_query के साथ सौ अलग-अलग तरीकों से आज़माया और यह अधिकांश परिणामों को वापस लौटा देता है जैसा कि मैं उन्हें चाहता हूं - लेकिन इस मामले में यह केवल उन आइटमों को वापस कर रहा है जिनमें प्रकाशन_डेट की मेटा_की है। अन्य सभी वस्तुओं को अनदेखा किया जा रहा है और प्रदर्शित नहीं किया जा रहा है। मैंने "या" के संबंध का उपयोग करते हुए मेटा_क्वेरी की कोशिश की और प्रकाशन_डेट की तुलना EXISTS और NOT EXISTS के रूप में की, लेकिन यह मेरे लिए 0 परिणाम लौटाया।

इसके अलावा, साइट अभी भी 3.5.2 चल रही है और वे अपग्रेड नहीं करना चाहते हैं।

यहां मेरी सबसे हाल की क्वेरी है जो मुझे उन पोस्टों को प्राप्त करती है जिनके पास सही क्रम में publish_date कस्टम फ़ील्ड प्रदर्शित है:

$term = get_queried_object(); // find the term of the taxonomy page we are on
$wp_query = new WP_Query( array(
'post_type' => 'resource',
'tax_query' => array(
    array(
        'taxonomy' => 'resource_types',
        'field' => 'slug',
        'terms' => $term->name,
    )), 

'meta_key' => 'publication_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
'posts_per_page' => '10',
));

मैंने wpdb का उपयोग करने और SQL क्वेरी चलाने की भी कोशिश की, लेकिन मुझे वास्तव में यकीन नहीं है कि जो मैं करना चाहता हूं उसे कैसे पूरा किया जाए। अगर कोई मेरी मदद कर सकता है जो भयानक होगा!

अग्रिम में धन्यवाद।


Meta_query के दृष्टिकोण से आश्चर्य नहीं हुआ, लेकिन फिर आप meta_query के बिना meta_query के साथ मेटा मान को निर्धारित नहीं कर सकते।
sanchothefat

मुझे लगता है कि यही समस्या है जो मुझे हो रही है। मैं अंत में एक मेटा क्वेरी काम कर मिला: 'meta_query' => array( 'relation' => 'OR', array( //check to see if date has been filled out 'key' => 'publication_date', 'compare' => '!=', 'value' => date('Y-m-d'), ), array( //if no date has been added show these posts too 'key' => 'publication_date', 'value' => date('Y-m-d'), 'compare' => 'NOT EXISTS' ) ),\: लेकिन आदेश काम नहीं कर रहा
CSSgirl

हां, आदेश देना दुर्भाग्य से कर के बाहर सेट किया जा रहा मेटा_की पर निर्भर करता है। नीचे मेरा जवाब हालांकि मदद कर सकता है।
sanchothefat

जवाबों:


19

मदद के लिए आप सभी को धन्यवाद!

अंत में नीचे दी गई क्वेरी ने मुझे वांछित परिणाम दिए - जो कि पहले "प्रकाशन_डेट" के एक कस्टम फ़ील्ड द्वारा पोस्टों को दिखाना और क्रमबद्ध करना था - तिथि के अनुसार क्रमबद्ध करना, और यदि एक ही तिथि के कई (जैसे, 4 चिह्नित) जून 2013), यह उन लोगों को शीर्षक से क्रमबद्ध करेगा। इसके बाद, यह उन सभी पदों से चलता है जिनके पास प्रकाशन तिथि भरी हुई है, शेष पदों के माध्यम से, शीर्षक द्वारा वर्णानुक्रम में लूप करेंगे।

यह मुझे उसी क्वेरी में सेट किए गए परिणाम देता है, और मेरा पृष्ठांकन रखता है:

$term = get_queried_object();
the_post();
$wp_query = new WP_Query( array(
'post_type' => 'resource',
    'tax_query' => array(
        array(
            'taxonomy' => 'resource_types',
            'field' => 'slug',
            'terms' => $term->name,
        )),
 'meta_query' => array(
       'relation' => 'OR',
        array( //check to see if date has been filled out
                'key' => 'publication_date',
                'compare' => '=',
                'value' => date('Y-m-d')
            ),
          array( //if no date has been added show these posts too
                'key' => 'publication_date',
                'value' => date('Y-m-d'),
                'compare' => 'NOT EXISTS'
            )
        ),
'meta_key' => 'publication_date',
'orderby' => 'meta_value title',
'order' => 'ASC',
'paged' => $paged,
'posts_per_page' => '10',
));

1
अच्छा लगा। मैंने कभी भी meta_queryएक ही कुंजी पर दो चलाने के लिए नहीं सोचा था !
घोस्टटॉस्ट

5
मेरे लिए (वर्डप्रेस 4.1.1 का उपयोग करके), अगर मैं meta_keyइसे स्वचालित रूप से सेट करता हूं, तो भी इसके साथ शामिल नहीं करता है NOT EXISTS। मैं वास्तव में आशा करता हूं कि मैं कुछ गलत कर रहा हूं।
रयान टेलर

1
@RyanTaylor यहाँ भी - मेटा_की को काम करने के लिए क्वेरी में सेट नहीं किया जाना चाहिए, लेकिन मेटा कुंजी सेट नहीं होने पर भी मेटा वैल्यू द्वारा सही ढंग से ऑर्डर करता प्रतीत होता है।
jammypeach

2
उपरोक्त टिप्पणियों के अनुसार, WP 4.1+ के लिए निकालें या टिप्पणी करें 'meta_key' => 'publication_date',
मिकीएलएल

7

कुछ वर्षों बाद, CSSGirl द्वारा पोस्ट किया गया कोड मेरे लिए काम नहीं कर रहा था क्योंकि कुछ ऐसे पोस्ट थे जिनकी मेटा कुंजी नहीं थी या मेटा कुंजी खाली थी इसलिए मुझे तिथि द्वारा आदेशित सभी पोस्ट करने के लिए ऐसा करना पड़ा और पहले एक मेटा कुंजी मान डिस्प्ले वाले लोगों को दिखाएं:

$args          = array(
'post_type'   => $type,
'post_status' => 'publish',
'nopaging'    => TRUE,
'meta_query'  => array(
    'relation' => 'OR',
    array(
        'key'     => $meta_key,
        'compare' => 'NOT EXISTS',
    ),
    array(
        'relation' => 'OR',
        array(
            'key'   => $meta_key,
            'value' => 'on',
        ),
        array(
            'key'     => $meta_key,
            'value'   => 'on',
            'compare' => '!=',
        ),
    ),
),
'orderby'     => array( 'meta_value' => 'DESC', 'date' => 'DESC' ),
);

1

मुझे लगता है कि आपको 2 अलग-अलग छोरों को करने की आवश्यकता होगी। आप पहले लूप में पाए गए सभी पदों को पकड़ सकते हैं और उन्हें माध्यमिक लूप से आसानी से बाहर निकाल सकते हैं:

$found_posts = array();
while($loop->have_posts()): $loop->the_post();
    // loop stuff
    $found_posts[] = get_the_id();
endwhile;

wp_reset_query();

$args = array(
    // other args
    'post__not_in' => $found_posts,
);

फिर अपना दूसरा लूप चलाएं।


अब यह कोशिश, धन्यवाद। आपको पता चलेगा कि क्या यह काम करता है!
CSSgirl

1
इसने काम किया - लेकिन इसने फुटपाथ तोड़ दिया - किसी भी विचार को यह कैसे काम करना है? यहाँ यह अब कैसा दिखता है:echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?page=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $publication_query->max_num_pages, 'prev_text' => __('Previous |'), 'next_text' => __('| Next'), ) );
CSSgirl

हम्म। जिसके बारे में मैंने सोचा था, वह नहीं है।
घोस्टटॉस्ट

1

क्या कोई कारण है कि आप प्रकाशन के लिए लागू नहीं कर सकते हैं_डेट मेटा कुंजी हर पद के लिए एक खाली मान के साथ मौजूद है?

इसलिए आपकी save_postकार्रवाई में आप मेटा कुंजी जोड़ / अपडेट करेंगे कि $_POSTमूल्य खाली है या नहीं।

आपको अपने पुराने पदों पर लूप करने के लिए एक अद्यतन स्क्रिप्ट को चलाना होगा और कुंजी को खाली मान के साथ जोड़ना होगा:

add_action( 'admin_init', 'update_old_posts' );
function update_old_posts() {
    if ( ! isset( $_GET[ 'update_old_posts' ] ) )
         return;

    foreach( get_posts() as $post ) {
        if ( false === get_post_meta( $post->ID, 'publication_date', true ) ) {
             update_post_meta( $post->ID, 'publication_date', '' );
             echo "Updated {$post->post_title} <br />";
        }
    }

    die;
}

इसे http://example.com/wp-admin/?update_old_posts पर ब्राउज़ करके चलाएं

फिर आप उसी क्वेरी का उपयोग कर सकते हैं जैसा आपके पास है। आप अलग-अलग दिशाओं में अलग-अलग कॉलम द्वारा ऑर्डर करने में सक्षम करने के लिए एक अतिरिक्त फ़िल्टर जोड़ना चाह सकते हैं, यह मेरे लिए आरोही क्रम में दिनांक और क्रम में सॉर्ट करने के लिए समझ में आएगा।

add_filter( 'posts_orderby', 'multicolumn_orderby', 10, 2 );
function multicolumn_orderby( $orderby, $query ) {
    global $wpdb;

    // check it's the right query
    if ( $query->get( 'meta_key' ) == 'publication_date' ) {
         $orderby = "$wpdb->postmeta.meta_value+0 DESC, $wpdb->posts.post_title ASC";
    }

    return $orderby;
}

हम्म, मैंने ऐसा नहीं सोचा था। मैं देने की कोशिश कर रहा हूँ और देखो कि यह कैसे जाता है, धन्यवाद!
CSSgirl

0

मैंने एक रिवाज बनाया जहाँ क्लॉज़। मैंने $wp_query->requestअपने मुख्य लूप से ठीक पहले इसका परीक्षण किया , मैं वास्तव में एसक्यूएल को अच्छी तरह से नहीं जानता हूं, लेकिन यह काम करने वाली चीजों को प्राप्त करने के लिए लग रहा था।

add_action('pre_get_posts', 'add_trending_sort', 11, 1);
function add_trending_sort($query){
  if(!$query->is_main_query())
    return;

  //Overwrite query arguments
  $query->set('meta_query', array(
    array(
      'key' => 'TRENDING',
      //'value' => 'asdfasdf',//may need a value for older versions of WordPress
      'compare' => 'NOT EXISTS',
    )
  ));
  $query->set('orderby', 'meta_value_num date');
  $query->set('order', 'DESC');
}

add_filter('posts_where', 'add_trending_where');
function add_trending_where($where = ''){
  global $wpdb, $wp_query;
  if(!$wp_query->is_main_query())//Not sure if this really works.  Should be OK
    return $where;

  $where .= " OR ( $wpdb->postmeta.meta_key = 'TRENDING' )";

  // Don't run this twice
  remove_filter('posts_where', 'add_trending_where');

  return $where;
}

वैकल्पिक रूप से, आप add_trending_where में लाइन compareको सेट 'EXISTS'और बदल सकते हैं $where .= " OR ($wpdb->postmeta.post_id IS NULL)";। तब आपको केवल एक स्थान पर कुंजी का मूल्य बदलना होगा। फिर से, प्रतिध्वनित करें $wp_query->requestऔर चारों ओर खेलें यदि आप इसे बेहतर समझना चाहते हैं या इसे ट्वीक करना चाहते हैं।

संपादित करें: मैंने अभी देखा कि यह meta_keyक्वेरी पर सेट होने पर काम नहीं करता है। $query->set('meta_key', NULL);यदि आप का उपयोग कर सकते हैं ।

EDIT 2: मुझे यह काम उपरोक्त विधि से मिला है। किसी कारण से यह पहले नहीं था (शायद मेटा_की सेट किया गया था ... मुझे नहीं पता)।

add_action('pre_get_posts', 'add_trending_sort', 11, 1);
function add_trending_sort($query){
  // Bail if not the main "hidden" query, as opposed to a 'new WP_Query()' call
  if(!$query->is_main_query())
    return;

  // Set meta_query to get shares for orderby, and also get non-shared content.
  $query->set('meta_query', array(
    'relation' => 'OR',
    array(
      'key' => 'TRENDING',
      'compare' => 'NOT EXISTS',
    ),
    array(
      'key' => 'TRENDING',
      'compare' => 'EXISTS',
    )
  ));
  //$query->set('meta_key', NULL);
  $query->set('orderby', array('meta_value_num' => 'DESC', 'date' => 'DESC'));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.