ওয়ার্ডপ্রেসে অ্যাডভান্সড সার্চ তৈরির উপায়

সচেতন থাকুন: এই টিউটোরিয়ালটি অতি সাধারণ ধারণার ভিত্তিতে তৈরি, এবং এক প্রকারের বাংলা পদ্ধতি বলা যায়, মানে চলে, ব্যস চলছে-ঘরাণার সমাধান। প্রকৃত ওয়ার্ডপ্রেসভিত্তিক সমাধান নিয়ে একটি কিংবা একাধিক পোস্ট লেখার পর্যায়ে রয়েছে। সমাপ্ত হওয়ামাত্র আমরা এই tuts nano-তেই তা প্রকাশ করতে পারবো ইনশাল্লাহ।

সময়: ১৫ মিনিট
জ্ঞানস্তর: মাধ্যমিক

ওয়ার্ডপ্রেস সার্চ বা অনুসন্ধান করার বিষয়টি ডিফল্টভাবেই থাকে, <?php get_search_form(); ?> লিখেই আমরা সার্চ ফর্মটা লোড করে নিতে পারি থিম কিংবা প্লাগইন ইন্টাফেসে। আর সার্চ করার পর ফলাফল দেখার জন্য search.php টেমপ্লেটটা সাজিয়ে নিতে হয়, তাহলেই অনুসন্ধানের ফলাফল দেখা যায়। কিন্তু ডিফল্ট সার্চ সুবিধাটি শুধুমাত্র keyword বা লেখার টুকরা নিয়ে অনুসন্ধান করে, যা সাধারণত পোস্ট, পেজ ইত্যাদিতেই সীমাবদ্ধ — কাস্টম ফিল্ড, ট্যাক্সোনমি ইত্যাদিতে অতিরিক্ত উপাদানের ভিতরকার তথ্যাদি অনুসন্ধান করার জন্য আপনাকে অ্যাডভান্সড সার্চ তৈরি করার কোনো বিকল্প নেই। এছাড়া এমন অনেক ক্ষেত্র আছে, যেখানে কয়েকটা আলাদা আলাদা উপাদানের বিভিন্ন মিশ্রণের প্রেক্ষিতে কিছু খুঁজে নেয়ার দরকার হতে পারে। যেমন: একটা অনলাইন স্টোর ওয়েবসাইট, কিংবা অনলাইনে গাড়ি বিক্রীর ওয়েবসাইট, যেখানে পণ্যের বা গাড়ির দাম, পণ্যের বা গাড়ির আকার, পণ্যের বা গাড়ির রং ইত্যাদি আলাদা আলাদা মিশ্রণে পণ্য বা গাড়ি খুঁজে নেয়ার দরকার হতে পারে — কেউ লাল রঙের গাড়ি ১টি চাইতে পারে, কেউ নীল রঙের গাড়ি ৩টি চাইতে পারে। তো এসব ক্ষেত্রে অ্যাডভান্সড সার্চ তৈরি করার দরকার পড়ে। আমরা আজকে ধারণা নিবো কিভাবে তা করা যায়:

 

ধাপ ১

আপনার থীমে শুরুতেই একটা HTML ফর্ম বানিয়ে নিতে হবে। যা দিয়ে আমরা ব্যবহারকারী থেকে তথ্য নিবো। অর্থাৎ ব্যবহারকারী কী কী মিলিয়ে অনুসন্ধান করতে চান, আমরা সেই তথ্যগুলো নেবার জন্য একটা ফর্ম বানাবো:



<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">



<h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>


    
        <!-- এই হিডেন ফিল্ড দিয়েই আমরা আসলে অ্যাডভান্সড সার্চ ফলাফল পাতাটি functions.php'র মাধ্যমে ডেকে আনবো -->
        <input type="hidden" name="search" value="advanced">
    
        <label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label>
        <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />
    
        <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label>
        <select name="model" id="model">
<option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
<option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
<option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
        </select>
    
        <input type="submit" id="searchsubmit" value="Search" />
    
    </form>


    

ফর্মটি আমরা একটা নাম দিয়ে সেভ করবো, কিন্তু তা অবশ্যই searchform.php হবে না। উদাহরণস্বরূপ আমরা দিলাম advanced-searchform.php — কিন্তু বুঝতেই পারছেন অন্যান্য টেমপ্লেটের সাথে সাংঘর্ষিক নয় এরকম যেকোনো নামই হতে পারে।

ফর্মের সিনট্যাক্স কেমন, কোডেক্স-এ ডিফল্ট সার্চ ফর্ম থেকে তার একটা ধারণা নেয়া যেতেই পারে।
get_search_form() – Codex

এবারে আমাদের বানানো সার্চ ফর্মটি থীমের যেখানে দেখাতে চাচ্ছি, সেখানে নিচের কোডটি বসাতে হবে:

<?php get_template_part( 'advanced', 'searchform' ); ?>

আমরা TwentyFourteen-এর সাইডবারে কোডটা বসিয়ে পরীক্ষা করতে পারি। এরকম দেখাচ্ছে-

Advanced Search form WordPress by nanodesigns

তো আপনার সার্চ ফর্ম তৈরি। এবারে আপনার ব্যবহারকারীদের পছন্দ আপনি একটা URL-এ নিয়ে নিতে পারছেন। অথ্যাৎ যদি আপনি গাড়ির নামের জায়গায় “Ferrari” আর মডেলের জায়গায় “Model2” বাছাই করে সাবমিট করেন, তাহলে URL-টা দাঁড়াবে এরকম:

http://example.com?search=advanced&name=Ferrari&model=model2

ধাপ ২

এবারে আপনার যা দরকার: ডাটাবেজে কুয়েরি করা এবং কাস্টম ফিল্ডে সার্চ কুয়েরি অনুযায়ী খুঁজে মিলিয়ে নেয়া। মনে রাখবেন, সার্চ কুয়েরি কিন্তু আপনার URL, যা আপনি ফর্মটা সাবমিট করার পরে পেয়েছেন। …এপর্যায়ে আপনি ওয়ার্ডপ্রেসকে বলে দিবেন যে, যখন আপনার ব্যবহারকারীরা সার্চ করবেন, তখন যেন আপনার নিজস্ব অনুসন্ধান পাতাটি খুঁজে এনে সেখানে ফলাফল দেখায়। এজন্য নিচের ফাংশনটি আপনার functions.php ফাইলে বসিয়ে নিন। এটি বসালে ফর্ম সাবমিট করার পরে ডিফল্ট সার্চ টেমপ্লেট না খুলে আপনার নিজস্ব সার্চ পাতা খুলবে।

    <?php function wpse_load_custom_search_template(){ if( isset($_REQUEST['search']) == 'advanced' ) { require('advanced-search-result.php'); die(); } } add_action('init','wpse_load_custom_search_template'); ?>
    

এই কোডটি আমি ওয়ার্ডপ্রেস স্ট্যাকএক্সচেঞ্জ থেকে নিয়েছি (দুর্ভাগ্যবশত আমি এর উৎসটা ভুলে গেছি), কিন্তু এই কোডটি ব্যবহারে মতদ্বৈততা আছে, বিশেষ করে init-তে অ্যাকশটা হুক করার বিষয়ে। কিন্তু সত্যি কথা বলতে কি তবু কোডটি কাজের (দুর্বল যুক্তি নিশ্চিত!)

ইতালির Giuseppe (G.M.) এব্যাপারে আরেকটি পথ বাৎলে দিয়েছেন^, তাও দেখা যেতে পারে।

ধাপ ৩

আরেকটি নতুন ফাইল তৈরি করুন, যাকে advanced-search-result.php নাম দিয়ে সংরক্ষণ করা যাক (কারণ functions.php-তে আমরা এই নামটিই দিয়েছিলাম)। আর তাহলেই আপনি এবার মুক্ত – অবশ্যই। কারণ কনসেপ্ট বা মূল ধারণাটা হলো:

  • URL থেকে তথ্যটা ধরুন,
  • একটা সাধারণ WP_Query() কাজে লাগান (কুয়েরি জটিল কিছু হলে $wpdb কুয়েরি ব্যবহার করুন)
  • কমান্ডগুলো কুয়েরিতে পাস করুন, আর ডাটাবেজ থেকে তথ্য বের করে নিন, এবং
  • ফলাফলটা দেখান

উদাহরণ হিসেবে দেখা যাক:

        <?php // URL থেকে ভ্যারিয়েবলে তথ্য নিন $_name = $_GET['name'] != '' ? $_GET['name'] : ''; $_model = $_GET['model'] != '' ? $_GET['model'] : ''; // কুয়েরি শুরু করুন $v_args = array( 'post_type' =>  'vehicle', // যদি কাস্টম পোস্টটাইপ ব্যবহার করেন
                's'             =>  $_name, // আপনার নাম ফিল্ড থেকে কীওয়ার্ড নিয়ে সবকিছুতে খুঁজে দেখবে
                'meta_query'    =>  array(
                                        array(
                                            'key'     => 'car_model', // ধরে নিচ্ছি আপনার meta_key হলো 'car_model'
                                            'value'   => $_model,
                                            'compare' => 'LIKE', // সিলেক্ট ফিল্ড থেকে নেয়া মডেলের সাথে মিল রেখে মডেল খুঁজে নিবে
                                        ),
                                    )
            );
        $vehicleSearchQuery = new WP_Query( $v_args );

        // WP এইমাত্র কী কুয়েরি চালু করেছে তা দেখতে নিচের লাইনটি খুলে নিন
        // var_dump($vehicleSearchQuery->request);

        // ফলাফল দেখান
        if( $vehicleSearchQuery->have_posts() ) :
            while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
                the_title(); // ধরে নিলাম আপনার গাড়ির নামগুলো CPT'র পোস্ট টাইটেল হিসেবে সংরক্ষণ করছেন
            endwhile;
        else :
            _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
        endif;
        wp_reset_postdata();
        ?>
    

WP_Query() ব্যবহার করার সময় আপনার সেরা বন্ধু হতে পারে কোডেক্স পাতাটি, এবং কাস্টম ফিল্ড সংক্রান্ত প্যারামিটারগুলো:

তো আপনার পুরো জিনিসটা তৈরি এখন। কিন্তু তবু এখনও আপনার জন্য অনেক চ্যালেঞ্জ বাকি রয়ে গেলে:

  • বদলি অনুসন্ধান তথ্য: অ্যাডভান্সড সার্চ যেমন সবগুলো ফিল্ড মিলিয়ে হতে পারে, তেমনি যেকোনো একটি ফিল্ড দিয়েও হতে পারে, তাই আপনাকে নিশ্চিত হতে হবে যে, আপনার কুয়েরি সব ধরণের অবস্থায়ই ডাটাবেজে থাকা তথ্য ঠিক ঠিক বের করে আনছে।
  • শুদ্ধিকরণ আর যাচাইকরণ: টেক্সট ফিল্ড আর টেক্সটএরিয়াগুলো খুবই মারাত্মক, কারণ এগুলো দিয়ে খুব সহজেই ডাটাবেজে অযাচিত তথ্য পাঠিয়ে ওয়েবসাইটের বারোটা বাজিয়ে দেয়া যেতে পারে। তাই বলে অন্যান্য ফর্ম এলিমেন্টও কম ঝুঁকির না। তাই সরাসরি তথ্য পাঠিয়ে দেয়াটা সবসময়ই অনিরাপদ, আপনাকে অবশ্যই আগে তথ্যকে পরিশুদ্ধ করে নিয়ে যথাযথ যাচাই-বাছাইয়ের মধ্য দিয়ে তথ্যকে ডাটাবেজ কুয়েরিতে পাঠাতে হবে – যাকে বলে Sanitization & Validation। (Data Sanitization and Validation with WordPress – TutsPlus^)
  • নকশায়ন: সাজিয়ে নেয়ার বিষয়টিও আসতে পারে, কিভাবে আপনি আপনার অনুসন্ধান পাতাটি সাজাবেন, সেক্ষেত্রে আপনি page.php (কিংবা search.php) টেমপ্লেটটির সহায়তা নিতে পারেন।

তো, আপনি আসল ধারণাটি পেয়ে গেছেন, এবারে বাকি পথটা আপনাকেই চলতে হবে — পথ ধরুন, নতুন পথ আবিষ্কার করুন। মনে রাখবেন, পৃথিবীতে প্রত্যেকের পথই আলাদা। আপনারটা তৈরি করে নিন, যাতে একদিন আমি আপনাকে অনুসরণ করতে পারি। 🙂

-মঈনুল ইসলাম
ফ্রন্টএন্ড ডিযাইনার ও ওয়ার্ডপ্রেস ডেভলপার

4 comments

    1. nonce-এর ব্যবহার করা হয় ডাটাবেজে যাতে SQL Injection প্রতিহত করা যায়, এটা ব্যবহার করতে হয় যখন ডাটাবেজে কোনো কিছু ইনসার্ট/আপডেটের কাজ করা হয়। সার্চে এই ব্যাপারটি ঘটে না, সার্চে শুধুমাত্র তথ্য খোঁজা হয় (Query), এক্ষেত্রে নান্সের ব্যবহার অবান্তর এবং অযথাই ঝামেলা করার নামান্তর।
      আপনার প্রশ্নের জন্য ধন্যবাদ।

    1. এই পদ্ধতিটা ব্যবহার করতে নিরুৎসাহিত করা হচ্ছে।
      নতুন এবং সঠিক পদ্ধতি নিয়ে খুব শিঘ্রই লিখার ইচ্ছা আছে, ইনশাল্লাহ তখন সমাধান হয়ে যাবে।

      তবু অফ-দ্যা-রেকর্ডে একটা কথা বলে রাখি: Undefined index খুব প্রচলিত একটা সমস্যা। ধরা যাক একটা ভ্যারিয়েবলে ডায়নামিক ভ্যালু রাখছি। কিন্তু কোনো কারণে তাতে ভ্যালু এলো না। কিন্তু আপনি পরবর্তিতে ঐ ভ্যারিয়েবলটা কোথাও ব্যবহারও করেছেন। তখন, ঐ যে, যেখানে ব্যবহার করেছেন, সেখানে কিন্তু ফাঁকা ভ্যালু গেল, কিংবা Undefined index গেল, মানে, এই ভ্যারিয়েবলে আসলে কী যে এসেছে, সে জানে না। এই সমস্যা খুব সহজে সমাধান করা যায়।

      < ?php
      $variable = ''; //প্রথমে একে সেট করে নিলাম ফাঁকা হিসেবে
      $variable = 3; //ধরা যাক, এটাই আমাদের ডায়নামিক ভ্যালু
      

      এখন যদি কোনো কারণে দ্বিতীয় লাইনে ভ্যালু নাও আসে, সে $variable-কে ফাঁকা ধরে নিয়ে এগোতে পারে, তাই Undefined index দেখাবে না।

আপনার মন্তব্য জানান...