"পোস্ট_টাইটেল 'কিছু'% 'পছন্দ করে?


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'%'", সুতরাং আমাদের নিজেরাই ক্যোয়ারীটি তৈরি করতে হবে, এবং পালাতে হবে।
জান ফ্যাব্রি

1
আপনি :) আড্ডা দিয়ে কিছু সময় ফেলে দিন, এইচএম? স্টপপ্রেস আপনাকে দেখে খুশি হবে। যে সম্পর্কে prepare()। হ্যাঁ, এটি কৌতূহলোদ্দীপক এবং এর চারপাশে যাওয়ার আগে আমাকে কয়েকবার চেষ্টা করতে হয়েছিল। কিছু থেকে আমি শুধু তৈরি করেছেন: $wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )। এবং আমি পুরোপুরি নিশ্চিত যে esc_sql()এটি অপ্রয়োজনীয় এবং নিখুঁত।
কায়সার

দেখে মনে হচ্ছে আপনি 'ভিতরে ভিতরে (স্ট্রাস্টোফের) স্ট্রিংটি অনুসন্ধান করতে পারবেন না । আমার ধারণা এই পালানোর কারণে? আমি এখনও সমাধানটি খুঁজে পেলাম না
ভিনসেন্ট ডেকাউক্স

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
কোডটি আমার নিজের পক্ষে কমপক্ষে স্বতঃ ব্যাখ্যা করা হয়েছে বলে মনে হয়। সম্পূর্ণ স্ক্রিপ্ট ভাগ করে নেওয়ার জন্য ধন্যবাদ।
হাসান দাদ খান

'Esc wpdb-> এসএস_প্লিক (' এস্ক_এসকিএল এর পরিবর্তে (যেমন_সেস্কেপ ('
এফডিআরভি

@fdrv আপনি ঠিক বলেছেন তবে ডাব্লুপি ডক্স অনুসারে $ wpdb-> এস এস_প্লিকে এখনও এস্ক_এসকিএল () দরকার। সুতরাং আমি মনে করি সঠিক কোডটি এসএস_এসকিএল ($ ডাব্লুপিডিবি-> এসএস_ লাইক ($ সন্ধান_মিটার)) হবে
ওয়াকাস

16

আপনার ছেলেরা এই কোডটি আপডেট করতে চেয়েছিল যে আপনি ছেলেরা ওয়ার্ডপ্রেস 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;
}

স্টাফ বাকি আছে।

এছাড়াও আমি আপনাকে উল্লেখ করতে চাই যে আপনি অনুসন্ধানের পদগুলি পাস করার জন্য ডাব্লুপিউকিউয়ারি আর্গুমেন্টের মধ্যে এর পরিবর্তনশীল ব্যবহার করতে পারেন , এটি আমার বিশ্বাসী পোস্টের শিরোনামটিও অনুসন্ধান করবে।

এটার মত:

$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যদিও ... ডেভেলপার.ওয়ার্ডপ্রেস.অর্গ
জেরেমি

লক্ষ্য করুন যে এর পরামিতি পোস্ট সামগ্রীটিও অনুসন্ধান করে যা পছন্দসই লক্ষ্য নাও হতে পারে। =)
খ্রীস্টিন কুপার

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প্যারামিটার কাজ এবং এটি পোস্টের শিরোনাম অনুসন্ধান করবে, এটা হবে আরো পোস্ট করা বিষয়বস্তু অনুসন্ধান।

titleডাব্লুপিপি ৪.৪ যোগ করা প্যারামিটার সম্পর্কে কী বলা যায় ?

titleপ্যারামিটারে একটি অনুসন্ধান শব্দটি পাস করা :

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

কেস সংবেদনশীল এবং LIKEনা %LIKE%। এর অর্থ অনুসন্ধানটি helloশিরোনাম সহ পোস্টটি ফিরবে না Hello Worldবা Hello


চমৎকার। আমি প্যারামিটার হিসাবে 'পোস্ট_টাইটেল' খুঁজছিলাম এবং স্পষ্টতই, কিছুই পাইনি।
মাস্তাবাবা

7

আমার আগে অন্য উত্তরের ভিত্তিতে বিল্ডিং, আপনি যেখানে মেটা ক্ষেত্রের একটি শব্দ রয়েছে বা পোস্টের শিরোনামে কোনও পোস্ট সন্ধান করতে চান সেই অবস্থাতে নমনীয়তা সরবরাহ করার জন্য, "শিরোনাম_ ফিল্টার_সংশ্লিষ্ট" যুক্তির মাধ্যমে আমি এই বিকল্পটি দিই। এই বাস্তবায়নে, আমি কেবলমাত্র "OR" বা "AND" ইনপুটগুলির জন্য "AND" এর ডিফল্ট মঞ্জুরি দেয়।

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
টম অগার 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.