मुख पृष्ठ पर नियमित और कस्टम पोस्ट प्रकार (मेटा_क्वेरी के साथ) मिलाते हुए


9

सुनिश्चित नहीं है कि इसे कैसे प्राप्त किया जाए। मैं साइट के मुखपृष्ठ पर मानक पोस्ट और कस्टम पोस्ट को मिलाने की कोशिश कर रहा हूं, लेकिन मैं केवल कस्टम पोस्ट प्रदर्शित करना चाहता हूं यदि कोई मेटा मान सेट है। पोस्ट प्रदर्शित करना ठीक काम करता है, 'post_type' => array('game', 'post')लेकिन जब मैं मेटा_क्वेरी में जोड़ता हूं तो नियमित पोस्ट्स प्रदर्शित नहीं होते हैं (जो समझ में आता है क्योंकि वे मेटा -क्वेरी स्थिति को पूरा नहीं करते हैं)।

इसलिए मैं मेटा_क्वेरी को केवल कस्टम पोस्ट प्रकार तक कैसे सीमित करूं ताकि नियमित पोस्ट अभी भी शामिल हो?


1
अच्छा सवाल ... +1। मुझे लगता है कि आप डिफ़ॉल्ट रूप से ऐसा नहीं कर पाएंगे WP_Query। आपको pre_get_postsअपनी क्वेरी या कस्टम SQL स्टेटमेंट को बदलने की आवश्यकता होगी । वैसे भी, कृपया अपना वर्तमान कोड दिखाएं।
kaiser

जवाबों:


4

चाल करने के अलग-अलग तरीके हैं, 2 मेरे दिमाग में आता है:

  1. एक पूर्ण कस्टम $wpdbक्वेरी का उपयोग करें
  2. का उपयोग WP_Queryफ़िल्टर के साथ, का उपयोग करते हुए WP_Meta_Queryअतिरिक्त एसक्यूएल निर्माण करने के लिए

मैं यहाँ केस # 2 के लिए नमूना कोड पोस्ट करूँगा

/**
 * Run on pre_get_posts and if on home page (look at url)
 * add posts_where, posts_join and pre_get_posts hooks
 */
function home_page_game_sql( $query ) {
  // exit if is not main query and home index
  if ( ! ( $query->is_main_query() && ! is_admin() && is_home() ) ) return;
  add_filter( 'posts_where', 'home_page_game_filter' );
  add_filter( 'posts_join', 'home_page_game_filter' );
}
add_action('pre_get_posts', 'home_page_game_sql');


/**
 * Set the SQL filtering posts_join and posts_where
 * use WP_Meta_Query to generate the additional where clause
 */
function home_page_game_filter( $sql = '' ) {
  // remove filters
  remove_filter( current_filter(), __FUNCTION__);
  static $sql_game_filters;
  if ( is_null($sql_game_filters) ) {
    // SET YOUR META QUERY ARGS HERE
    $args = array(
      array(
        'key' => 'my_custom_key',
        'value'   => 'value_your_are_looking_for',
        'compare' => '='
      )
    );
    $meta_query = new WP_Meta_Query( $args );
    $sql_game_filters = $meta_query->get_sql('post', $GLOBALS['wpdb']->posts, 'ID');
  }
  // SET YOUR CPT NAME HERE
  $cpt = 'game';
  global $wpdb;
  if ( current_filter() === 'posts_where' && isset($sql_game_filters['where']) ) {
    $where = "AND ($wpdb->posts.post_status = 'publish') ";
    $where .= "AND ( $wpdb->posts.post_type = 'post' OR ( ";
    $where .= $wpdb->prepare( "$wpdb->posts.post_type = %s", $cpt);
    $where .= $sql_game_filters['where'] . ' ) )';
    $where .= " GROUP BY $wpdb->posts.ID ";
    return $where;
  }
  if ( current_filter() === 'posts_join' && isset($sql_game_filters['join']) ) {
    return $sql .= $sql_game_filters['join'];
  }
}

आगे की व्याख्या के लिए इनलाइन टिप्पणियां देखें।

अपनी मेटा क्वेरी को सेट करने के तरीके के बारे में पूर्ण दस्तावेज़ के लिए कोडेक्स पर WP_Meta_Query को भी देखें ।


संपादित करें

मैंने एक पुन: प्रयोज्य प्लगइन में एक वर्ग का उपयोग करके कोड को फिर से बनाया। Gist के रूप में उपलब्ध है


1
पूरी तरह से काम किया और इनलाइन टिप्पणियों के लिए धन्यवाद। मैंने बस अपने बर्तनों में कोड को कॉपी किया है। एफपीपी प्लगइन ने उचित मानों को मेटा क्वेरी आर्ग में डाल दिया है कि आपने होम पेज को रिफ्रेश किया और उनके पूर्ण महिमा में मेरे पोस्ट और गेम पोस्ट थे। एक बार फिर धन्यवाद।
lrm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.