২: হুকস (Hooks) এর গভীরে (A Deep Dive into Hooks)

প্রথম অধ্যায়ে আমরা একটি পাওয়ারফুল এবং সুসংগঠিত প্লাগিনের ভিত্তি তৈরি করেছি। এখন আমরা ওয়ার্ডপ্রেসের সেই মূল শক্তির গভীরে যাব যা একে পৃথিবীর সবচেয়ে জনপ্রিয় CMS বানিয়েছে—আর তা হলো হুক সিস্টেম (Hook System)।

আপনি নিশ্চয়ই add_action() এবং add_filter() এর সাথে পরিচিত। এগুলো ওয়ার্ডপ্রেসের Execution Flow-এর বিভিন্ন পয়েন্টে আপনার নিজস্ব কোড চালানোর সুযোগ করে দেয়। অ্যাকশন হুকগুলো আপনাকে কিছু করতে দেয় (যেমন: wp_head-এ CSS যোগ করা), আর ফিল্টার হুকগুলো আপনাকে ডেটা পরিবর্তন করতে দেয় (যেমন: the_content ফিল্টার করে পোস্টের শেষে কিছু যোগ করা)।

এই অধ্যায়ে আমরা বেসিক ব্যবহার থেকে বেরিয়ে এসে হুক সিস্টেমকে আয়ত্ত করার চেষ্টা করব। আমরা শিখব কীভাবে প্রায়োরিটি ও আর্গুমেন্ট ব্যবহার করে হুকের আচরণ নিয়ন্ত্রণ করতে হয়, কীভাবে অন্য প্লাগিনের যোগ করা হুক রিমুভ করতে হয় এবং সবচেয়ে গুরুত্বপূর্ণ, কীভাবে নিজের প্লাগিনকে এক্সটেনসিবল করার জন্য কাস্টম হুক তৈরি করতে হয়।

২.১ অ্যাকশন এবং ফিল্টার: শুধু add_ এর বাইরে

add_action() এবং add_filter() ফাংশন দুটির প্রথম দুটি প্যারামিটার ($hook_name, $callback_function) আমাদের সবারই জানা। কিন্তু এর আসল শক্তি লুকিয়ে আছে পরের দুটি প্যারামিটারে: $priority এবং $accepted_args।

Priority (প্রায়োরিটি): কখন আপনার কোড রান করবে?

ধরুন, wp_footer অ্যাকশনে একাধিক ফাংশন হুক করা আছে। কোনটি আগে রান করবে আর কোনটি পরে? এটি নির্ধারিত হয় প্রায়োরিটি দ্বারা। প্রায়োরিটি হলো একটি সংখ্যা, যার মান যত কম, সেই ফাংশনটি তত আগে চালু (execute) হবে। এর ডিফল্ট মান হলো 10।

উদাহরণ:

মনে করুন, আপনি ফুটারের ঠিক শুরুতে একটি অ্যানালিটিক্স স্ক্রিপ্ট এবং শেষে একটি চ্যাট (widget) যোগ করতে চান।

<?php

// এই ফাংশনটি আগে রান করবে কারণ এর প্রায়োরিটি কম (1)
add_action('wp_footer', 'add_analytics_script', 1);
function add_analytics_script() {
    echo "\n";
}

// এই ফাংশনটি পরে রান করবে কারণ এর প্রায়োরিটি বেশি (100)
add_action('wp_footer', 'add_chat_widget_script', 100);
function add_chat_widget_script() {
    echo "\n";
}

প্রায়োরিটি ভালোভাবে বুঝতে পারলে আপনি অন্য প্লাগিন বা থিমের সাথে কনফ্লিক্ট না করে নিজের কোডকে সঠিক জায়গায় সন্নিবেশ করতে পারবেন।

Accepted Arguments (আর্গুমেন্ট সংখ্যা): হুক থেকে ডেটা গ্রহণ

অনেক হুক তার সাথে কিছু প্রাসঙ্গিক ডেটা বা ভ্যারিয়েবল পাস করে। যেমন, যখন একজন ইউজার লগইন করে, তখন wp_login অ্যাকশনটি ফায়ার হয় এবং এটি দুটি ভ্যারিয়েবল পাস করে: $user_login (ইউজারনেম) এবং $user (ইউজার অবজেক্ট)।

ডিফল্টভাবে, আপনার কলব্যাক ফাংশন কোনো আর্গুমেন্ট গ্রহণ করে না। যদি আপনি এই ডেটাগুলো ব্যবহার করতে চান, তবে add_action-এর চতুর্থ প্যারামিটারে আপনাকে বলে দিতে হবে আপনি কয়টি আর্গুমেন্ট গ্রহণ করতে চান।

উদাহরণ:

ইউজার লগইন করার পর আমরা একটি লগ ফাইলে তার নাম এবং ইমেইল রেকর্ড করতে চাই।

<?php
// চতুর্থ প্যারামিটারে '2' দিয়ে আমরা দুটি আর্গুমেন্ট গ্রহণ করছি
add_action('wp_login', 'log_user_login_details', 10, 2);

function log_user_login_details($user_login, $user) {
    $log_message = sprintf(
        "User logged in: Username - %s, Email - %s, Time - %s\n",
        $user_login,
        $user->user_email,
        current_time('mysql')
    );
    // error_log() ফাংশন দিয়ে সার্ভারের লগ ফাইলে মেসেজটি লেখা হয়
    error_log($log_message);
}

যদি আমরা চতুর্থ প্যারামিটারে 2 না দিতাম, তাহলে $user_login এবং $user ভ্যারিয়েবলের মান null থাকত এবং আমাদের কোডটি সঠিকভাবে কাজ করত না।

হুক রিমুভ করা (remove_action ও remove_filter)

কখনও কখনও ওয়ার্ডপ্রেস কোর, থিম বা অন্য প্লাগিনের যোগ করা কোনো ফাংশনকে হুক থেকে সরানোর প্রয়োজন হতে পারে। যেমন, WooCommerce তার প্রোডাক্ট পেজের অনেক জায়গায় বিভিন্ন অ্যাকশন হুক ব্যবহার করে কন্টেন্ট দেখায়। আপনি যদি সেই কন্টেন্টের ক্রম পরিবর্তন করতে বা কোনো কিছু বাদ দিতে চান, তখন remove_action কাজে আসে।

গুরুত্বপূর্ণ নিয়ম: একটি হুক রিমুভ করার জন্য আপনাকে remove_action বা remove_filter ফাংশনে সেই ফাংশনের নাম এবং সঠিক প্রায়োরিটি উল্লেখ করতে হবে, যা add_action করার সময় ব্যবহার করা হয়েছিল।

উদাহরণ:

ওয়ার্ডপ্রেস ডিফল্টভাবে ট্যাগের ভেতর একটি জেনারেটর মেটা ট্যাগ () যোগ করে। নিরাপত্তা বা অন্য কারণে আমরা এটি রিমুভ করতে পারি।

<?php
// ওয়ার্ডপ্রেস এই ফাংশনটিকে 'wp_head' হুকে 10 প্রায়োরিটিতে যোগ করে।
// তাই রিমুভ করার সময়ও আমাদের 10 প্রায়োরিটি উল্লেখ করতে হবে।
remove_action('wp_head', 'wp_generator', 10);

২.২ নিজের প্লাগিনকে এক্সটেনসিবল করা: কাস্টম হুকস

একজন ভালো প্লাগিন ডেভেলপার এবং একজন অসাধারণ প্লাগিন ডেভেলপারের মধ্যে পার্থক্য হলো—ভালো ডেভেলপাররা ওয়ার্ডপ্রেসের হুক ব্যবহার করেন, আর অসাধারণ ডেভেলপাররা নিজেদের প্লাগিনেও হুক তৈরি করেন।

আপনার প্লাগিনে কাস্টম হুক তৈরি করার অর্থ হলো, আপনি অন্য ডেভেলপারদের সুযোগ করে দিচ্ছেন আপনার প্লাগিনের কার্যকারিতা পরিবর্তন বা বৃদ্ধি করার জন্য, আপনার মূল কোডে হাত না দিয়েই। এটি আপনার প্লাগিনকে একটি পাওয়ারফুল এবং মডুলার প্ল্যাটফর্মে পরিণত করে।

do_action(): কাস্টম অ্যাকশন হুক তৈরি করা

do_action() ফাংশনটি আপনার কোডের মধ্যে একটি “ফাঁকা জায়গা” বা “চেকপয়েন্ট” তৈরি করে। যখন আপনার কোডটি ওই লাইন পর্যন্ত পৌঁছায়, তখন এটি চেক করে দেখে যে অন্য কোনো ফাংশন ওই নামে রেজিস্টার করা আছে কি না। যদি থাকে, তাহলে সেই ফাংশনগুলোকে রান করে।

উদাহরণ:

আমাদের “Awesome Events Manager” প্লাগিনে যখন একটি নতুন ইভেন্ট ডেটাবেসে সেভ হবে, তারপর আমরা একটি কাস্টম অ্যাকশন ফায়ার করতে পারি।

<?php
namespace AEM\Admin;

class EventManager {
    public function save_event($data) {
        global $wpdb;

        // ... ডেটাবেসে ইভেন্ট সেভ করার কোড ...
        $event_id = $wpdb->insert_id;

        // ইভেন্ট সেভ হয়ে গেছে, এখন আমরা একটি অ্যাকশন ফায়ার করব।
        // অন্য ডেভেলপাররা এই হুক ব্যবহার করে ইমেইল পাঠাতে পারে,
        // বা সোশ্যাল মিডিয়ায় পোস্ট করতে পারে।
        do_action('aem_after_event_saved', $event_id, $data);
    }
}

এখন অন্য কোনো ডেভেলপার (বা আপনি নিজেই অন্য কোনো মডিউলে) এই হুকটি ব্যবহার করতে পারেন:

<?php
add_action('aem_after_event_saved', 'send_notification_to_admin', 10, 2);

function send_notification_to_admin($event_id, $data) {
    $subject = "New Event Created: " . $data['event_title'];
    $message = "A new event with ID #{$event_id} has been successfully created.";
    wp_mail(get_option('admin_email'), $subject, $message);
}

apply_filters(): কাস্টম ফিল্টার হুক তৈরি করা

apply_filters() ফাংশনটি কোনো ডেটাকে পরিবর্তন করার সুযোগ দেয়। আপনি একটি ভ্যারিয়েবল এই ফাংশনের মাধ্যমে পাস করবেন এবং অন্য ডেভেলপাররা সেই ভ্যারিয়েবলের মান পরিবর্তন করে আপনাকে ফেরত দেবে।

উদাহরণ:

আমাদের প্লাগিনে একটি শর্টকোড আছে যা ইভেন্টের মূল্য দেখায়। আমরা মূল্যের ফরম্যাটটি ফিল্টারেবল করতে পারি।

<?php
namespace AEM\Frontend;

class Shortcode {
    public function render_event_price($event_id) {
        $price = get_post_meta($event_id, '_event_price', true);
        $currency_symbol = '$';

        // মূল ফরম্যাট
        $formatted_price = $currency_symbol . number_format($price, 2);

        // ফরম্যাট করা মূল্যটি ডিসপ্লে করার আগে ফিল্টারের মাধ্যমে পাস করছি।
        // এখন অন্য ডেভেলপাররা চাইলে এর ফরম্যাট পরিবর্তন করতে পারবে।
        return apply_filters('aem_event_price_format', $formatted_price, $price, $currency_symbol);
    }
}

এখন যদি কোনো ডেভেলপার ডলার চিহ্নের ($) বদলে “USD” লিখতে চায়, সে সহজেই একটি ফিল্টার ফাংশন লিখতে পারে:

<?php
add_filter('aem_event_price_format', 'change_currency_format_to_usd', 10, 3);

function change_currency_format_to_usd($formatted_price, $price, $currency_symbol) {
    // আগের ফরম্যাটকে উপেক্ষা করে নতুন ফরম্যাট তৈরি করছি
    return number_format($price, 2) . ' USD';
}

সারসংক্ষেপ

এই অধ্যায়ে আমরা ওয়ার্ডপ্রেস হুক সিস্টেমের গভীরে গিয়েছি। আমরা এখন জানি:

  • প্রায়োরিটি ব্যবহার করে হুক করা ফাংশনের এক্সিকিউশন অর্ডার নিয়ন্ত্রণ করা যায়।

  • আর্গুমেন্ট গ্রহণ করে হুক থেকে পাস করা ডেটা ব্যবহার করা যায়।

  • remove_action ও remove_filter দিয়ে অপ্রয়োজনীয় ফাংশনালিটি দূর করা যায়।

  • do_action এবং apply_filters ব্যবহার করে নিজেদের প্লাগিনকে এক্সটেনসিবল, মডুলার এবং অনেক বেশি পাওয়ারফুল করে তোলা যায়।

আপনি যখন নিজের প্লাগিনে হুক তৈরি করা শুরু করবেন, তখন আপনি শুধু একজন প্লাগিন ব্যবহারকারী নন, বরং একটি ইকোসিস্টেমের নির্মাতা হয়ে উঠবেন।

পরবর্তী অধ্যায়ে…

এখন যেহেতু আমরা আমাদের প্লাগিনের কার্যকারিতা নিয়ন্ত্রণ করতে শিখেছি, এবার ডেটা ম্যানেজমেন্টের দিকে নজর দেওয়ার পালা। পরবর্তী অধ্যায়ে আমরা দেখব কীভাবে ওয়ার্ডপ্রেসের ডেটাবেসের সাথে পেশাদার স্তরে কাজ করতে হয়, কখন এবং কেন কাস্টম ডেটাবেস টেবিল তৈরি করতে হয় এবং $wpdb অবজেক্টের সর্বোচ্চ ব্যবহার কীভাবে করতে হয়।