WP_Query "post_title LIKE 'कुछ%' के साथ?"


44

मैं के WP_Queryसाथ एक LIKEपर करने की जरूरत है post_title

मैंने इसकी शुरुआत नियमित रूप से की WP_Query:

$wp_query = new WP_Query( 
    array (
        'post_type'        => 'wp_exposants',
        'posts_per_page'   => '1',
        'post_status'      => 'publish',
        'orderby'          => 'title', 
        'order'            => 'ASC',
        'paged'            => $paged
    )
); 

लेकिन जो मैं वास्तव में करना चाहता हूं वह एसक्यूएल में ऐसा दिखता है:

$query = "
        SELECT      *
        FROM        $wpdb->posts
        WHERE       $wpdb->posts.post_title LIKE '$param2%'
        AND         $wpdb->posts.post_type = 'wp_exposants'
        ORDER BY    $wpdb->posts.post_title
";
$wpdb->get_results($query);

आउटपुट परिणामों को प्रिंट करता है, लेकिन मैं <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>परिणामों को प्रदर्शित करने के लिए नियमित रूप से उपयोग करता हूं ।
और इसके साथ काम नहीं कर रहा है $wpdb->get_results()

जो मैंने यहाँ वर्णित किया उसे मैं कैसे प्राप्त कर सकता हूँ?

जवाबों:


45

मैं इस पर एक फिल्टर के साथ हल करेंगे WP_Query। एक जो एक अतिरिक्त क्वेरी चर का पता लगाता है और शीर्षक के उपसर्ग के रूप में उपयोग करता है।

add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 );
function wpse18703_posts_where( $where, &$wp_query )
{
    global $wpdb;
    if ( $wpse18703_title = $wp_query->get( 'wpse18703_title' ) ) {
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $wpse18703_title ) ) . '%\'';
    }
    return $where;
}

इस तरह से आप अभी भी कॉल कर सकते हैं WP_Query, आप सिर्फ शीर्षक को wpse18703_titleतर्क के रूप में पास कर सकते हैं (या नाम को कुछ कम करने के लिए बदल सकते हैं)।


यह किसी भी तरह से गायब है $wpdb->prepare()
कैसर

@kaiser: एक लंबा समय हो गया है, लेकिन मुझे लगता है कि यह संभव नहीं था prepare()$wpdb->prepare('LIKE "%s%%"', 'banana')लौटना होगा "LIKE ''banana'%'", इसलिए हमें स्वयं क्वेरी का निर्माण करना होगा, और पलायन भी करना होगा।
Jan Fabry

1
@JanFabry आपको agaaaaaaaain देखकर खुश! :) चैट में कुछ समय के लिए ड्रॉप, हम्म? स्टॉपप्रेस आपको देखकर खुश होगा। उसके बारे में prepare()। हाँ, यह मुश्किल है और मुझे इसके लिए प्रयास करने से पहले कई बार कोशिश करनी पड़ी। कुछ मैं बस से बनाया $wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) ):। और मुझे पूरा यकीन है esc_sql()कि अनावश्यक और सिर्फ पागल है।
Kaiser

ऐसा लगता है कि आप '(apostrophe) के साथ एक स्ट्रिंग को अंदर नहीं खोज सकते हैं । मुझे लगता है कि यह भागने के कारण है? मुझे अभी तक समाधान नहीं मिला
विंसेंट डेक्सक्स

19

सरलीकृत:

function title_filter( $where, &$wp_query )
{
    global $wpdb;
    if ( $search_term = $wp_query->get( 'search_prod_title' ) ) {
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( like_escape( $search_term ) ) . '%\'';
    }
    return $where;
}

$args = array(
    'post_type' => 'product',
    'posts_per_page' => $page_size,
    'paged' => $page,
    'search_prod_title' => $search_term,
    'post_status' => 'publish',
    'orderby'     => 'title', 
    'order'       => 'ASC'
);

add_filter( 'posts_where', 'title_filter', 10, 2 );
$wp_query = new WP_Query($args);
remove_filter( 'posts_where', 'title_filter', 10, 2 );
return $wp_query;

13
कृपया अपने कोड के साथ एक स्पष्टीकरण शामिल करें।
s_ha_dum

2
महान सरलीकरण
टिमो हुओवेंन

1
कोड है मुझे लगता है कि आत्म समझाया, मेरे लिए कम से कम। पूरी स्क्रिप्ट साझा करने के लिए धन्यवाद।
हसन दाद खान

'$ Wpdb-> esc_like (' के बजाय 'esc_sql (like_escape'
fdrv

@fdrv आप सही हैं लेकिन wp डॉक्स के अनुसार $ wpdb-> esc_like को अभी भी esc_sql () की आवश्यकता है। इसलिए मुझे लगता है कि सही कोड esc_sql होगा ($ wpdb-> esc_like ($ search_term))
वकास बुखारी

16

इस कोड को अपडेट करना चाहते हैं आप लोग वर्डप्रेस 4.0 के लिए काम करते हैं और ऊपर के रूप में esc_sql () 4.0 में उच्च पदावनत है।

function title_filter($where, &$wp_query){
    global $wpdb;

    if($search_term = $wp_query->get( 'search_prod_title' )){
        /*using the esc_like() in here instead of other esc_sql()*/
        $search_term = $wpdb->esc_like($search_term);
        $search_term = ' \'%' . $search_term . '%\'';
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE '.$search_term;
    }

    return $where;
}

बाकी सामान वही है।

इसके अलावा, मैं बाहर बात करने के लिए आप उपयोग कर सकते हैं चाहता हूँ रों खोज शब्दों है, जो भी पोस्ट शीर्षक मुझे विश्वास के लिए खोज करेंगे पारित करने के लिए WP_Query तर्क भीतर चर।

ऐशे ही:

$args = array(
    'post_type' => 'post',
    's' => $search_term,
    'post_status' => 'publish',
    'orderby'     => 'title', 
    'order'       => 'ASC'        
);
$wp_query = new WP_Query($args);

वास्तव search_prod_titleमें क्या है? क्या मुझे इसे किसी और चीज़ में बदलना चाहिए?
एंटोनियोस सिइमूर्तोस

कब से esc_sqlवंचित है? यह। $wpdb->escapeहालांकि ... developer.wordpress.org/reference/functions/esc_sql
जेरेमी

ध्यान दें कि s पैरामीटर पोस्ट सामग्री को भी खोजता है, जो वांछित उद्देश्य नहीं हो सकता है। =)
क्रिस्टीन कूपर

10

यहां पोस्ट किए गए कुछ संवेदनशील समाधान के साथ, मैं थोड़ा सरलीकृत और स्वच्छता संस्करण के साथ आता हूं।

सबसे पहले, हम posts_whereफ़िल्टर के लिए एक फ़ंक्शन बनाते हैं जो आपको केवल विशिष्ट स्थितियों से मेल खाते पोस्ट दिखाने की अनुमति देता है:

function cc_post_title_filter($where, &$wp_query) {
    global $wpdb;
    if ( $search_term = $wp_query->get( 'cc_search_post_title' ) ) {
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\'';
    }
    return $where;
}

अब हम cc_search_post_titleअपनी क्वेरी में तर्क जोड़ते हैं :

$args = array(
    'cc_search_post_title' => $search_term, // search post title only
    'post_status' => 'publish',
);

और अंत में क्वेरी के आसपास फ़िल्टर को लपेटें:

add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 );
$query = new WP_Query($args);
remove_filter( 'posts_where', 'cc_post_title_filter', 10 );

Get_posts () का उपयोग करना

कुछ फ़ंक्शंस जो पोस्ट्स को पुनः प्राप्त करते हैं, वे फ़िल्टर नहीं चलाते हैं, इसलिए आपके द्वारा पोस्ट किए गए पोस्ट_विशेष फ़ंक्शंस क्वेरी को संशोधित नहीं करेंगे। यदि आप get_posts()अपनी पोस्ट को क्वेरी करने के लिए उपयोग करने की योजना बनाते हैं , तो आपको suppress_filtersअपने तर्क सरणी में गलत सेट करने की आवश्यकता है:

$args = array(
    'cc_search_post_title' => $search_term,
    'suppress_filters' => FALSE,
    'post_status' => 'publish',
);

अब आप उपयोग कर सकते हैं get_posts():

add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 );
$posts = get_posts($args);
remove_filter( 'posts_where', 'cc_post_title_filter', 10 );

sपैरामीटर के बारे में क्या ?

sपैरामीटर उपलब्ध है:

$args = array(
    's' => $search_term,
);

अपने खोज शब्द को sपैरामीटर कार्य में जोड़ते समय और यह पोस्ट शीर्षक को खोजेगा, यह पोस्ट सामग्री को भी खोजेगा।

titleWP 4.4 के साथ जोड़े गए पैरामीटर के बारे में क्या ?

titleपैरामीटर में खोज शब्द पास करना:

$args = array(
    'title' => $search_term,
);

मामला संवेदनशील है और LIKEनहीं %LIKE%। इसका मतलब खोज helloशीर्षक के साथ पोस्ट वापस नहीं आएगा Hello Worldया Hello


अति उत्कृष्ट। मैं एक पैरामीटर के रूप में 'post_title' की तलाश में था और जाहिर है, कुछ भी नहीं मिला।
मस्तबाबा

7

मेरे सामने अन्य उत्तरों पर निर्माण, उस स्थिति में लचीलापन प्रदान करने के लिए जहां आप एक पोस्ट खोजना चाहते हैं जिसमें मेटा फ़ील्ड में एक शब्द है या पोस्ट के शीर्षक में, मैं उस विकल्प को "title_filter_relation" तर्क के माध्यम से देता हूं। इस कार्यान्वयन में, मैं केवल "या" और "और" के डिफ़ॉल्ट रूप से इनपुट के लिए अनुमति देता हूं।

function title_filter($where, &$wp_query){
    global $wpdb;
    if($search_term = $wp_query->get( 'title_filter' )){
        $search_term = $wpdb->esc_like($search_term); //instead of esc_sql()
        $search_term = ' \'%' . $search_term . '%\'';
        $title_filter_relation = (strtoupper($wp_query->get( 'title_filter_relation'))=='OR' ? 'OR' : 'AND');
        $where .= ' '.$title_filter_relation.' ' . $wpdb->posts . '.post_title LIKE '.$search_term;
    }
    return $where;
}

यहां एक बहुत ही सरल पोस्ट प्रकार "faq" के लिए कोड में कार्रवाई का एक उदाहरण है जहां सवाल पोस्ट शीर्षक ही है:

add_filter('posts_where','title_filter',10,2);
$s1 = new WP_Query( array(
    'post_type' => 'faq',
    'posts_per_page' => -1,
    'title_filter' => $q,
    'title_filter_relation' => 'OR',
    'post_status' => 'publish',
    'orderby'     => 'title', 
    'order'       => 'ASC',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'faq_answer',
            'value' => $q,
            'compare' => 'LIKE'
        )
    )
));
remove_filter('posts_where','title_filter',10,2);

1
क्वेरी के लिए कस्टम "क्वेरी वर्जन" जोड़ते हुए अच्छी अंतर्दृष्टि, फ़िल्टर के WP_Queryभीतर उन्हें एक्सेस करने में सक्षम होने के लिए पारित हुई posts_where
टॉम ऑगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.