জ্ঞানস্তর: মাধ্যমিক/উচ্চস্তর
সময়: ৫ মিনিট
ওয়ার্ডপ্রেস থিম ডেভেলপমেন্ট, মানে নিজের মতো করে থিম বানিয়ে নেবার সময় নিজস্ব একটা অ্যাডমিন প্যানেল পাতা বানিয়ে নেয়াটা দারুণ একটা উদ্যোগ, এবং এর মাধ্যমে ওয়েবসাইটের অনেক ফিচার অ্যাডমিন প্যানেল থেকে নিয়ন্ত্রণ করার সুযোগ এর অ্যাডমিন-ব্যবহারকারীদের দেয়া যায়। তো সেরকমই একটা ওয়েবসাইট ক্লায়েন্টকে বানিয়ে দেবার সময় দরকার পড়লো একটা অ্যাডমিন পাতা বানিয়ে দেবার।
ওয়ার্ডপ্রেসে অ্যাডমিন প্যানেলে আলাদা পাতা বানিয়ে সেটিংস ডাটাবেযে সংরক্ষণের চিন্তা করলেই আপনাকে ওয়ার্ডপ্রেসের Settings API^‘র কথা চিন্তা করতে হবে। কারণ এই পদ্ধতিতে আপনি অনেক ঝামেলার বিষয়কে এড়িয়ে, হ্যাকিংয়ের সম্ভাবনা কমিয়ে আপনার সাইটের অ্যাডমিন প্যানেলে একটি সুরক্ষিত অ্যাডমিন সেকশন তৈরি করে নিতে পারবেন। কিন্তু সেটিংস এপিআই একটু সময় নিয়ে করতে হয়। যাহোক, সেটিংস এপিআই নিয়ে অন্য একদিন কথা বলা যাবে। এছাড়াও বিভিন্ন অপশন্স ফ্রেমওয়ার্ক আছে, যেগুলো অনুসরণ করে অনেক কম সময়ে অনেক ভালো অ্যাডমিন সেকশন তৈরি করে ফেলা যায়। কিন্তু এই পদ্ধতিগুলোর একটা সমস্যা আছে, সেটা হলো গতি। অ্যাডমিন ফ্রেমওয়ার্কগুলো সাইটকে অনেক ধীর করে দেয়। খুব ছোটখাটো কাজের জন্য তাই ফ্রেমওয়ার্কের বিকল্প হলো আমার গুরু Ian Stewart-এর Sample Theme Options^। মাত্র একটি ফাইল ব্যবহার করে দারুণ একটি থিম অপশন্স পেজ তৈরি করা যায় অনায়াসেই।
এরকমই একটি থিম অপশন্স পেজ তৈরি করে ফেলার পর যখন সাইটটা ক্লায়েন্টকে ডেলিভারি দেবার সময় ঘনিয়ে এলো, তখন বিভিন্নভাবে পরীক্ষা-নিরীক্ষা করতে গিয়ে দেখা গেলো, ক্লায়েন্টের জন্য তৈরি করা editor ইউযার রোল হিসেবে লগইন করে ঐ থিম অপশন্স পেজ থেকে কোনো কিছু সংরক্ষণ করা যায় না। একটা এরর দেখায়:
Cheatin’ uh?
এররটা একটু বিতর্কিত, কারণ অনেকেই এধরণের ভুলকে ‘চিটারি’ বলে অপমান করা মনে করেন। যাহোক, সেটা আমাদের বিষয় না। …অনেক ঘাঁটাঘাঁটি করলাম। কিন্তু আশানুরূপ কোনো সমাধান পেলাম না। ঘাঁটতে ঘাঁটতে ওয়ার্ডপ্রেসের trac-এ একটি টিকেট^ পেয়ে গেলাম, সেখানে একটা আপাত-সমাধান পেলাম।
সমাধানটা হলো ঐ পাতা ব্যবহারকারীর সক্ষমতা (capabilities) হিসেবে যদি edit_theme_options
‘র বদলে manage_options
করে দেয়া যায়, তাহলেই সব সমাধান হয়ে যায়। অর্থাৎ theme-options.php
ফাইলের add_theme_page()
ফাংশনটিকে যদি নিচের মতো করে লেখা যায়:
add_theme_page( __( 'Theme Options', 'sampletheme' ), __( 'Theme Options', 'sampletheme' ), 'manage_options', 'theme_options', 'theme_options_do_page' );
কিন্তু এর একটা চরম সীমাবদ্ধতা কিংবা অপকারিতা আছে, যা ঐ ট্র্যাকেই উল্লেখ করা আছে:
…giving these users ‘manage_options’ capability is not a good idea as that allows them to do other things that they shouldn’t be able to do (e.g. access wp-admin/options.php directly).
অর্থাৎ, ব্যবহারকারীকে manage options
সক্ষমতা দিয়ে দেয়ার ব্যাপারটা মোটেই কোনো ভালো আইডিয়া নয়, কারণ এর দ্বারা তাদেরকে এমন সব কাজ করার সুযোগ করে দেয়া যায়, যা তাদের জন্য প্রযোজ্য হওয়া উচিত নয় (যেমন: অ্যাডমিন প্যানেলের সেটিংস পাতায় ঢুকতে পারা)।
অর্থাৎ সমস্যাটা হলো, manage_options
সক্ষমতাটা শুধুমাত্র অ্যাডমিনের জন্য প্রযোজ্য, কিন্তু এডিটর সেই প্রিভিলিজ পেয়ে গেলে সাইটকে নষ্ট করে দিতে পারেন। তাই বিষয়টা আমাকে ভাবিত করে তুললো। এবং এটাও বুঝলাম, manage_options
কোনোভাবেই এই সমস্যার সমাধান হতে পারে না।
অনুসন্ধান চলতে থাকলো। তখনই wordpress.org/support ফোরামে Chip Bennett-এর একটা সমাধান দেখলাম (এই থ্রেডে^), তিনি বলছেন, ওয়ার্ডপ্রেসের Twenty Eleven থীমে এরকম একটি ফাংশনের ব্যবহার করা হয়েছিল, যা দিয়ে এই সমস্যাটার সমাধান করা হয়েছে। পরবর্তিতে Ed Nailor-এর এই পোস্টটি^ (আর্কাইভ লিংক^) আমার নজরে আসে, এবং আমি একটা সমাধান পাবার ব্যাপারে আশাবাদী হই। এড ন্যাইলর এই বিষয়টাতে একটু বিস্তারিত বর্ণনা করেছেন, তাই কাজে নামতে কষ্ট হলো না আমার।
আমি Twenty Eleven-এর থীম ট্র্যাক থেকে মূল কোডটা^ দেখে নিলাম। ফাংশনটা এরকম:
function twentyeleven_option_page_capability( $capability ) { return 'edit_theme_options'; } add_filter( 'option_page_capability_twentyeleven_options', 'twentyeleven_option_page_capability' );
কিন্ত আমাকে আসলে বুঝতে হবে কিভাবে এই কোডটি কাজ করছে। যেহেতু ফাংশনটি options_page_capability_twentyeleven_options
-এ ফিল্টার করা হয়েছে, তাই তা দিয়ে খুঁজলাম, কিন্তু কিছু পেলাম না। পরবর্তিতে ফাংশনটির উপরের কমেন্ট দেখে বিষয়টা বুঝতে পারলাম। লক্ষ করলে দেখবেন register_setting()
ফাংশনের প্রথম প্যারামিটারটা হলো twentyeleven_options
। অপশন পাতার এখানেই ফিল্টারটা কাজে লাগানো হয়েছে।
ফিরে এলাম ইয়ানের থিম অপশন্সে। এখানে register_setting()
-এর প্রথম প্যারামিটার হলো sample_options
। এবারে এড ন্যাইলরের পরামর্শটা মাথায় নিয়ে কাজে নেমে গেলাম। আমার থীমের functions.php
-তে TwentyEleven-এর কোডটা নিয়ে নিজের প্রয়োজনমতো বদলে নিলাম:
function options_page_capability( $capability ) { return 'edit_theme_options'; } add_filter( 'option_page_capability_sample_options', 'options_page_capability' );
এখানে ফাংশনের নামটা গুরুত্বপূর্ণ না, গুরুত্বপূর্ণ হলো ফিল্টারের হুকটা: option_page_capability_sample_options
, যাতে option_page_capability_
পর্যন্ত একই রেখে শুধু আমার থীম অপশনের সেটিংসটা বসিয়ে দিতে হয়েছে। সিনট্যাক্সটা হলো: option_page_capability_{$option_group}
, তাই register_setting
-এ অপশন গ্রুপ যা দিয়েছিলেন, হুকের শেষাংশে সেটাই বসিয়ে নিতে হবে, ব্যস, কেল্লা ফতে।
তারপরও যদি এডিটর, পাতাটি ঠিকমতো দেখতে কিংবা ব্যবহার করতে না পারেন, তাহলে এড ন্যাইলার নিচের কোডটি functions.php
-তে বসিয়ে নেয়ার পরামর্শ দিয়েছেন:
$editor_role = get_role( 'editor' ); $editor_role->add_cap( 'edit_theme_options' );
এই কোডটি ব্যবহার না করেও আপনি User Role Editor প্লাগইন দিয়েও কাজটি করে নিতে পারেন। আপনার যদি White Label CMS প্লাগইনটাও ইন্সটল করা থাকে, তাহলে WPSE’র আমার খোলা এই বন্ধ থ্রেডটা^ও দেখে নিতে পারেন।
আশা করি এখন থেকে ডেভলপাররা খুব সহজেই ইয়ানের অপশন কোড কাজে লাগিয়ে থীম অপশন্স পাতা তৈরি করতে পারবেন, এবং Editor অ্যাকাউন্টকেও তা ব্যবহারের পূর্ণ অধিকার দিতে পারবেন। 🙂
-মঈনুল ইসলাম
🔗 mayeenulislam.github.io