ওয়ার্ডপ্রেস হুক – যেন এক যাদুর কাঠি

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

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

প্রথমে একটু একশন নিয়ে কথা বলি। আপনার জন্য ওয়ার্ডপ্রেস যে একশন গুলো দিয়ে দিয়েছে, তার লিস্ট আপনি এখান থেকে দেখতে পারবেনঃ একশন লিস্ট। এবার একটু ব্যবহার টা শিখে ফেলা যাক।

ধরুন, একটা একশন হুক wp_head. আমরা এটা নিয়ে কাজ করব। এই হুকটা কল করা আছে wp_head() ফাংশনের মধ্যে। wp_head() ফাংশনটা তো চিনেন, আমরা থিমের মধ্যে header.php ফাইলে head ট্যাগের আগে শেষ লাইন এটা। তো আমরা চাচ্ছি সেখানে কিছু css প্রিন্ট করতে। নরমালি আমরা হুক নিয়ে আজ করি থিমের functions.php ফাইলে অথবা নিজের প্লাগিন ফাইলে। তো সেখানে আমরা একশন হুক নিয়ে কাজ করতে গিয়ে আর একটা ফাংশন ব্যবহার করব – add_action() আমরা নিয়মটা একটু দেখে নেইঃ
[php]
add_action( ‘wp_head’, ‘my_css’ );
function my_css() {
?>

<!–?php
}
[/php]

এবার একটু বিস্তারিত বলি। এখানে add_action() ফাংশনে ২টা আগর্ুমেন্ট ব্যবহার করা হয়েছে। প্রথমটা হল একশনটার নাম আর পরেরটা হল কলব্যাক ফাংশনের নাম। মানে, যখন ঐ একশনটা কল হবে, তখন আরো একটা ফাংশন রান করতে বলছেন আপনি, সেটা হল my_css()। এই my_css() ফাংশনটা শুধু তখনই কল হবে ও ততবারই কল হবে, যখন ও যতবার wp_head একশনটা কল হবে। এখন মনে করুন, আপনি একট একশনে ২টা কলব্যাক ফাংশন দিবেন, হ্যা সম্ভব।
[php]
add_action( ‘wp_head’, ‘callback_1’ );
function callback_1() {
// Do XXX
}
add_action( ‘wp_head’, ‘callback_2’ );
function callback_2() {
// Do YYY
}
[/php]

এখানে একই হুকে ২টা ফাংশন কল করা হয়েছে। কিন্তু কোনটা আগে হবে? যেটা আগে লেখা সেটাই আগে হবে। কিন্তু আপনি যদি দ্বিতীয় ফাংশনটি লিখেন, আর প্রথমটা কোনো প্লাগিনের ভিতরে হয় যা আপনি এডিট করতে পারবেন না, সেখেত্রে আপনি কি করবেন? এই জন্য add_action() ফাংশনে ৩য় আগর্ুমেন্ট ব্যবহার করব। যেটা হল প্রায়োরিটি।
[php]
add_action( ‘wp_head’, ‘callback_2’, 25 );
function callback_2() {
// Do YYY
}
[/php]

প্রায়োরিটি হল যেকোনো নম্বর। যেটার প্রায়োরিটি যত কম, ঐ কলব্যাক অত আগে কল হবে। তো আপনি যদি চান ১মটার আগে আপনার টা কল করবে, আপনার প্রায়োরিটি কমিয়ে দিন আর যদি চান, আপনারটা পরে কল হবে, তাহলে আপনার প্রায়োরিটি বাড়িয়ে দিন। কিন্তু আপনি যদি ১মটা ফাংশনে কোনো প্রায়োরিটি না দেখেন? ব্যাপার না। ডিফল্ট মান হল ১০। মানে আপনি যদি প্রায়োরিটি না দিন, এর মানে হল সেটার প্রায়োরিটি ১০।

কোনো কোনো একশন ভ্যারিয়েবল পাস করে আগর্ুমেন্ট হিসেবে। যেমন edit_user_profile একশনটা $user অবজেক্ট পাস করবে। আপনি আপনার কলব্যাক ফাংশনে যেই ভ্যারিয়েবল নিয়ে আপনার ইচ্ছেমত কাজ করতে পারবেন।
[php]
add_action( ‘edit_user_profile’, ‘edit_user_profile_my_cb’ );
function edit_user_profile_my_cb( $user ){
//Do something with $user object
}
[/php]

যখন আপনি আপনার কলব্যাকে আগর্ুমেন্ট ব্যবহার করবেন, তখন আসলে add_action() ফাংশনে ৪থর্ আগর্ুমেন্ট ব্যবহার করতে হবে, যেটা হল কয়টা আগর্ুমেন্ট পাস করতেছে ঐ একশন। আমাদের উপরের উদাহরনে ১টা আগর্ুমেন্ট পাস হচ্ছে, সুতরাং সঠিক ব্যবহার হলঃ
[php]
add_action( ‘edit_user_profile’, ‘edit_user_profile_my_cb’, 20, 1 );
function edit_user_profile_my_cb( $user ){
//Do something with $user object
}
[/php]

যদি ২টা আগর্ুমেন্ট পাস করত, তাহলে আমরা add_action( ‘edit_user_profile’, ‘edit_user_profile_my_cb’, 20, 2 ); লিখতাম। এখানে মনে রাখবেন, আপনি ৩য় আগর্ুমেন্ট বাদ দিয়ে ৪থর্ আগর্ুমেন্ট দিতে পারবেন না, তাই ৪থর্ আগর্ুমেন্ট দিতে গেলে আপনাকে অবশ্যই ৩য় আগর্ুমেন্ট দিতে হবে, যেটা হল প্রায়োরিটি। আমি ২০ দিয়েছি, আপনি যে কোন কিছু দিতে পারেন।

এতক্ষন আমরা ওয়ার্ডপ্রেসের দিয়ে দেয়া একশন গুলো নিয়ে কাজ করলাম। ওয়ার্ডপ্রেস আপনাকে এই সুবিধা এ জন্যই দেয় যাতে মুল কোডে হাত না দিয়ে আপনি কিছু মডিফাই বা আপনার কিছু কাজ করে নিতে পারেন। তো আপনি যখন প্লাগিন বানাবেন, আপনিও আপনার ক্রেতাকে এই সুবিধা কেন দিবেন না? আসলে আপনার দেয়াই উচিত। কারন সে যদি আপনার প্লাগিন এডিট করে, তখন পরবর্তীতে আপডেট করতে গেলে তার এডিট ডিলিট হয়ে যাবে। একটা প্লাগিন ততই ভাল সেটা যত বেশি হুক প্রোভাইড করবে। আসুন দেখি আপনি কিভাবে এই সুবিধা দিবেন। মনে করেন, আপনি একটা আপনার প্লাগিনে কিছু বুকিং ডাটা সেভ করেন। তখন আপনি একটা একশন দিবেন, যে কিছু একটা হয়েছে এখানে।
[php]
……
……
……
$wpdb->query( ‘YOUR QUERY TO SAVE BOOKING DATA’ );

do_action( ‘booking_data_saved’ );

[/php]

এখানে আপনি booking_data_saved কাস্টম একশন দিলেন আপনার ক্রেতা কে। সে যদি চায়, যখন বুকিং ডাটা সেভ হবে, তখন সে যেন মেইল পায়। কিন্তু আপনি সে রকম কোন সুবিধা দেননি। সে তখন আপনার একশন ব্যবহার করবে তার functions.php তে:
[php]
add_action( ‘booking_data_saved’, ‘booking_data_saved_cb’ );
function booking_data_saved_cb() {
wp_mail( …….. );
}
[/php]

booking_data_saved_cb() ফাংশনটা তখনই রান করবে, মানে মেইলটা তখনই করবে, যখন do_action() কল হবে আর সেটা কিন্তু কল হবে বুকিং ডাটা সেভ হবার পরে। মানে হল যখন ডাটা সেভ হচ্ছে, তখন একটা মেইল চলে যাচ্ছে। দারুন না? 🙂

এবার মনে করেন, edit_user_profile একশনের মত আপনিও ডাটা পাস করবেন। আপনি যতগুলো খুশি ভেরিয়েবল পাস করতে পারেন। ধরেন, আপনার আগের কোডেই যখন বুকিং ডাটা সেভ হচ্ছে তখন ক্রেতা নিজেকে একটা মেইল করতে চাচ্ছে (যেটা করে ফেলেছি আমরা) কিন্তু সেই মেইলে যে বুকিং করেছে তার নাম আর ইমেইল পাঠাতে চাচ্ছে। সেক্ষেত্রে আপনি বুকারের নাম আর ইমেইল আগর্ুমেন্ট হিসেবে পাঠাবেন।
[php]
……
……
……
$wpdb->query( ‘YOUR QUERY TO SAVE BOOKING DATA’ );

do_action( ‘booking_data_saved’, $client_name, $client_email );

[/php]

আর functions.php তে extend করবেঃ
[php]
add_action( ‘booking_data_saved’, ‘booking_data_saved_cb’, 20, 2 );
function booking_data_saved_cb( $name, $email ) {
wp_mail( ‘EMAIL’, ‘SUBJECT’, ‘WRITE CONTENT WITH $name AND $email’ );
}
[/php]

মজা না অনেক? :p

এবার আসুন ফিল্টার নিয়ে কথা বলি। ফিল্টার মুলত মডিফাই করে। ফিল্টার আর একশন অনেকটা একই রকম। বিল্ট-ইন সমস্ত ফিল্টার আপনি এখানে পাবেনঃ ফিল্টার লিস্ট

মনে করুন, আপনি চান প্রতি পেজে কন্টেন্টের পর আপনি একটা ইমেজ এড করবেন। সেক্ষেত্রে আমরা the_content ফিল্টারটা ব্যবহার করবঃ
[php]
add_filter( ‘the_content’, ‘modified_content’ );
function modified_content( $content ) {
return $content . ‘ADD HERE ANYTHING TO SHOW AT THE BOTTOM’;
}
[/php]

এখানে আপনি কন্টেন্ট প্রিন্ট হবার আগে সেই কন্টেন্টকে মডিফাই করছেন, একটা ইমেজ এড করছেন। এখন সব কন্টেন্ট এর নিচে আপনি এই ইমেজটা দেখতে পারবেন। যদি এরকম চান যে একটা নির্দিষ্ট পেজ (ধরি ID 232) শুধু লগড ইন মেম্বাররা দেখবেন, তাহলেঃ
[php]
add_filter( ‘the_content’, ‘make_secure_content’ );
function make_secure_content() {
global $post;
if( $post->ID == 232 ) {
return is_user_logged_in() ? $content : ‘You need to login to see this page’;
}
return $content;
}
[/php]

তেমন জটিল কিছু না কিন্তু। একশনের মতই এর ৩য় আর ৪থর্ আগর্ুমেন্ট হল প্রায়োরিটি আর number of passed arguments।

তো আপনি কিভাবে আপনার প্লাগিনে এই সুবিধা দিবেন? চলুন দেখা যাক – মনে করুন, আপনার প্লাগিনে আপনি একটা লেখা প্রিন্ট করবেন – Bookings কিন্তু ক্রেতা সেটাকে appointments দেখাতে চাচ্ছে। নরমালি এটা ল্যাংগুয়েজ ফাইল থেকে করা হলেও সিম্প্লিসিটির জন্য আমি এভাবে দেখাচ্ছি। আপনি যদি এভাবে লিখেন, তাহলে ক্লায়েন্ট সেটা চেঞ্জ করতে পারবেন নাঃ
[php]
echo “Bookings”;
[/php]

আপনাকে যেটা করতে হবেঃ
[php]
echo apply_filters( ‘booking_text’, ‘Bookings’ );
[/php]

এখন আপনার ক্লায়েন্ট সেটাকে চেঞ্জ করবেঃ
[php]
add_filter( ‘booking_text’, ‘booking_text_cb’ );
function booking_text_cb( $text ){
return “Appointments”;
}
[/php]

এবার সেটাকে Appointments দেখাবে। দেখুন, do_action() এ default আগর্ুমেন্ট একটা ছিল, apply_filters() এ কিন্তু ২টা – ফিল্টারের নাম, আর একটা ভেলু। আসুন এবার মাল্টিপল ভেলু পাস করিঃ
[php]
$count = total_number_of_bookings();
echo apply_filters( ‘booking_text’, ‘Bookings’, $count );
[/php]

দেখুন, এখানে আরো একটা আগর্ুমেন্ট পাস করছি (চাইলে যতগুলো খুশি পাস করতে পারেন)। ক্লায়েন্ট চাচ্ছে, $count ১ হলে Appointment আর বেশি হলে Appointments দেখাবেঃ
[php]
add_filter( ‘booking_text’, ‘booking_text_cb’ );
function booking_text_cb( $text, $count ){
return $count < 2 ? “Appointment” : “Appointments”;
}
[/php]

আপনি চাইলে php এর অন্য syntax ও ব্যবহার করতে পারেনঃ
[php]
add_action( ‘wp_head’, function() {
//Do something
add_action( ‘wp_footer’, function() {
//Do something more
});
});
[/php]

আপনি যদি OOP তে আপনার প্লাগিন বা থিম ডেভেলপমেন্ট করেন, তাহলে একশন আর ফিল্টার কল একটু ভিন্নভাবে করতে হবেঃ

#১
[php]
class MyPlugin{

public function __construct() {
add_action( ‘boking_data_saved’, array( $this, ‘boking_data_saved_cb’ ), 20, 2 );
}

public function boking_data_saved_cb( $name, $email ){
//Do your stuff
}

}
[/php]

#২
[php]
class MyPlugin{

public function __construct() {
add_action( ‘boking_data_saved’, array( ‘MyPlugin’, ‘boking_data_saved_cb’ ), 20, 2 );
}

public function boking_data_saved_cb( $name, $email ){
//Do your stuff
}

}
[/php]

#৩

[php]
class MyPlugin{

public function __construct() {

}

public function boking_data_saved_cb( $name, $email ){
//Do your stuff
}

}

add_action( ‘boking_data_saved’, array( ‘MyPlugin’, ‘boking_data_saved_cb’ ), 20, 2 );
[/php]

#৪
[php]
class MyPlugin{

public function __construct() {
add_action( ‘boking_data_saved’, [ $this, ‘boking_data_saved_cb’ ], 20, 2 );
}

public function boking_data_saved_cb( $name, $email ){
//Do your stuff
}

}
[/php]

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

একটা ব্যাপার মাথায় রাখবেন, একটু ভাল করে ফাংশনের নাম গুলো দেখুন।

apply_filters(): যতগুলো ফিল্টার আছে, সব এখন এপ্লাই কর।

add_filter(): ফিল্টার এড কর, যেটা উপরের ফাংশন দিয়ে এপ্লাই করা হবে।

do_action(): কিছু কর।

add_action(): কিছু এড কর যা উপরের ফাংশন দিয়ে এপ্লাই করা হবে।

আরেকবারঃ
১। add_filter( ফিল্টারের নাম, আপনার কলব্যাক ফাংশন, প্রায়োরিটি, নাম্বার অফ আগর্ুমেন্ট );
২। add_action( একশনের নাম, আপনার কলব্যাক ফাংশন, প্রায়োরিটি, নাম্বার অফ আগর্ুমেন্ট );
৩। apply_filters( কাষ্টম ফিল্টার নাম, ডিফল্ট আগর্ুমেন্ট, আরো আগর্ুমেন্ট, আরো আগর্ুমেন্ট );
৪। do_action( কাষ্টম একশন নাম, আগর্ুমেন্ট, আরো আগর্ুমেন্ট, আরো আগর্ুমেন্ট );

Comments (No)

Leave a Reply

এই সাইটের কোন লেখা কপি করা সম্পুর্ন নিষেধ