गैर-मेटा खोजों पर डुप्लिकेट परिणाम उत्पन्न करने से बचने के लिए मैं इस व्यवस्थापक क्वेरी स्निपेट को कैसे सुधारूं?


11

मैं कोड स्निपेट्स के साथ खेल रहा हूं, जो व्यवस्थापक खोजों में मेटा डेटा जोड़ते हैं।

सबसे अच्छा स्निपेट मैंने पाया है, इस सवाल पर स्टेफानो ने लिखा था ।

हालाँकि, यह गैर-मेटा शर्तों को खोजते समय 1, कष्टप्रद बग दिखाई देता है।

यहाँ मेरे स्थानीय देव से कुछ क़ब्रें स्थापित हैं। मैंने स्क्रीन पर 2 MySQL प्रश्नों को प्रिंट किया है।

परीक्षण करने के लिए मैं उपयोग कर रहा हूँ एकल सीपीटी पोस्ट का दृश्य

परीक्षण करने के लिए मैं उपयोग कर रहा हूँ एकल सीपीटी पोस्ट का दृश्य

यह उम्मीद के मुताबिक काम करने वाला कोड है और मुझे एडमिन से मेटा डेटा खोजने की अनुमति देता है

यह उम्मीद के मुताबिक काम करने वाला कोड है और मुझे एडमिन से मेटा डेटा खोजने की अनुमति देता है

दुर्भाग्य से कोड शीर्षक पर इस मामले में, गैर-मेटा मैचों पर डुप्लिकेट बनाता है

दुर्भाग्य से कोड शीर्षक पर इस मामले में, गैर-मेटा मैचों पर डुप्लिकेट बनाता है

डाक की स्थिति, डाक के प्रकार और डाक के पूर्वजों को दिखाने वाला हड़प

! डाक की स्थिति, डाक के प्रकार और डाक के पूर्वजों को दिखाने वाला हड़प

यहां वह कोड है जो मैं चला रहा हूं, यह मूल रूप से स्टेफानो के समान है, लेकिन क्वेरी काम करने के लिए मेरे कच्चे प्रयासों के साथ।

/*
 * Search custom fields from admin keyword searches
 */

function rel_search_join( $join ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'listings' && $_GET['s'] != '') {    
        $join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    echo '<br><strong>JOIN</strong>: ';
    print_r ( $join );
    echo '<br>';
    return $join;
}
add_filter('posts_join', 'rel_search_join' );

function rel_search_where( $where ) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
        $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
        $where = str_replace( "OR wp_posts.post_status = 'pending'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'private'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'draft'", "", $where );
        $where = str_replace( "OR wp_posts.post_status = 'future'", "", $where );
    }
    echo '<br><strong>WHERE</strong>: ';
    print_r ( $where );
    echo '<br>';
    return $where;
}
add_filter( 'posts_where', 'rel_search_where' );  

शायद यह संशोधन को भी सूचीबद्ध करता है?
राहगीर

मुझे लगा कि मैं केवल प्रकाशित देख रहा था, क्योंकि मैंने लंबित, निजी, मसौदा और भविष्य को हटा दिया था। एक संशोधन प्रकार पर ध्यान नहीं दिया।
jnthnclrk

हम्म, "संशोधन" की स्थिति नहीं दिखाई देती है: codex.wordpress.org/Post_Status
jnthnclrk

स्तंभों में से किसी एक में पोस्ट प्रकार या पोस्ट आईडी को प्रिंट करने का प्रयास करें, मुझे लगता है कि संशोधन पोस्ट प्रकार हैं, इसलिए यदि आप संशोधन देख सकते हैं, तो आपके पास परिणाम भी हैं। लेकिन मैं यह भी देख सकता हूं कि आप केवल लिस्टिंग पोस्ट प्रकार से परिणाम प्रदर्शित करते हैं, इसलिए मुझे लगता है कि मैं गलत हूं। लेकिन इसकी एक कोशिश :)
passatgt

पोस्ट की स्थिति, पोस्ट प्रकार और पूर्वजों के साथ एक नया हड़प जोड़ा।
jnthnclrk

जवाबों:


11

एक GROUP BYबयान के बाद आपकी पोस्ट को समूहित किया जा सकता है JOIN। Wordpress के लिए आप posts_groupbyफ़िल्टर का उपयोग कर सकते हैं ।

add_filter( 'posts_groupby', 'my_post_limits' );
function my_post_limits($groupby) {
    global $pagenow, $wpdb;
    if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
        $groupby = "$wpdb->posts.ID";
    }
    return $groupby;
}

4

इस पर अपने काम के लिए धन्यवाद, दोस्तों। यह कोड मुझे वहां सबसे ज्यादा मिला, लेकिन WP 3.8 के उपयोग से मुझे SQL गैर-अद्वितीय तालिका / अन्य त्रुटि मिल रही थी, इसलिए मैंने कुछ बदलाव किए। इसके लिए अपने सेटअप पर काम करने के लिए मुझे $ wpdb-> पोस्टमेटा उर्फ ​​सेट करना पड़ा जिसका उपयोग JOIN स्टेटमेंट में किया गया था। मैं भी केवल एक बार जांच करता हूं कि क्या हुक का उपयोग किया जाना चाहिए ताकि वे हर बार फायर न करें। आशा है कि यह किसी की मदद करता है!

global $postmeta_alias, $is_specials_search;
$cpt_name = 'special';
$postmeta_alias = 'pdpm'; // Change this to whatever your custom post type is
$is_specials_search = is_admin() && $pagenow=='edit.php' && isset( $_GET['post_type'] ) && $_GET['post_type']==$cpt_name && isset( $_GET['s'] );

// Extend search to include 'description' field
if ( $is_specials_search ) {
  add_filter( 'posts_join',      'pd_description_search_join' );
  add_filter( 'posts_where',     'pd_description_search_where' );
  add_filter( 'posts_groupby',   'pd_search_dupe_fix' );
}

function pd_description_search_join ($join){
  global $pagenow, $wpdb, $postmeta_alias, $is_specials_search;

  if ( $is_specials_search )  
    $join .='LEFT JOIN '.$wpdb->postmeta. ' as ' . $postmeta_alias . ' ON '. $wpdb->posts . '.ID = ' . $postmeta_alias . '.post_id ';

  return $join;
} // END search_join

function pd_description_search_where( $where ){
  global $pagenow, $wpdb, $postmeta_alias, $is_specials_search;

  if ( $is_specials_search )
    $where = preg_replace(
     "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
     "(".$wpdb->posts.".post_title LIKE $1) OR (".$postmeta_alias.".meta_value LIKE $1)", $where );

  return $where;
} // END search_where

function pd_search_dupe_fix($groupby) {
    global $pagenow, $wpdb, $is_specials_search;

    if ( $is_specials_search )
      $groupby = "$wpdb->posts.ID";

    return $groupby;
} // END pd_search_dupe_fix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.