<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ওয়ার্ডপ্রেস টিউটোরিয়াল</title>
	<atom:link href="https://mayeenulislam.github.io/tuts/category/web-development-tuts/wordpress-tuts/feed/" rel="self" type="application/rss+xml" />
	<link>https://mayeenulislam.github.io/tuts/category/web-development-tuts/wordpress-tuts/</link>
	<description>Technology Tutorials by Mayeenul Islam</description>
	<lastBuildDate>Sat, 21 Jan 2023 14:44:52 +0000</lastBuildDate>
	<language>bn-BD</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/cropped-tuts-nano-32x32.png</url>
	<title>ওয়ার্ডপ্রেস টিউটোরিয়াল</title>
	<link>https://mayeenulislam.github.io/tuts/category/web-development-tuts/wordpress-tuts/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</title>
		<link>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/</link>
					<comments>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 01 Jun 2016 13:44:21 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্রাথমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1027</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/">অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>অ্যাডমিন প্যানেলে একটা পাতায় (menu_page কিংবা submenu_page হতে পারে) একটা <code>WP_Query()</code> চালিয়ে কিছু তথ্য নিয়ে এসেছি। টেবিল আকারে তথ্যগুলো দেখিয়েছিও। এবং পেজিনেশনও করেছি। কিন্তু লক্ষ করলাম, পেজিনেশন কাজ করছে না। অনুসন্ধান করে দেখলাম Christine Cooper-ও একই সমস্যায় পড়েছিলেন এবং তিনি একটা সমাধানও বের করেছেন Milo&#8217;র পরামর্শকে কাজে লাগিয়ে। সমাধানটা দারুণ, এবং আমার সমস্যারও সমাধান দিলো। কিন্তু আরো কিছু বিষয়ের দরকার হয়ে পড়েছিল, তাই আমি সেটাতে আরো কাজ করে আপনাদের জন্য হাজির করলাম একটু গোছানো একটা সমাধান হিসেবে। আপনারা এটাকে আরো গুছিয়ে নিতে পারেন নিজের মতো করে।</p>



<h3>আসলে কী হচ্ছে, কেন হচ্ছে?</h3>



<p>এই ব্যাপারটা আগে জানা দরকার। কপি-পেস্ট সবাই করতে পারে, কোড বুঝে নিয়ে তা ব্যবহার করাটাই প্রকৃত প্রোগ্রামারের কাজ হওয়া উচিত। যা জানা গেল, তা হলো,</p>



<span id="more-1027"></span>



<p> আমাদের পাতায় কোনো <code>$wp_query</code> অবজেক্ট লোড হচ্ছে না। সেকারণে Query argument-ও যোগ হচ্ছে না ইউআরএল-এ। তাই আমাদের বহুল পরিচিত পেজিনেশন সংক্রান্ত কন্ডিশনাল:</p>



<p><code>$paged = get_query_var('paged') ? get_query_var('paged') : 1;</code></p>



<p>এখানে কাজ করছে না, কারণ <code>get_query_var()</code> আসলে কিছু পাচ্ছে না (কুয়েরি আর্গুমেন্ট তো যোগই হচ্ছে না, পাবে কিভাবে)। সেজন্য ইউআরএল-এ <code>&amp;paged</code> প্যারামিটারের ভ্যালু পাবার জন্য আমরা <code>$_GET</code> মেথড ব্যবহার করতে বাধ্য হচ্ছি, যেমনটা Milo শিখালেন।</p>



<p>এবারে সব পেজিনেশনের জন্য যেমন কিছু ছোটখাটো বিষয় বানিয়ে নেয়া লাগে এখানেও তাই করা হচ্ছে, আমরা বলে নিচ্ছি:</p>



<p><code>$nextpage = $paged + 1;</code></p>



<p>আর আমরা আগের পাতা দেখানোর জন্য তৈরি করেছি:</p>



<p><code>$prevpage = max( ($paged - 1), 0 );</code></p>



<p>খুব সোজা, পরের পাতা মানে ১ যোগ, আর আগের পাতা মানে ১ বিয়োগ। কিন্তু এভাবে যাতে নেগেটিভ মানে না চলে যায়, তাই আমরা পিএইচপি&#8217;র <code>max()</code> ফাংশন ব্যবহার করেছি।</p>



<p>ধরা যাক আমাদের কুয়েরিটা এরকম:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/2b7fd2d092bca527e521eb51079dfc72">Gist</a>.
</div></figure>



<p>এখানে আমরা posts_per_page প্যারামিটারে ওয়ার্ডপ্রেসের নিজস্ব Settings &gt; Reading-এ সেট করা পাতা-প্রতি পোস্টের সংখ্যা ব্যবহার করছি। আমরা তাই বারবার কুয়েরি না করে ফাংশনেও এই সংখ্যাটা নিয়ে নিচ্ছি। যদি আপনার ক্ষেত্রে ব্যতিক্রম কিছু থেকে থাকে, আপনি চাইলে পেজিনেশন <code>$posts_per_page = 5</code> এরকম করে আপনার ভ্যালুও পাস করে দিতে পারেন। যদি ফাংশনে <code>$items_per_page</code>-এ কোনো ভ্যালু না দেয়া হয়, তাহলে আমরা ওয়ার্ডপ্রেসের ডিফল্টটা গ্রহণ করেছি ফলব্যাক হিসেবে। লক্ষ রাখুন, <code>$paged</code> প্যারামিটারে <code>get_query_var()</code>-এর বদলে <code>$_GET</code> মেথড ব্যবহার করেছি।</p>



<p>এবারে এই হচ্ছে আমাদের পেজিনেশন ফাংশন:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/2b7fd2d092bca527e521eb51079dfc72">Gist</a>.
</div></figure>



<p>আর, এই ফাংশনকে আমরা এভাবে ব্যবহার করতে পারবো:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/2b7fd2d092bca527e521eb51079dfc72">Gist</a>.
</div></figure>



<p>এখানে আমাদের মতো করে আমরা পেজিনেশন প্যারামিটারগুলো পাঠাতে পারছি। এবং সর্বোপরি, আমরা কততম পাতায় আছি, Next Page, Previous Page, Last Page, First Page ইত্যাদি বোতামও পাচ্ছি, প্যাজিনেশনকে প্রয়োজনমতো ব্যবহার করার জন্য।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano.png"><img decoding="async" width="1024" height="435" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-1024x435.png" alt="অ্যাডমিন পাতায় $wp_query'র জন্য নিজস্ব পেজিনেশন" class="wp-image-1041" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-1024x435.png 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-300x127.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano-768x326.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/06/admin-page-wp-query-custom-pagination-tutsnano.png 1111w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">অ্যাডমিন পাতায় $wp_query&#8217;র জন্য নিজস্ব পেজিনেশন</figcaption></figure></div>


<p>সুতরাং, বুঝে নিয়ে ব্যবহার করতে নেই মানা। কোনো ভুল থাকলে জানানোর অনুরোধ। আর ভালো লাগলো কিনা, কিংবা আসল কথা, কাজে লাগলো কিনা, নিচে মন্তব্য করে জানাতে ভুলবেন না। আর কাজে লাগলে, শেয়ার করে সবাইকে জানাতেও ভুলবেন না।</p>



<p><strong>মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<p><span style="color: #999999;">_____________________________</span></p>



<h3>কৃতজ্ঞতা</h3>



<p>কৃতজ্ঞতা জানাচ্ছি <span class="pl-s1"><span class="pl-c">Christine Cooper</span></span> এবং Milo-কে, তাঁদের দেয়া <a href="http://wordpress.stackexchange.com/a/175649/22728">পরামর্শ আর স্নিপেটের^</a> উপর ভিত্তি করে এখানে একটা কার্যোপযোগী মার্জিত সংস্করণ যোগ করা হয়েছে মাত্র।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/">অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>কোড স্নিপেট: পাবলিক আইপি ঠিকানা ফিল্টার করে কন্টেন্ট দেখান</title>
		<link>https://mayeenulislam.github.io/tuts/filtering-public-ip-address/</link>
					<comments>https://mayeenulislam.github.io/tuts/filtering-public-ip-address/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Fri, 25 Mar 2016 17:27:10 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[পিএইচপি টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1016</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/filtering-public-ip-address/">কোড স্নিপেট: পাবলিক আইপি ঠিকানা ফিল্টার করে কন্টেন্ট দেখান</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>কেউ একজন গুগল অ্যাডসেন্স অ্যাকাউন্ট অনুমোদিত হবার পর, নিজেদের সাইটে সক্রিয় করেছেন। কিন্তু তিনদিনের মাথায় &#8216;ইনভ্যালিড ক্লিক&#8217;-এর কারণে তাঁর অ্যাকাউন্টটা আজীবনের জন্য রহিত (ব্যান) হয়ে যায়। কারণ হিসেবে তাঁরা যা <em>আন্দাজ</em> করছেন যে, <em>হয়তো</em> নিজেদের একই পাবলিক আইপি ঠিকানা থেকে একাধিক ক্লিকই হয়তো তাঁদের অ্যাকাউন্টটা ব্যান করে দিয়েছে। এটা হতে পারে, যখন একই ইন্টারনেট সংযোগ ব্যবহার করে একাধিক কম্পিউটার দিয়ে একাধিক ব্যবহারকারী ইন্টারনেট ব্যবহার করেন। তখন গুগল ঐ ব্যক্তিদের ক্লিককে সেই ব্যক্তিরই ক্লিক বলে ধরে নেবে, যিনি অ্যাডসেন্স অ্যাকাউন্টটা তৈরি করেছেন &#8211; সোজা বাংলায় তিনি [নিজে না করলেও ঘটনাটা এরকম দাঁড়াবে] নিজেই নিজের বিজ্ঞাপনে ক্লিক করেছেন।</p>



<p>আচ্ছা, এটা একটা ঘটনা হতে পারে, কিন্তু এরকম অনেক ঘটনাই দেখা দিতে&nbsp;পারে, যখন আপনি কোনো কোনো কন্টেন্ট নির্দিষ্ট কিছু আইপি ঠিকানার ব্যবহারকারীদের দেখাতে চান না। এই কোড স্নিপেটটি (<em>তাবিজ!</em> 🙂 ) আপনাকে রক্ষা করবে ইনশাল্লাহ:</p>



<span id="more-1016"></span>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/6310d09474196feb1749">Gist</a>.
</div></figure>



<p>পিএইচপি দিয়ে আইপি ট্র্যাক করার ফাংশনের বহু সংস্করণ আছে, আমি আসলে এই ফাংশনটাকে অধিকাংশ সময় কার্যকরী পেয়েছি (মাঝে মাঝে অবশ্য ব্যর্থও হয়)। আর, এরই সাথে আরেকটা ফাংশন বানিয়ে নিয়েছি&nbsp;যার ভিতরে অ্যারে আকারে আমরা যেসব আইপি বাধা দিতে চাচ্ছি সেগুলো উল্লেখ করে দিয়েছি (একটি থাকলে একটি, একাধিক হলে একাধিক)। ফাংশনটি&nbsp;বাধা দেয়া (ব্লক করা) এক/একাধিক আইপি ঠিকানার মধ্যে ভিযিটকারীর আইপি ঠিকানা মিলিয়ে দেখবে, যদি মিলে যায়, তাহলে&nbsp;<code>false</code>&nbsp;রিটার্ন করবে, আর না মিললে উল্টোটা।</p>



<p>আর ফাংশনটা এভাবে ব্যবহার করা যাবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/6310d09474196feb1749">Gist</a>.
</div></figure>



<h3>ওয়ার্ডপ্রেসে ব্যবহারবিধি</h3>



<ul>
<li>থিমের জন্য: আপনি ফাংশন দুটোকে থিমের&nbsp;<code>functions.php</code>-তে বসিয়ে নিয়ে থিমের সর্বত্র ব্যবহার করতে পারবেন।</li>



<li>প্লাগইনের জন্য: আপনি ফাংশন দুটোকে প্লাগইনের যেকোনো ফাইলে&nbsp;বসিয়ে নিয়ে প্লাগইন এমনকি থিমের&nbsp;সর্বত্র ব্যবহার করতে পারবেন।</li>
</ul>



<p>&#8211; <strong>মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/filtering-public-ip-address/">কোড স্নিপেট: পাবলিক আইপি ঠিকানা ফিল্টার করে কন্টেন্ট দেখান</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/filtering-public-ip-address/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</title>
		<link>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/</link>
					<comments>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Tue, 01 Mar 2016 17:14:57 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[মাল্টিসাইট টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=894</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/">ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center has-background" style="background-color:#c2ecdb">A brief <strong>English version </strong>of this article is available at this <a rel="noreferrer noopener" href="http://wordpress.stackexchange.com/q/219271/22728" target="_blank">WordPress Development StackExchange thread</a></p>



<p>ওয়ার্ডপ্রেসে আমরা সচরাচর একক সাইট পরিচালনা করি, অর্থাৎ সেখানে একটা ইন্সটলেশনে একটাই সাইট চলে। কিন্তু ওয়ার্ডপ্রেস তার একটা ইন্সটলেশনে একাধিক সাইট চালানোরও একটা সুযোগ দিয়ে রেখেছে, আর তা হলো ওয়ার্ডপ্রেস মাল্টিসাইট। প্রথমদিকে ওয়ার্ডপ্রেস মাল্টিসাইট WordPress MU নামে কাজ শুরু করলেও তা পরবর্তিতে ওয়ার্ডপ্রেস কোর-এ অন্তর্ভুক্ত করা হয়। এবং বলা যায়, সবচেয়ে বড় ওয়ার্ডপ্রেস মাল্টিসাইট ইন্সটলেশন হচ্ছে WordPress.com, যেখানে আপনি চাইলেই বিনামূল্যে একটা ব্লগ খুলে ফেলতে পারেন।</p>



<p>ওয়ার্ডপ্রেস মাল্টিসাইট তুলনামূলক কম জনপ্রিয় এবং এর রিসোর্সও কম পাওয়া যায়, কারণ এর ব্যবহারকারী কম। আবার, যেহেতু মাল্টিসাইটের আর্কিটেকচার ভিন্ন, তাই অনেক প্লাগইনই ওয়ার্ডপ্রেস মাল্টিসাইটে চলে না। কিংবা হয়তো&nbsp;অধিকাংশ মানুষই এই ভিন্ন আর্কিটেকচারের সুযোগটা নিতে জানেন না। আপনার একাধিক ভাষায় ওয়েবসাইট দরকার, সাবডোমেইন কিংবা সাবফোল্ডার করে সেখানে একাধিক ওয়ার্ডপ্রেস ইন্সটল করেই আপনি কাজ সেরে ফেলছেন &#8211; এরকম ঘটনা অহরহ ঘটে। কিন্তু যিনি এই সুবিধাটা সম্পর্কে ওয়াকিবহাল, এবং চ্যালেঞ্জটা নিতে আগ্রহী, তিনি আসলে সুযোগটা নিতে চান, এবং তখনই ওয়ার্ডপ্রেসের মাল্টিসাইট বা একই ওয়ার্ডপ্রেসে একাধিক আলাদা সত্ত্বার সাইটের জন্ম হয়।</p>



<p>যাহোক, এবারে মূল কথায় আসা যাক-</p>



<h3>মাল্টিসাইটের রেজিস্ট্রেশন পাতা</h3>



<p>কিন্তু ওয়ার্ডপ্রেসে মাল্টিসাইট ইন্সটল করা হলে খুব বিরক্তি উদ্রেক করে যে ব্যাপারটা, তা হলো এর ব্যবহারকারী রেজিস্ট্রেশন পাতাটা। সাধারণত ওয়ার্ডপ্রেস সিঙ্গেল সাইটের রেজিস্ট্রেশন পাতাটা পাওয়া যায় এই ঠিকানায়:</p>



<pre class="wp-block-preformatted">https://example.com/wp-login.php?action=register</pre>



<p>আপনি যদি একটা ওয়ার্ডপ্রেস ইন্সটলেশন ফোল্ডার খুলে দেখেন, তাহলে রুট ফোল্ডারেই (অর্থাৎ যেখানে সাধারণত <code>wp-config.php</code> ফাইলটা থাকে) <code>wp-login.php</code> নামে একটা ফাইল দেখবেন, এটাই সেটা।</p>



<p>কিন্তু ওয়ার্ডপ্রেস মাল্টিসাইট এই পাতা থেকে রেজিস্ট্রেশন করে না। মাল্টিসাইট ইন্সটল করা হলে তখন রেজিস্ট্রেশন পাতা হয় এই ঠিকানায়:</p>



<pre class="wp-block-preformatted">https://example.com/wp-signup.php</pre>



<p>যেখানে এইমাত্র <code>wp-login.php</code> ফাইলটা দেখেছেন, সেখানেই আপনি <code>wp-signup.php</code> ফাইলটাও পাবেন। যখনই আপনি &#8220;নিবন্ধন&#8221; (Register/ Sign up) লেখা কোনো লিংকে ক্লিক করবেন, ওয়ার্ডপ্রেস মাল্টিসাইট আপনাকে এই সাদামাটা পাতাটায় নিয়ে আসবে, যা অনেকেই পছন্দ করেন না।</p>



<p>এই পাতাটা অপছন্দ করার কারণগুলোর মধ্যে অন্যতম হলো এর মধ্যে কোনো স্টাইল করা থাকে না। আর দ্বিতীয়ত হলো, এই পাতায় যা যা ত্রুটি কিংবা সফলতার বার্তা দেখায়, সেগুলোকে ফিল্টার করে বদলে নেয়া যায় না। এজন্যই বিকল্প খোঁজা&#8230;</p>



<p>আজকে আমরা এই পাতাটিকে পাল্টে ফেলে নিজস্ব একটি সাইনআপ পাতা এর জায়গায় বসিয়ে দিতে হয় কিভাবে, তা-ই দেখবো। মনে রাখতে হবে, এজন্য আমরা যে কাজগুলো করছি না:</p>



<ul>
<li>আমরা <code>.htaccess</code> ফাইলে কোনো হাত দিচ্ছি না,</li>



<li>আমরা আলাদা কোনো প্লাগইন ব্যবহার করছি না, এবং</li>



<li>অতি অবশ্যই আমরা ওয়ার্ডপ্রেসের কোনো কোর ফাইলে হাত দিচ্ছি না</li>
</ul>



<span id="more-894"></span>



<h3>নিজস্ব সাইনআপ পাতা</h3>



<p>এই জ্ঞানার্জনে প্রাথমিকভাবে সহায়তা নিয়েছিলাম নিচের দুটি পাতার:</p>



<ol>
<li><a href="https://www.chriswiegman.com/2010/02/using-a-custom-wp-signup-page-with-wordpress-mu/" target="_blank" rel="noopener">Using a Custom wp-signup Page With WordPress MU^</a> &#8211; <em>Chris Wiegman</em></li>



<li><a href="https://wordpress.org/support/topic/individual-mu-registration-page-possible?replies=7#post-1711143" target="_blank" rel="noopener">individual MU Registration Page possible?^</a> &#8211; <em>David Sader</em></li>
</ol>



<p>কিন্তু এই দুটো রিসোর্স সম্পূর্ণ ছিল না, এবং কোনো কোনো ক্ষেত্রে তাতে ত্রুটি (bug) ছিল। তাই এসময় আমাকে আন্তরিকতার সাথে সহায়তা করেছেন কিংবা সত্যি বলতে কি পথ দেখিয়েছেন জার্মানির <a href="https://twitter.com/thefuxia" target="_blank" rel="noopener">@thefuxia</a> (Thomas Scholz) এবং অচেনা&nbsp;majick।</p>



<p>এই আলোচনার আগে ধরে নিচ্ছি আপনাদের ওয়ার্ডপ্রেস ইন্সটলেশনে:</p>



<ul>
<li>মাল্টিসাইট ইন্সটল করা রয়েছে,</li>



<li>সার্ভারে mod_rewrite মড্যুল সক্রিয় আছে, এবং</li>



<li>আপনার ওয়ার্ডপ্রেসের পার্মালিংক ডিফল্ট বা পূর্বনির্ধারিত পার্মালিক নয়</li>
</ul>



<h4><strong>ধাপ ১: নিজস্ব সাইনআপ পাতাটা তৈরি</strong></h4>



<p>চাকা একবার আবিষ্কার হয়ে গেছে, কেন আবার আবিষ্কার করবো? তাই আমরা ওয়ার্ডপ্রেস কোর থেকে <code>wp-signup.php</code> পাতাটা কপি করে আমাদের থিমের (কিংবা চাইল্ড থিমের) ভিতরে রাখি। এটার নামটা পাল্টে ফেলি যাতে স্বকীয়তা প্রকাশ পায়, ধরা যাক দিলাম: <code>signup.php</code>।</p>



<p>এবারে ফাইলটা কোনো টেক্সট এডিটরে খুলি: এই ফাইলে উপরের দিকে দুটো ফাইল লোড করা আছে, লাইন দুটো হলো:</p>



<pre class="wp-block-preformatted">require( dirname(__FILE__) . '/wp-load.php' );</pre>



<p>এবং</p>



<pre class="wp-block-preformatted">require( dirname( __FILE__ ) . '/wp-blog-header.php' );</pre>



<p>এই লাইন দুটো বন্ধ করে দেয়া যাক, মানে কমেন্ট আউট করে দেই। ফলে লাইন দুটো হয়ে গেল:</p>



<pre class="wp-block-preformatted">// require( dirname(__FILE__) . '/wp-load.php' );</pre>



<p>এবং</p>



<pre class="wp-block-preformatted">// require( dirname( __FILE__ ) . '/wp-blog-header.php' );</pre>



<p>কেন বন্ধ করলাম? &#8230;কারণ হলো, এতক্ষণ <code>wp-signup.php</code> ফাইলটা রুট থেকে লোড হচ্ছিল (থিম লোড হবারও আগে), তখনও ওয়ার্ডপ্রেসের কোনো ফাংশন লোড হয়নি। আর এখন এটাকে থিমের ভিতরে নিয়ে আসার মানে হচ্ছে, থিম যখন লোড হবে তখন এটার অস্তিত্ব প্রকাশ পাবে, এর আগে না। আর থিম যখন লোড হবে তখন ওয়ার্ডপ্রেসের <code>wp-load.php</code> আর <code>wp-blog-header.php</code> দুটো ফাইলই লোড হয়ে যাবে। সুতরাং আবারও ফাইল দুটো লোড করা মানেই পুণর্বার কাজ করা (repeat), এবং কখনও Repeat করা যাবে না (DRY &#8211; Don&#8217;t Repeat Yourself)।</p>



<p>এই ফাইলের আরো দুটো লাইন আছে:</p>



<pre class="wp-block-preformatted">get_header( 'wp-signup' );</pre>



<p>এবং, একেবারে নিচে:</p>



<pre class="wp-block-preformatted">get_footer( 'wp-signup' );</pre>



<p>এই লাইন দুটোকে বদলে আমাদের থিমের হেডার কিংবা নিজস্ব কোনো ব্যতিক্রম হেডার কল করে দেয়া যেতে পারে। আমি আমার থিমে, সাইনআপ পাতার জন্য আলাদা একটি হেডার বানিয়েছি (<code>header-null.php</code>), তাই আমি সেটা যোগ করেছি এপর্যায়ে। তাই, আমার ক্ষেত্রে ব্যাপারটা ছিল:</p>



<pre class="wp-block-preformatted">get_header( 'null' ); //instead of get_header( 'wp-signup' );</pre>



<p>এবং</p>



<pre class="wp-block-preformatted">get_footer( 'null' ); //instead of get_footer( 'wp-signup' );</pre>



<p>ব্যস, আমাদের নিজস্ব সাইনআপ পাতা কিন্তু প্রস্তুত। এবারে এই ফাইলটাকে জায়গামতো কল করিয়ে দিলেই <em>কেল্লা ফতে</em>।</p>



<h4><strong>ধাপ ২: এমইউ প্লাগইন তৈরি</strong></h4>



<p><a href="https://codex.wordpress.org/Must_Use_Plugins" target="_blank" rel="noopener">MU Plugin</a>, এতক্ষণে বুঝে গেছি নিশ্চয়ই, এটা মাল্টিসাইটের সাথে সম্পর্কিত। আসলে এটা মাল্টিসাইটের সাথে সম্পর্কিত ছিল। পরবর্তিতে এর <a href="https://core.trac.wordpress.org/changeset/10737" target="_blank" rel="noopener">প্রয়োজন এখন আর তেমন একটা হয় না</a> বললেই চলে। আর এখানে MU মানে Multisite না, বরং Must Use, অর্থাৎ মাল্টিসাইটের সকল সাইটে আবশ্যকীয়ভাবে এই কোডগুলো লোড করার জন্যই MU Plugin ব্যবহার করা হতো। &#8230;সুতরাং, এখানে আমরা যে কোডগুলো ব্যবহার করবো, সেগুলো নিজস্ব কোনো সাধারণ প্লাগইনে বসিয়ে নিলেও কাজ করবে।</p>



<p>আমরা আমাদের মাল্টিসাইট ইন্সটলেশনের <code>wp-content/</code> ডিরেক্টরির (ফোল্ডার) ভিতরে একটা ডিরেক্টরি তৈরি করি, নাম হবে &#8216;<code>mu-plugins</code>&#8216; (যদি আমরা মাস্ট ইউয প্লাগইনের পাথ বদলে <em>না</em> থাকি)। এবারে এই ডিরেক্টরির ভিতরে একটা ফাইল তৈরি করি, যেকোনো নাম দিয়ে, ধরা যাক দিলাম, <code>mu-signup.php</code>। এবারে এই ফাইলটার মধ্যে লিখি:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>কোডগুলো বুঝে নেয়া যাক, প্রথম ফাংশনটা <code>wp_signup_location</code> ফিল্টার হুকে হুক করে আসলে যা করছে, তা হলো, ওয়ার্ডপ্রেসের নিজস্ব সাইনআপের যে ইউআরএল প্রথমে আমরা বলেছিলাম, সেটাকে বদলে, আমাদের নিজস্ব যে পাথে আমরা আমাদের সাইনআপ পাতা তৈরি করতে যাচ্ছি, সেখানে ঘুরিয়ে দিবো। যেমন: লগইন পাতার নিচে যে <kbd>Register</kbd> লিংকটা আছে, সেখানে ক্লিক করলে যেন সে আমাদের নিজস্ব সাইনআপ পাতায় নিয়ে আসে, সেটা তাকে বলে দিলাম। এটা আমরা লিখেছি 12 নম্বর লাইনে যে, ওয়ার্ডপ্রেস নেটওয়ার্ক সাইটের ইউআরএল-এর পরেই signup বসালে ইউআরএল যা হবে, সেটাকেই আমাদের মাল্টিসাইটের সাইনআপ ইউআরএল হিসেবে বুঝে নিবে:</p>



<pre class="wp-block-preformatted">https://example.com/signup</pre>



<p>আর দ্বিতীয় ফাংশনটা হচ্ছে একটা <code>wp_redirect()</code>। কেউ যদি মাল্টিসাইটের নিজস্ব সাইনআপ ইউআরএল পাতার লিংক (<code>/wp-signup.php</code>) টাইপ করে, তাকেও যেন ঐ পাতা থেকে সরিয়ে আমাদের নিজস্ব সাইনআপ পাতায় (<code>/signup</code>) নিয়ে আসে। অনেকেই এই কাজটুকু <code>.htaccess</code> ফাইল এডিট করে, করে থাকেন (যেমন ক্রিস-এর প্রথম লিংকটাতে দেখতে পাবেন)। কিন্তু আমরা এই কাজটার জন্য <code>.htaccess</code> এডিট করার ঝামেলায় যাইনি।</p>



<p>অর্থাৎ, এপর্যন্ত করা হয়ে গেলে, লোকজন, ওয়ার্ডপ্রেসের পূর্বনির্ধারিত সাইনআপ পাতা না দেখে, আমাদের নিজস্ব ইউআরএল-এ চলে আসবে &#8211; এতটুকু আমরা করে ফেলেছি। (<img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f44f.png" alt="👏" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <em>হাততালি</em>)</p>



<p>বাকিটুকু আমরা দুভাবে করতে পারি:</p>



<ol>
<li>সহজ পদ্ধতি: পেজ টেমপ্লেট তৈরি করে</li>



<li>ঘাঁটাঘাঁটি পদ্ধতি: রিরাইট এন্ডপয়েন্ট তৈরি করে</li>
</ol>



<p>পছন্দটা আপনার, আপনি কিভাবে করতে চান&#8230; তবে দুটোই করা যাবে না। যেকোনো একটা।</p>



<h4><strong>ধাপ ৩: সহজ পদ্ধতি: পেজ টেমপ্লেট তৈরি:</strong></h4>



<p>আমরা থিমের ভিতরে যে <code>signup.php</code> ফাইলটা [ওয়ার্ডপ্রেস কোর থেকে কপি করে] বানিয়েছিলাম, সেটা টেক্সট এডিটরে খুলে এক্কেবারে উপরে আমরা কিছু কথা লিখি, যাতে এটা একটা <a href="https://developer.wordpress.org/themes/template-files-section/page-template-files/#creating-custom-page-templates-for-global-use" target="_blank" rel="noopener">পেজ টেমপ্লেট^</a> হয়ে যায়:</p>



<pre class="wp-block-preformatted">&lt;?php
/**
* Template name: tuts nano signup
*/</pre>



<p>পাতার এক্কেবারে উপরে একটা পিএইচপি শুরুর ট্যাগ দিয়ে শুরু হয়েছে, সেটার ঠিক পরেই এই কথাটা লিখে দেয়া যাক। আপনাদের যা ইচ্ছা নাম দিতে পারেন, তবে বোধগম্য এবং অবিরোধপূর্ণ নাম দিবেন আশা করি। সংরক্ষণ করুন ফাইলটা।</p>



<p>এবারে, ওয়ার্ডপ্রেসের অ্যাডমিন প্যানেলে একটা পাতা তৈরি করি, যার নাম দিই Signup এবং slug হিসেবে দিই <code>signup</code>। এবারে পেজ টেমপ্লেট হিসেবে মাত্র তৈরি করা tuts nano signup [কিংবা আপনাদের দেয়া নামের] টেমপ্লেটটা বাছাই করে দিন। পাতাটা সংরক্ষণ করুন।</p>



<p>কাজ শেষ। 🙂</p>



<p><strong>ধাপ ৩: ঘাঁটাঘাঁটি পদ্ধতি: রিরাইট এন্ডপয়েন্ট তৈরি:</strong></p>



<p>বলেছি যেকোনো একটা পদ্ধতি করতে। যদি &#8216;সহজ পদ্ধতি&#8217; করে ফেলেন, তাহলে আগের অবস্থায় ফেরত যান, যা করেছেন মুছে ফেলুন, এবারে এই পদ্ধতিতে করে দেখা যাক:</p>



<p>একাজে আমাদেরকে সহায়তা করতে পারবে এই ডিবাগিং প্লাগইনটি:</p>



<ul>
<li><a href="https://wordpress.org/plugins/rewrite-rules-inspector/" target="_blank" rel="noopener"><strong>Rewrite Rules Inspector</strong>^</a> &#8211; WordPress.org Plugins, <em>Daniel Bachhuber</em> and his team</li>
</ul>



<p>ইন্সটল করে সক্রিয় করে নেয়া যেতে পারে। না করলেও ক্ষতি নেই। কিন্তু কী ঘটছে, কিভাবে ঘটছে, দেখলেই না শেখা হয়&#8230;। এবারে আমাদের থিমের <code>functions.php</code>-তে এই কোডগুলো বসিয়ে নেয়া যাক:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>প্রথম ফাংশনটা দিয়ে আমরা একটা এন্ডপয়েন্ট যোগ করছি, মানে ইউআরএল-এর শেষে একটা লেজ যোগ করছি। এই লেজটাতো হাতে লিখেই যোগ করা যায়, যেমন: <code>example.com/kauwa</code>; হ্যা, ঠিক, কিন্তু আসলে এই লেজ, সেই লেজ না। এই লেজটা ডায়নামিকভাবে প্রোগ্রামের মাধ্যমে কাজ করবে &#8211; ওয়ার্ডপ্রেসের কাছে এর একটা অর্থ থাকবে। আমরা যে লেজটা যোগ করেছি, তা হলো: signup। অর্থাৎ, আমাদের ডোমেইন নামের শেষে লেজটা যোগ হয়ে ডায়নামিক ইউআরএলটা হবে:</p>



<pre class="wp-block-preformatted">https://example.com/signup</pre>



<p>যেহেতু রিরাইট র&#x200d;্যুল ফ্লাশ না করলে নতুন মান নিবে না, তাই হাসিন হায়দার&nbsp;ভাইয়ের অনুকরণে, আমরা একবার, হ্যা, একবার রিরাইট র&#x200d;্যুলটা ফ্লাশ করেছি। এটা ম্যানুয়ালিও করা যায়, সেটা পরে বলছি।</p>



<p>এবারে দ্বিতীয় ফাংশনটা দিয়ে আমরা বলে দিচ্ছি যে, যখন তোমার ইউআরএল থেকে query_variable হিসেবে &#8216;signup&#8217; পাবে, তখন যে টেমপ্লেট তুমি দেখাবে বলে ঠিক করেছিলে, সেটার বদলে তুমি আমাদের বলে দেয়া টেমপ্লেটটা দেখাবে। এবং আমরা, ঐ যে, প্রথমে কোর থেকে কপি করে ফাইলটা তৈরি করেছিলাম, সেই ফাইলটার পাথ, ফাংশনটার ভিতরে দেখিয়ে দিয়েছি।</p>



<p>ব্যস, কাজ শেষ। আমরা, পূর্বনির্ধারিত পাতা থেকে ব্যবহারকারীদের আমাদের পাতায় রিডিরেক্ট করে নিয়ে এসেছি। ওয়ার্ডপ্রেসের নিবন্ধন ইউআরএল বদলে দিয়েছি। আমাদের কাঙ্ক্ষিত প্যারামিটার (লেজ) যোগ করেছি। এবং সেই লেজে গেলে যে আমাদের তৈরি করা ফাইলটা দেখাবে তাও বলে দিয়েছি। সুতরাং এবারে পরীক্ষা করে দেখাই যায়, কী করেছি আমরা। ব্রাউযারে টাইপ করুন আপনার নির্ধারিত সাইনআপ পাতার ইউআরএল:</p>



<pre class="wp-block-preformatted">https://example.com/signup</pre>



<p>দুঃখিত! কাজ করছে না। হয় 404 টেমপ্লেট দেখাচ্ছে, নয়তো প্রথম পাতায় নিয়ে গেছে। কেন হচ্ছে এমন? সব তো ঠিকই আছে। আপনি ঠিকই <code>/signup</code> লেজও যোগ করেছেন।</p>



<p><span style="text-decoration: underline;"><strong>রিরাইট র&#x200d;্যুল্‌স ফ্ল্যাশ করা:</strong></span> এই অবস্থায় দেখা না যাওয়ার একটা কারণ হতে পারে আপনার রিরাইট র&#x200d;্যুল্‌স ফ্লাশ করা হয়নি। এজন্য যেটা করতে হবে, যে প্লাগইনটা ইন্সটল করতে বলেছিলাম, সেটাতে গেলেই উপরে ডানে <kbd>Flush Rules</kbd> বোতাম চেপে কাজটা করা যায়। আর যদি প্লাগইনটা ইন্সটল না করে থাকেন, সেক্ষেত্রে Settings » Permalinks-এ গিয়ে কোনো পরিবর্তন না করে একবার সংরক্ষণ বোতাম চাপুন।</p>



<p>তবু দেখা যাচ্ছে না, তাই না? লেজের পরে আরেকটা লেজ লাগালে কী হয়, দেখি তো? লিখলাম: <code>example.com/signup/asd</code>, এবং নিমিষেই আমাদের কাঙ্ক্ষিত টেমপ্লেটটা লোড হয়ে গেল।</p>



<p>সমস্যাটা আসলে অন্য জায়গায়, এবং একটা সমস্যা ঠিকই আছে।</p>



<p><span style="text-decoration: underline;"><strong>ঐচ্ছিক:</strong></span> পরীক্ষা করার জন্য, দ্বিতীয় ফাংশনটার ভিতরে <code>if(!is_admin()) {</code> লেখাটার ঠিক আগে লিখুন: <code>echo get_query_var('signup');</code> এবং ফাইলটা সংরক্ষণ করে এসে রিফ্রেশ করে দেখুন তো কিছু দেখা যায় কিনা ব্রাউযারে। টেমপ্লেটটার উপরে asd লেখাটা দেখাচ্ছে। এর মানে, <code>?signup=asd</code> ভ্যালুটা দেখাচ্ছে। যদি আমরা <code>asd</code> মুছে ফেলি, তাহলে আবারও 404 কিংবা প্রথম পাতা দেখাচ্ছে এবং কোনো লেখা ইকো হচ্ছে না। অর্থাৎ query_variable-টা কোনো মান পাচ্ছে না। <em>echo &#8230;</em> লেখাটুকু মুছে ফেলি, আমাদের পরীক্ষা শেষ।</p>



<p>কারণটা হলো:</p>



<blockquote class="wp-block-quote">
<p>যেহেতু <code>add_rewrite_endpoint()</code> তার প্যারামিটারের মান প্রত্যাশা করছে, অথচ আমরা কোনো মান দিচ্ছি না, সে আসলে <code>null</code>&nbsp;মানকে&nbsp;<code>false</code> হিসেবে ধরে নিচ্ছে। অবস্থাটা দাঁড়াচ্ছে: <code>example.com?signup=false</code>। এমতাবস্থায় কোনো টেমপ্লেট লোড করার প্রশ্নই উঠে না। এই সমস্যাটার সমাধান করতে আমাদেরকে <code>request</code>-এ হুক করে ওর জন্য একটা মান সেট করে দিয়ে আসতে হবে। (<a href="https://www.pmg.com/blog/a-mostly-complete-guide-to-the-wordpress-rewrite-api/" target="_blank" rel="noopener">ব্যাখ্যার উৎস^</a>)</p>
</blockquote>



<p>Thomas Scholz বলছেন, এটা ওয়ার্ডপ্রেসের রিরাইট এপিআই-এর একটা ত্রুটি (bug)।</p>



<p>যাহোক, এর সমাধানও আছে। সমাধান, যেমনটা ক্রিস্টোফার ড্যাভিস বলেছেন, এর সমাধান করতে নিচের কোডটুকু <code>functions.php</code>-তে যোগ করে নিতে হবে, এতে মানটা আর <code>false</code> আসবে না, বরং <code>true</code> আসবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>&#8230;এবং আমাদের কাঙ্ক্ষিত টেমপ্লেটও লোড হবে।</p>



<h4><strong>ধাপ ৪: বার্তাগুলো দেখানোর ব্যবস্থা</strong></h4>



<p>সব সুন্দর মতো হয়ে গেলেও আরো একটা ছোট্ট কাজ বাকি আছে। আপনি যখন এই সাইনআপ ফর্মে কোনো কিছু না লিখে <kbd>পরবর্তি</kbd> (<kbd>next</kbd>)&nbsp;বোতামে ক্লিক করবেন, তখন কিন্তু সাইনআপও হবে না আবার কোনো ত্রুটি বার্তাও দেখাবে না। এর কারণ, ফর্মটা সাবমিট হচ্ছে <code>wp-signup.php</code> পাতায়, আর সেখানেই ত্রুটি বার্তা দেখাচ্ছে, আর আমরা সেখান থেকে <code>wp_redirect()</code> চালিয়ে ব্যবহারকারীকে আমাদের পাতায় ঘুরিয়ে আনছি, ফলে ত্রুটি বার্তাগুলো হারিয়ে যাচ্ছে।</p>



<p>খুব ছোট্ট একটা ফিক্স দরকার। আমরা যে <code>signup.php</code> ফাইলটা বানিয়েছিলাম নিজের মতো করে, সেই ফাইলটাতে থাকা তিনটা <code>&lt;form&gt;</code> ট্যাগের সাবমিশন অ্যাকশন অংশটা বদলে দিতে হবে। ফাইলের মধ্যে অনুসন্ধান করতে পারেন:&nbsp;<code>action="wp-signup.php"</code> লিখে। তাহলে ফর্ম ট্যাগগুলোর <code>action="wp-signup.php"</code>-এর জায়গায় লিখা যাক:</p>



<pre class="wp-block-preformatted">action=""</pre>



<p>অথবা লেখা যাক:</p>



<pre class="wp-block-preformatted">action="&lt;?php echo esc_url($_SERVER['REQUEST_URI']); ?&gt;"</pre>



<p>ব্যস। কাজ শেষ। এতে আমাদের ফর্মটা এই পাতায়ই সাবমিট হবে এবং ত্রুটি কিংবা সফলতার বার্তাও সে অনুযায়ী দেখাবে। আমাদের কাজ শেষ এবং আমরা সফল।</p>



<h3><strong>স্ক্রিপ্ট&nbsp;যোগ করা</strong></h3>



<p>ওয়ার্ডপ্রেসের পূর্বনির্ধারিত সাইন-আপ পাতা বদলানোর মূল কারণই হলো এর চেহারা। তাই এই নতুন তৈরি পাতায় কিছু স্টাইলিং দেয়া লাগতেই পারে কিংবা কোনো জাভাস্ক্রিপ্ট ভ্যালিডেশন দেয়া লাগতে পারে। সেজন্য ওয়ার্ডপ্রেসের ফ্রন্ট এন্ডে যেভাবে স্টাইলশিট কিংবা স্ক্রিপ্ট যোগ করি আমরা, সেভাবেই স্টাইল করা যেতে পারে। কিংবা সরাসরি ফ্রন্টএন্ডের স্টাইলশিটেও (<code>style.css</code>) স্টাইল করা যেতে পারে। খুবই সহজ:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/3e332efd44a3388034c3">Gist</a>.
</div></figure>



<p>এবারে আপনার স্টাইলশীটে (<code>nanotuts-signup-styles.css</code>) নিজের মতো করে স্টাইল করুন। আপনি বুঝবেন, তবু বলে রাখছি: কন্টেইনারের ক্লাস&nbsp;<code>.mu_register</code> &nbsp;আর ফর্মের আইডি হচ্ছে <code>#setupform</code>। এছাড়া আমাদের তৈরিকৃত <code>signup.php</code> পাতায়&nbsp;<code>wpmu_signup_stylesheet()</code> ফাংশনে দেখবেন কিছু ইন্টার্নাল সিএসএস করা। সেগুলো, প্রয়োজনমতো কাটছাঁট করতেই পারেন এখন।</p>



<p>এবারে এগুলো ধরে&nbsp;অন্তর্বর্তি এলিমেন্টগুলোর জন্য স্টাইল করে নিলেই সব ফকফকা। 🙂</p>



<h3>প্লাগইন না থিম</h3>



<p>আমরা পুরো ব্যাপারটা প্লাগইন আর থিমের একটা ভজকট করেছি। আপনি চাইলে পুরো ব্যাপারটা একটা নিজস্ব প্লাগইনে করে ফেলতে পারেন। কিংবা এমনও হতে পারে, এই জ্ঞানটুকু কাজে লাগিয়ে, বুদ্ধি করে একটা পূর্ণাঙ্গ ডায়নামিক প্লাগইনই বানিয়ে ফেললেন, আর ক&#8217;দিন বাদে আমরা আর এতো বড় নিবন্ধ না দেখিয়ে মানুষকে বলবো, অমুক ভাই/বোন-এর তমুক প্লাগইনটা ইনস্টল করে নেন, <em>সাফা খিরখিরা</em>!&nbsp;<img src="https://s.w.org/images/core/emoji/14.0.0/72x72/270c.png" alt="✌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h3>কৃতজ্ঞতা</h3>



<p>আবারও বলছি, এইটুকুতে পথনির্দেশ করার জন্য Thomas Scholz, majick, Chris Wiegman, David Sader, Chris Davis, হাসিন হায়দার ভাই-সহ অন্যান্য সকলের আকুন্ঠ কৃতজ্ঞতা স্মরণ করছি।</p>



<p>এই লেখাটির সংক্ষিপ্ত সংস্করণ ইংরেজিতে পাওয়া যাবে <a href="http://wordpress.stackexchange.com/q/219271/22728" target="_blank" rel="noopener">WordPress Development StackExchange ওয়েবসাইটের এই থ্রেডে^</a>।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/">ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস সাইটকে গতিশীল করতে gZip Compression চালু করার পদ্ধতি</title>
		<link>https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/</link>
					<comments>https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sat, 10 Oct 2015 16:26:14 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=738</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/">ওয়ার্ডপ্রেস সাইটকে গতিশীল করতে gZip Compression চালু করার পদ্ধতি</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>ওয়ার্ডপ্রেস সাইট যারা পরিচালনা করেন, তাদের অনেকেই সাইটের গতি বৃদ্ধির নানান কৌশল জানতে চান। সত্যিকার অর্থে গতি বৃদ্ধির ব্যাপারটা অনেক কিছুর সাথে সম্পর্কযুক্ত, যেমন:</p>



<ul>
<li>আপনি যে থিম ব্যবহার করছেন, তার কোডের মান কেমন?</li>



<li>আপনি যে প্লাগইনগুলো ব্যবহার করছেন, তার কোডের মান কেমন?</li>



<li>আপনি যে সার্ভারে সাইট হোস্ট করেছেন, তার মান/গতি কেমন?</li>



<li>কিংবা আপনি যে তথ্য আপনার সাইটে রাখছেন, তা কতটা অপটিমাইজ্‌ড, মানে প্রয়োজনানুগ গুছিয়ে রাখা?</li>



<li>কিংবা আপনার সাইটে যেসব থার্ড পার্টি রিসোর্স ব্যবহার করেছেন, সেগুলো কতটা গতিশীল?</li>
</ul>



<p>&#8230;ইত্যাদি বহু কিছু। এসব বিষয়গুলো নিশ্চিত করার পরও অনেক সময় সাইটের গতি আশানুরূপ পাওয়া যায় না। আপনি যদি তখন Google-এর PageSpeed Insights, GTmetrix কিংবা Yahoo!&#8217;র YSlow ব্যবহার করে পরখ করে থাকেন, তাহলে দেখবেন, সেখানে আপনাকে বলা হচ্ছে, &#8220;Enable Compression&#8221; (কম্প্রেশন&nbsp;সক্রীয় করুন)।</p>



<h3 id="এটা খায় না মাথায় দেয়">এটা খায় না মাথায় দেয়</h3>



<p>আপনি যখন একটা ওয়েবসাইটের ঠিকানা&nbsp;লিখে এন্টার চাপেন, আপনি তখন আসলে সার্ভারকে বলেন, অমুক সাইটের তথ্যগুলো পাঠাও তো&#8230;। সার্ভার তখন সেই সাইটের তথ্যগুলো আপনাকে পাঠাতে থাকে। 10 মেগাবাইট ডাটা থাকলে, সে 10 মেগাবাইট ডাটা আপনাকে পাঠিয়ে দেয়, আপনি তখন সাইটটা দেখতে পারেন। যদি gZip Compression চালু করা থাকে, তাহলে যা ঘটবে: আপনি সার্ভারকে বলবেন, সাইটের ডাটা পাঠাও&#8230; সে তখন দেখবে সাইটে 10 মেগাবাইট ডাটা আছে, সে সেটাকে কম্প্রেস করবে, মানে যিপ&nbsp;করবে, মানে গুটিয়ে নিবে, এতে ডাটার আকার কমে আসবে মাত্র 3 মেগাবাইটে, অর্থাৎ সার্ভার তখন আপনার ব্রাউযারে পাঠাবে 10 মেগাবাইটের বদলে মাত্র 3 মেগাবাইট&#8230; কতটা দ্রুত হয়ে যাবে সাইট বুঝতেই পারছেন। বাকি কাজটা হবে এবার আপনার ব্রাউযারে&#8230; ব্রাউযার সেই কম্প্রেস করা&nbsp;ফাইলটা পেয়ে সেটাকে আনকম্প্রেস/ডিকম্প্রেস করবে, মানে আনযিপ করবে, পোটলা খুলবে, তারপর আপনাকে সাইটটা দেখিয়ে দিবে। &#8230;এভাবে gZip কম্প্রেশন আপনার সাইট পেজের আকার ৭০% পর্যন্ত কমিয়ে আনতে পারে।</p>



<h3 id="কিভাবে কম্প্রেশন সক্রীয় করতে হয়">কিভাবে কম্প্রেশন সক্রীয় করতে হয়</h3>



<span id="more-738"></span>



<p>আমি সাধারণত Apache সার্ভার ব্যবহার করি, তাই <strong>আমার জানা সমাধানগুলো অ্যাপাচি সার্ভার-কেন্দ্রীক</strong>।</p>



<p><span style="text-decoration: underline;"><strong>জ্ঞাত পদ্ধতি ১:</strong></span>&nbsp;প্রথমদিকে মহা ফ্যাসাদে পড়লাম, কমপ্রেশন সক্রীয় করার উপায় পাচ্ছিলাম না। এমন সময় এক ব্লগে লেখা দেখলাম: ওয়ার্ডপ্রেস সাইটের অ্যাডমিন প্যানেলে লুকানো একটা সেটিং আছে: ব্রাউযারে লিখুন: <code>.../wp-admin/options.php</code> &#8211; মানে, সাইটের অ্যাডমিন প্যানেলে থেকে <code>options.php</code> পাতায় যান। এখানে&nbsp;gzipcompression নামে একটা অপশন আছে, সেটার মান <code>0</code> থেকে বদলে <code>1</code> করে দিতে হবে, মানে <code>false</code> থেকে <code>true</code> করে দিতে হবে। কিন্তু এটা ব্যবহার করে আমি কোনো সমাধান পেলাম না। আপনাদের কারো উপকার হলে, এটাই একাজে সবচেয়ে সহজ সমাধান।</p>



<p><span style="text-decoration: underline;"><strong>জ্ঞাত পদ্ধতি ২:</strong></span> পরে ওয়ার্ডপ্রেস ডেভলপমেন্ট স্ট্যাকএক্সচেঞ্জে আলোচনা করে বের করে আনলাম এর কার্যকরী পদ্ধতি: আমাকে Toscho (Thomas Scholz) জানালেন: <code>php.ini</code> ফাইলে&nbsp;<code>zlib.output_compression = On</code> চালু করলেই তা হয়ে যায়।</p>



<p>যেহেতু আমি শেয়ার্ড সার্ভার ব্যবহার করছিলাম, তাই এটাও পরখ করে দেখা হয়নি।</p>



<p><span style="text-decoration: underline;"><strong>সক্রীয় পদ্ধতি ৩:</strong></span>&nbsp;তারপর আরেকদিন আলোচনায় Rarst (Andrey “Rarst” Savchenko) আমাকে জানালেন এর <code>.htaccess</code> পদ্ধতির কথা। তিনি আমাকে অ্যাপাচি&#8217;র <a href="https://github.com/h5bp/server-configs-apache/blob/33350e37e8f9b6fa1366edf0c57adaf71df34759/dist/.htaccess#L579-L641" target="_blank" rel="noopener">কোড স্নিপেট^</a>ই সরাসরি শেয়ার করলেন। সময়ের আবর্তে এই পাতায় অনেক পরিবর্তন আসছে, আসবে। তাই লাইন নম্বর ধরে কোডটা দিলে আজ এক জায়গায় কাল আরেক জায়গায় চলে যাবে। তাই আমি শুধু প্রয়োজনীয় অংশটুকু আলাদা করে নিলাম এখানে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/a82b62102b636b159da2">Gist</a>.
</div></figure>



<p>যেটা করতে হবে, আপনার ওয়ার্ডপ্রেস সাইটের <code>.htaccess</code> ফাইলটা সম্পাদনা মোডে খুলুন (ফাইলটা ওয়ার্ডপ্রেসের র&#x200d;্যুটেই থাকে)। যদি <code>.htaccess</code> ফাইল না থাকে, ঠিক এই নাম দিয়ে একটা ফাইল তৈরি করে নিন। আগে থেকে থাকা ফাইলে কিছু কোড থাকবে, সেগুলো আগে একটা জায়গায় কপি করে <strong>ব্যাকআপ নিয়ে রাখুন</strong>। সেখানেই সবার নিচে এই কোডটুকু বসিয়ে নিন।</p>



<p>ব্যস, কাজ শেষ।</p>



<h3 id="যাচাই করুন">যাচাই করুন</h3>



<p>এবারে আসলেই সাইটে gZip কম্প্রেশন চালু হয়েছে কিনা যাচাই করে নিন <a href="http://redbot.org/" target="_blank" rel="noopener">RedBot^</a> থেকে, কিংবা <a href="https://gtmetrix.com/" target="_blank" rel="noopener">GTmetrix^</a> থেকে। আপনার সাইটের URL লিখে সাবমিট করুন, দেখিয়ে দিবে gZip কম্প্রেশন চালু হয়েছে কিনা, এবং কতটুকু গতিবৃদ্ধি পেল তাতে।</p>



<h3 id="মুদ্রার উল্টো পিঠ">মুদ্রার উল্টো পিঠ</h3>



<p>আমরা বলেছিলাম সার্ভার আমাদের ব্রাউযারে কম্প্রেস করা ফাইলটা পাঠাবে। কিন্তু আমাদের ব্রাউযার যদি জানেই না কিভাবে কম্প্রেস করা ফাইলকে ডিকম্প্রেস করতে হয়, তখন? পুরোন ব্রাউযারগুলোতে এই সমস্যা ছিল। এখন আর এটা বোধহয় সমস্যা না। তাছাড়া, যত বড় কম্প্রেস ফাইল, তত বেশি CPU-এর ব্যবহার। সুতরাং এই পারফর্মেন্স পাওয়ার পিছনে আপনার সার্ভারের সিপিইউ-এর ব্যবহারও বাড়ছে। আরো জানা যাবে <a href="https://web.archive.org/web/20180607220016/https://devcentral.f5.com/articles/i-am-wondering-why-not-all-websites-enabling-this-great-feature-gzip" target="_blank" rel="noopener">Lori MacVittie-এর এই ব্লগ (আর্কাইভ থেকে)^</a> থেকে।</p>



<p>তাই মনে রাখবেন, যদি কোনো সমস্যা হয়, তাহলে আপনার <code>.htaccess</code>, যা ব্যাকআপ রেখেছিলেন, তা থেকে <code>.htaccess</code> আবার আগের মতো করে নিন। আপনার ভুলের দায়ে আমাকে জড়ালে খুব কষ্ট পাবো তখন। 🙂&nbsp;শুভ হোক!</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><span style="text-decoration: underline; color: #808080;"><strong>বাড়তি পঠন</strong></span></p>



<ul>
<li><span style="color: #808080;"><a style="color: #808080;" href="https://gtmetrix.com/enable-gzip-compression.html" target="_blank" rel="noopener">PageSpeed: Enable gZip Compression^</a> &#8211; GTmetrix</span></li>
</ul>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/">ওয়ার্ডপ্রেস সাইটকে গতিশীল করতে gZip Compression চালু করার পদ্ধতি</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/gzip-compression-wordpress/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেসে ট্যাক্সোনমি মেটা ব্যবহার &#8211; সম্পূর্ণ গাইড</title>
		<link>https://mayeenulislam.github.io/tuts/wordpress-taxonomy-meta-complete-guide/</link>
					<comments>https://mayeenulislam.github.io/tuts/wordpress-taxonomy-meta-complete-guide/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sat, 05 Sep 2015 07:45:54 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=656</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/wordpress-taxonomy-meta-complete-guide/">ওয়ার্ডপ্রেসে ট্যাক্সোনমি মেটা ব্যবহার &#8211; সম্পূর্ণ গাইড</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-background" style="background-color:#c2ecdb"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>লক্ষ করুন:</strong> অদ্য ৯ ডিসেম্বর ২০১৫ তারিখে <a rel="noreferrer noopener" href="https://wordpress.org/news/2015/12/clifford/" target="_blank">ওয়ার্ডপ্রেস ৪.৪.০</a> রিলিযের সাথে ওয়ার্ডপ্রেসের ট্যাক্সোনমি টার্মের মেটা ডাটা রাখার জন্য নতুন একটি টেবিল <code>termmeta</code> এবং প্রয়োজনীয় কোড সক্রীয় করা হয়েছে। সুতরাং টার্ম মেটা যোগ করা এখন আরো সহজ। আপনার দরকার <a rel="noreferrer noopener" href="https://developer.wordpress.org/reference/functions/add_term_meta/" target="_blank"><code>add_term_meta()</code></a>, <a rel="noreferrer noopener" href="https://developer.wordpress.org/reference/functions/update_term_meta/" target="_blank"><code>update_term_meta()</code></a>, <a rel="noreferrer noopener" href="https://developer.wordpress.org/reference/functions/get_term_meta/" target="_blank"><code>get_term_meta()</code></a> ইত্যাদি ফাংশন। তবে এপর্যন্ত টার্মে, মেটা বক্স যোগ করা হয়নি, তাই ফিল্ড যোগ করার ব্যাপারটি আপনি এই টিউটোরিয়াল থেকে দেখে সহায়তা নিতে পারেন। অবশ্য আপনি যদি ওয়ার্ডপ্রেসের ৪.৪.০-এর চেয়ে পুরোন সংস্করণ নিয়ে কাজ করে থাকেন, তাহলে এই টিউটোরিয়ালটি আপনার কাজে লাগবে।</p>



<p>ওয়ার্ডপ্রেস ৪.৩ ছাড়পত্র পেয়েছে ১৯ আগস্ট ২০১৫, এবং এরই সাথে ট্যাক্সোনমিতে একটা নতুন দিগন্তও সূচিত হয়েছে। ট্যাক্সোনমি টার্মগুলো এখন যেকোনো ট্যাক্সোনমি থেকেই আসুক না কেন, <a rel="noopener" href="https://make.wordpress.org/core/2015/06/09/eliminating-shared-taxonomy-terms-in-wordpress-4-3/" target="_blank">তারা এখন একক^</a>, অর্থাৎ একটার সাথে আরেকটা মিলবে না। কাজ শুরু করার আগে আসুন পরিষ্কার হয়ে নেয়া যাক, ট্যাক্সোনমি আর টার্ম দ্বারা কী বোঝানো হচ্ছে।</p>



<h3>পরিচিতি</h3>



<p>ওয়ার্ডপ্রেসে পূর্বনির্ধারিত ট্যাক্সোনমির মধ্যে বহুল পরিচিত হলো <code>Categories</code>, <code>Tags</code> ইত্যাদি। হ্যা, ঠিকই শুনছেন, ক্যাটাগরি, ট্যাগ &#8211; এগুলো আসলে একেকটা ট্যাক্সোনমি। এর মধ্যে Categories-এ পূর্বনির্ধারিত থাকে <code>Uncategorized</code> নামক একটা ক্যাটাগরি। আমরা যারা ক্যাটাগরি আর ট্যাগ ব্যবহার করতে অভ্যস্থ, আমরা জানি, ক্যাটাগরিতে একটার অধীনে (under) আরেকটাকে সেট করা যায়, কিন্তু ট্যাগ প্রতিটাই আলাদা আলাদা। এই যে, Categories এবং Tags, এরা হলো ট্যাক্সোনমি, আর Categories-এর ভিতরে ঐ যে Uncategorized, সেটা হলো ট্যাক্সোনমি টার্ম।</p>



<p>এই পূর্বনির্ধারিত ট্যাক্সোনমি আর টার্মের বাইরে ইচ্ছেমতো ট্যাক্সোনমি আর টার্ম তৈরি করা যায়। ধরা যাক, আমরা ছাত্রদের তথ্য নিয়ে কাজ করছি, এবং তাঁদের শ্রেণীর তথ্য সংরক্ষণ করার জন্য একটা নিজস্ব ট্যাক্সোনমি (Custom Taxonomy) বানিয়ে নিলাম: <code>Classes</code>। এবারে এই ক্লাসেস ট্যাক্সোনমির ভিতরে আমরা ইনসার্ট করলাম <code>I</code>, <code>II</code>, <code>III</code>, <code>IV</code>, <code>V</code> ইত্যাদি শ্রেণীর নাম, অর্থাৎ রোমান সংখ্যায় আমরা শ্রেণীগুলোর নাম লিখেছি: ওয়ান, টু, &#8230;। &#8230;তাহলে Classes হলো আমাদের ট্যাক্সোনমি, আর I, II, III, &#8230; এগুলো হলো আমাদের টার্ম।</p>



<h3>কেন দরকার?</h3>



<p>আমরা যারা ওয়ার্ডপ্রেসের পোস্টে অতিরিক্ত তথ্য যোগ করতে চাই, আমরা জানি Post Meta&#8217;র গুরুত্ব সেখানে কতটা। পোস্ট মেটা দিয়ে হেন কাজ নেই যে, করা যায় না। আর যারা ডাটাবেয ঘাঁটতে জানি, তারা জানি যে, পোস্টের সাথের এই অতিরিক্ত তথ্য (Meta data) জমা রাখার জন্য ওয়ার্ডপ্রেসে একটা আলাদা টেবিলও আছে, নাম <code>postmeta</code>। এবং খুব সহজে সেখানকার তথ্য নিয়ে খেলার জন্য রয়েছে বেশ কয়েকটা সহজ ফাংশন: <code>add_post_meta()</code>, <code>update_post_meta()</code>, <code>get_post_meta()</code>, <code>delete_post_meta()</code> ইত্যাদি। এই ফাংশনগুলো ব্যবহার করে, ধরা যাক, আপনার প্রতিটা পোস্টকে আলাদা আলাদা রঙে রাঙাতে চাচ্ছেন, তো পোস্টের মেটা ডাটাতে একটা করে রঙের কোড পাঠিয়ে দিলেই কাজটা আপনার হয়ে যাচ্ছে। &#8230;পোস্ট মেটার ব্যবহার খুব সহজ। 🙂</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/01-raw-custom-taxonomy-add-fields.png"><img decoding="async" width="169" height="300" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/01-raw-custom-taxonomy-add-fields-169x300.png" alt="পূর্বনির্ধারিত ট্যাক্সোনমি ইনসার্ট করার ফর্ম" class="wp-image-660" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/01-raw-custom-taxonomy-add-fields-169x300.png 169w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/01-raw-custom-taxonomy-add-fields.png 378w" sizes="(max-width: 169px) 100vw, 169px" /></a><figcaption class="wp-element-caption">পূর্বনির্ধারিত ট্যাক্সোনমি ইনসার্ট করার ফর্ম</figcaption></figure></div>


<p>এবারে ধরা যাক, আপনার স্কুলের ক্লাসগুলোর প্রত্যেকটাকে একটা করে ফুলের ছবি দিয়েও সূচিত করা হয়। কিন্তু ওয়ার্ডপ্রেসের ট্যাক্সোনমি ইনসার্শন প্যানেলে যে ফিল্ডগুলো আছে, তা দিয়ে তো ফুলের ছবি ইনসার্ট করা সম্ভব নয়। কারণ সেখানে আপনি টার্মের নামটা, স্লাগ (প্রীটি পার্মালিংকে ইউআরএল-এ যেটা দেখা যায়), শীর্ষ শিরোনাম (যদি এটা অন্য কোনোটার অধীনে সেট করার বিষয় থাকে), আর কিছু বিবরণ। কিন্তু রঙের কথা কোথায় যোগ করবেন?</p>



<p>তখনই মনে পড়ে পোস্টের অতিরিক্ত তথ্য যোগ করার পদ্ধতির &#8211; মেটা ডাটা। কিন্তু দুঃখের বিষয় হচ্ছে, ট্যাক্সোনমিতে মেটা ডাটা যোগ করার কোনো ব্যবস্থা ওয়ার্ডপ্রেসে নেই। সেজন্য এর আলাদা কোনো টেবিলও নেই। কিন্তু এর যে দরকার আছে, সে নিয়ে বিস্তর আলোচনা চলছে বহুদিন ধরে। ওয়ার্ডপ্রেস বহুল ব্যবহৃত একটা সিএমএস, পৃথিবীব্যাপী কোটি কোটি ব্যবহারকারী এটি ব্যবহার করছেন, তাই এতে হুট করে কোনো পরিবর্তন আনা যাবে না। দরকার বহু আলোচনা, গবেষণা, এবং পরীক্ষা-নিরীক্ষা। যদি সবকিছু সন্তোষজনক হয়, তবেই সেটা প্রয়োগ করা হয়। তাই, এটা যে কবে হবে, বা আদৌ হবে কিনা, সেটা আমরা জানি না।</p>



<p>কিন্তু ততদিন কি আমরা বসে থাকবো? আমরা কি আমাদের প্রয়োজনগুলো পূরণ করবো না? আমাদের ক্লাসগুলোর সাথে ফুলের ছবি কি আমরা দিতে পারবো না?</p>



<p>অবশ্যই পারবো, ইনশাল্লাহ।</p>



<h3>কিভাবে?</h3>



<p>প্রথমেই সিদ্ধান্ত নিই যে, আমরা কি পোস্ট মেটার মতো করে আলাদা একটি টেবিল বানিয়ে নিব ট্যাক্সোনমি মেটার জন্যও? সত্যি বলতে কি এ&#8217;নিয়ে বিস্তর বিতর্ক আছে। অনেকের মতেই ওয়ার্ডপ্রেস ডাটাবেয স্কেমাতে থাকাটা যৌক্তিক, নিরাপদ, এবং দ্রুত। তাই আমরা নতুন টেবিল তৈরি না করে কিভাবে সেটা করা সম্ভব, তা-ই এখানে দেখাবো।</p>



<span id="more-656"></span>



<p> আমরা আসলে ওয়ার্ডপ্রেসের অত্যন্ত গুরুত্বপূর্ণ একটা টেবিল: <code>options</code> টেবিলটিতে আমাদের এই তথ্যগুলো রাখবো।</p>



<h3>বিদ্যমান সেবাসমূহ</h3>



<p>ট্যাক্সোনমি মেটা যোগ করার জন্য ইতোমধ্যেই রয়েছে <a href="https://www.google.com/search?q=taxonomy+meta" target="_blank" rel="noopener">প্রচুর রিসোর্স^</a>, বিভিন্ন প্লাগইন রয়েছে, রয়েছে অনেক থিম/প্লাগইন এক্সটেনশন লাইব্রেরী:</p>



<ul>
<li><a href="https://wordpress.org/plugins/taxonomy-metadata/" target="_blank" rel="noopener">Taxonomy Metadata^</a> &#8211; WordPress Plugins</li>



<li><a href="https://wordpress.org/plugins/taxonomy-meta/" target="_blank" rel="noopener">Taxonomy Meta^</a> &#8211; WordPress Plugins</li>



<li><a href="https://wordpress.org/plugins/wp-category-meta/" target="_blank" rel="noopener">Category Meta Plugin^</a> &#8211; WordPress Plugins</li>



<li><a href="https://wordpress.org/plugins/wp-custom-category-meta/" target="_blank" rel="noopener">WP Custom Category Meta^</a> &#8211; WordPress Plugins</li>



<li><a href="https://github.com/bainternet/Tax-Meta-Class" target="_blank" rel="noopener">Tax Meta Class^</a> by Bainternet</li>



<li>&#8230;</li>
</ul>



<p>এর মধ্যে Tax Meta Class আমরা থিমে এক্সটেনশন লাইব্রেরি হিসেবে ব্যবহার করতে পারি। কিন্তু এই ক্লাস ব্যবহার করতে গিয়ে আমরা কিছু সমস্যার সম্মুখিন হয়েছি, যার কারণে আমরা মৌলিক বিষয়টা জেনে নেয়াটাই উচিত মনে করছি।</p>



<h3>মৌলিক প্রক্রিয়া</h3>



<p>বেসিকটা জানা থাকা উচিত, যাতে বিদ্যমান রিসোর্সে প্রয়োজনীয় পরিবর্তন যদি কিছু লাগে, তাও কোথায় কিভাবে করতে হবে আমরা জেনে-বুঝে করতে পারবো। আর যদি নিজে থেকেও কিছু তৈরি করতে চাই, মৌলিক ধারণাটা পূঁজি করে নিজের মতো কিছু একটা তৈরিও করে নিতে পারবো।</p>



<p>আমরা আমাদের পরীক্ষা-নিরীক্ষার জন্য ওয়ার্ডপ্রেসের সাম্প্রতিক সংস্করণ 4.3 এবং TwentyFifteen থিমটা ব্যবহার করে দেখাচ্ছি:</p>



<h4>প্রথম ধাপ: HTML ফিল্ডগুলো তৈরি করে নেয়া</h4>



<p>ট্যাক্সোনমি ইনসার্ট করার ফর্মেই প্রথমে আমাদেরকে আমাদের ফর্ম ফিল্ডগুলো যোগ করে নিতে হবে, যাতে করে আমরা তথ্য এন্ট্রি করতে পারি।</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<p>এই কোডগুলো আমাদের থিমের <code>functions.php</code>-তে বসিয়ে নিলে আমরা Posts-এর <strong>Categories</strong> পাতায় Category যোগ করার ফর্মের নিচে নতুন একটা টেক্সট ফিল্ড দেখতে পাবো (যদি প্লাগইনে এমনটা করতে চাই, তাহলে কোডগুলো প্লাগইনের ফাইলে বসাতে হবে)। আমরা শুধুমাত্র একটা HTML ফর্ম ফিল্ড যোগ করেছি, এটা এখনও কাজ করার উপযোগী হয়নি।</p>



<p class="has-background" style="background-color:#c2ecdb"><strong>জেনে রাখি:</strong> আমরা <a href="https://core.trac.wordpress.org/browser/tags/4.3/src/wp-admin/edit-tags.php#L549" target="_blank" rel="noopener">{$taxonomy}_add_form_fields হুকটা^</a>&nbsp;(<a href="https://developer.wordpress.org/reference/hooks/taxonomy_add_form_fields/" target="_blank" rel="noopener">ডেভলপার গাইড^</a>) ব্যবহার করছি। এই হুকটি ওয়ার্ডপ্রেসে 3.0.0 সংস্করণ থেকে আমাদের জন্য সক্রীয় আছে। হুকটি <code>$taxonomy</code> নামক একটি প্যারামিটার গ্রহণ করে।&nbsp;আমরা যেহেতু Category ট্যাক্সোনমিতে কাজটা করতে চাচ্ছি, তাই আমরা লিখেছি <code>category_add_form_fields</code>।</p>



<p>এবারে ক্যাটাগরি যোগ করার সময় অতিরিক্ত ফিল্ড দেয়ার ব্যবস্থা করলাম ঠিকই, কিন্তু সেই ক্যাটাগরিটা এডিট করতে গেলে সেখানে কিন্তু এই ফিল্ডটা দেখাবে না। তাই এপর্যায়ে আমরা এডিট পাতায় এই ফিল্ডটা যোগ করে নিব:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<p>এবারে টার্মটা এডিট মোডে খুললেও এই ফিল্ডটা আমরা দেখতে পাবো।</p>



<p class="has-background" style="background-color:#c2ecdb"><strong>জেনে রাখি:</strong> আমরা <a href="https://core.trac.wordpress.org/browser/tags/4.3/src/wp-admin/edit-tag-form.php#L185" target="_blank" rel="noopener">{$taxonomy}_edit_form_fields হুকটা^</a>&nbsp;(<a href="https://developer.wordpress.org/reference/hooks/taxonomy_edit_form_fields/" target="_blank" rel="noopener">ডেভলপার গাইড^</a>) ব্যবহার করছি। এই হুকটি ওয়ার্ডপ্রেসে 3.0.0 সংস্করণ থেকে আমাদের জন্য সক্রীয় আছে। হুকটি <code>$tags</code> এবং <code>$taxonomy</code> নামক দুটো&nbsp;প্যারামিটার গ্রহণ করে। এবং আমরা যেহেতু Category ট্যাক্সোনমিতে কাজটা করতে চাচ্ছি, তাই আমরা লিখেছি <code>category_edit_form_fields</code>।</p>



<p>সুতরাং আমাদের ফর্মগুলো প্রস্তুত, আমরা এখন এগুলোতে তথ্য দিয়ে সংরক্ষণ বোতাম চাপলেই তথ্যগুলো পাবো। সুতরাং এপর্যায়ে কাজ হচ্ছে, তথ্যগুলো ধরা, এবং ডাটাবেযে সংরক্ষণ করা।</p>



<h4>দ্বিতীয় ধাপ: তথ্য সংরক্ষণ করা</h4>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<p>এই ধাপটা গুরুত্বপূর্ণ এবং বুঝে নেয়ার বিষয়: ১২ নং লাইনে আমরা বলছি, যদি ট্যাক্সোনমিটা &#8216;Category&#8217; হয়, তবে কাজটা করো, এটা আসলে জরুরি না। যদি একাধিক ট্যাক্সোনমি নিয়ে কাজ করেন, তখন এটা কাজে লাগে। যদি না করেন, তাহলে এই কন্ডিশনাল স্টেটমেন্টটি বাদ দিয়েও কাজ করবে। ১৬ নং লাইনে এসে আমরা যাচাই করে দেখছি, এই ফিল্ডটিতে তথ্য ঢুকেছে কিনা, যদি ঢুকে, তাহলে আমরা একটা অ্যারেতে একটা কী (key) দিয়ে সেই তথ্যটা নিয়ে নিচ্ছি। এবং ১৯ নং লাইনে এসে, আমরা সত্যিকার অর্থে <code>options</code> টেবিলে তথ্যটা নিজস্ব একটা কী দিয়ে সংরক্ষণ করছি। &#8230;তো সেই কী-টা কেমন? আমরা দিয়েছি <code>tax_meta{$term_id}</code>, এর মানে হচ্ছে, সে যখন <code>options</code> টেবিলে তথ্যটা রাখবে, তখন এর option_key হবে <code>tax_meta13</code> বা এরকম কোনো একটা নাম।</p>



<p class="has-background" style="background-color:#c2ecdb"><strong>জেনে রাখি:</strong> আমরা <a href="https://core.trac.wordpress.org/browser/tags/4.3/src/wp-includes/taxonomy.php#L3613" target="_blank" rel="noopener">edit_term^</a>&nbsp;(<a href="https://developer.wordpress.org/reference/hooks/edit_term/" target="_blank" rel="noopener">ডেভলপার গাইড^</a>)&nbsp;এবং <a href="https://core.trac.wordpress.org/browser/tags/4.3/src/wp-includes/taxonomy.php#L3031" target="_blank" rel="noopener">create_term^</a>&nbsp;(<a href="https://developer.wordpress.org/reference/hooks/create_term/" target="_blank" rel="noopener">ডেভলপার গাইড^</a>) হুকদুটো&nbsp;ব্যবহার করছি, দুটোই ওয়ার্ডপ্রেসের 2.3.0 সংস্করণ থেকে আমাদের জন্য&nbsp;সক্রীয় আছে। এই দুটো হুকের বৈশিষ্ট্য হচ্ছে, এদুটোই, টার্মটা তৈরি হয়ে যাওয়ার পরপরই, কিন্তু, টার্ম ক্যাশ পরিষ্কার করার আগে, কাজে নামে। আমরা মনে করছি, আমাদের ফিল্ডের তথ্যগুলো এইসময়টায় সংরক্ষণের জন্য দিলে উপযুক্ত হবে।</p>



<p>এবারে যদি আমরা একটা ডিফল্ট ক্যাটাগরি টার্ম <code>Uncategorized</code> এডিট করে আমাদের তৈরি করা Extra Input Field-এ কিছু লিখে সংরক্ষণ করি, তাহলে তা ডাটাবেযের <code>options</code> টেবিলে সংরক্ষিত হয়ে যাবে। আমরা <code>options</code> টেবিল খুলে সর্বশেষ সংরক্ষিত এন্ট্রিটা দেখলে এভাবে দেখতে পাবো:</p>



<figure class="wp-block-image alignnone"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/tax-meta-term-saved-in-options-table.jpg"><img decoding="async" width="867" height="128" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/tax-meta-term-saved-in-options-table.jpg" alt="ট্যাক্সোনমি মেটা ডাটা options টেবিলে সংরক্ষিত" class="wp-image-698" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/tax-meta-term-saved-in-options-table.jpg 867w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/tax-meta-term-saved-in-options-table-300x44.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/tax-meta-term-saved-in-options-table-768x113.jpg 768w" sizes="(max-width: 867px) 100vw, 867px" /></a><figcaption class="wp-element-caption">ট্যাক্সোনমি মেটা ডাটা options টেবিলে সংরক্ষিত</figcaption></figure>



<p>লক্ষ করুন, Uncategorized টার্মটির টার্ম আইডি হচ্ছে <code>1</code>, তাই আমাদের দেয়া কী-টার সাথে সেটা যোগ হয়ে আমাদের টার্ম মেটা যোগ হয়েছে (<code>tax_meta1</code>)। আমি ভ্যালু হিসেবে দিয়েছিলাম &#8220;data I stored&#8221;, ডান দিকে <code>option_value</code> অংশে আমাদেরই দেয়া কী (<code>extra_input</code>) নিয়ে কিন্তু সেই ভ্যালুটা PHP Serialized Data হিসেবে সংরক্ষিত হয়েছে।</p>



<h4>তৃতীয় ধাপ: গোছগাছ</h4>



<p>আমরা তো নিশ্চিত যে, আমাদের দেয়া তথ্যটা ডাটাবেযে সংরক্ষিত হয়েছে, এবং সবকিছু ঠিকঠাক কাজ করছে। এবারে যদি আমরা <code>Uncategorized</code> আবারো এডিট করতে যাই, আশ্চর্য হয়ে দেখবো, আমাদের দেয়া তথ্যটা আর ঐ ফিল্ডে দেখা যাচ্ছে না। আসুন সেটা সমাধান করা যাক। আগের কোডটাই এভাবে একটু বদলে নিই:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/taxonomy-meta-extra-field-added.png"><img decoding="async" width="401" height="145" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/taxonomy-meta-extra-field-added.png" alt="ট্যাক্সোনমি মেটা হিসেবে অতিরিক্ত ফিল্ড যোগ" class="wp-image-710" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/taxonomy-meta-extra-field-added.png 401w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/09/taxonomy-meta-extra-field-added-300x108.png 300w" sizes="(max-width: 401px) 100vw, 401px" /></a><figcaption class="wp-element-caption">ট্যাক্সোনমি মেটা হিসেবে অতিরিক্ত ফিল্ড যোগ</figcaption></figure></div>


<p>পরিবর্তনটা&nbsp;দেখা যাবে লাইন নং ৭&nbsp;এবং ১৬-তে। আমরা লাইন নং ৭-এ <code>options</code> টেবিল থেকে সেই ফিল্ডটা তুলে আনছি (কী কী তথ্য উঠে আসছে, বুঝতে হলে লাইন নং ৮টা আনকমেন্ট করে নিতে পারেন)। তারপর সেই ফিল্ড-এ তথ্য আমাদের কী (<code>extra_input</code>) ধরে ১৬ নং লাইনে value ফিল্ডে দেখাচ্ছি। ব্যস, কাজ শেষ। আমরা সফলভাবে ট্যাক্সোনমিতে মেটা ফিল্ড যোগ করতে পেরেছি, এবং সেখান থেকে তথ্য নিয়ে ডাটবেযে যোগও করতে পেরেছি। আবার ডাটাবেয থেকে তথ্য বের করে এনে দেখতেও পেরেছি।</p>



<p>সবটুকু কোড একত্রে দেখতে যেমনটা হবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<h4>কাস্টম ট্যাক্সোনমির ক্ষেত্রে মেটা ফিল্ড?</h4>



<p>আমরা তো এতক্ষণ ডিফল্ট ট্যাক্সোনমি Category-তে মেটা ফিল্ড যোগ করে দেখছিলাম, কিভাবে সেটা করতে হয়, কিন্তু আমরা তো স্কুলের Classes-এ বিভিন্ন ফুলের ছবি যোগ করতে চাইছিলাম। এবারে দেখা যাক সেটা কিভাবে করতে হয়:</p>



<p>আমরা নতুন ট্যাক্সোনমি তৈরি করার সময় ওয়ার্ডপ্রেসের দেয়া <a href="https://codex.wordpress.org/Function_Reference/register_taxonomy" target="_blank" rel="noopener"><code>register_taxonomy()</code>^</a> ফাংশনটা ব্যবহার করে থাকি। সুতরাং আমাদের এপর্যন্ত যতগুলো হুক আমরা ব্যবহার করেছি, সেগুলোতে <code>{$taxonomy}</code> অংশে আমরা সেই প্রথম প্যারামিটারটা ব্যবহার করলেই আমাদের মেটা ফিল্ডগুলো সেই ট্যাক্সোনমিতে দেখা যাবে। অর্থাৎ যদি ট্যাক্সোনমির নাম হয় <code>student_classes</code>:</p>



<pre class="wp-block-preformatted">register_taxonomy( 'student_classes', array( 'post' ) );</pre>



<p>তাহলে হুক করার সময়ে লিখতে&nbsp;হবে এভাবে:</p>



<pre class="wp-block-preformatted">add_action( 'student_classes_add_form_fields', 'function_name_here' );</pre>



<h4>যদি একাধিক ট্যাক্সোনমিতে একই ফিল্ডের দরকার পড়ে?</h4>



<p>এমনকি হতে পারে না যে, এমন একটা ফিল্ড আমাদের লাগবে, যা আমাদের একাধিক ট্যাক্সোনমিতেই লাগবে, তখন আসলে ব্যাপারটা পানির মতো সহজ: সবটুকু কাজ এভাবেই করতে হবে, শুধু হুকটা প্রতিটার জন্য একেকবার করে করে নিলেই হয়ে যাবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<p>খুব সহজ, তাই না? 🙂</p>



<h3>সীমাবদ্ধতা</h3>



<p>এটা ঠিক সীমাবদ্ধতা বলা যাবে না, তবে সাবধানতার স্বার্থে উল্লেখ করা: মনে রাখতে হবে, এধরণের টুইকিং বা পরিবর্তনগুলো সাধারণত ওয়ার্ডপ্রেসের থিম ডিভলপমেন্টের সাথে জড়িত নয়, এগুলো প্লাগইন টেরিটরির আলোচ্য বিষয়। যদি থিমে এধরণের কাজ করেন, তাহলে মনে রাখতে হবে যে, থিম পরিবর্তনের সাথে সাথে এই ফাংশনালিটিগুলো হারিয়ে যাবে। কিন্তু প্লাগইন দিয়ে করলে, থিম বদলে নিলেও তা আগের মতোই কাজ করবে।</p>



<p>এবারে সত্যিকারের একটা সীমাবদ্ধতার কথা জানা যাক: যেহেতু আমরা <code>options</code> টেবিল ব্যবহার করছি, সেহেতু <code>options</code> টেবিল কিভাবে কাজ করে তা জানা খুব দরকার। <code>options</code> টেবিলে <code>option_name</code>-এর অধীনে একক তথ্য যেমন রাখা যায়, তেমনি array-ও রাখা যায়। অ্যারের তথ্য ডাটাবেযে রাখার ক্ষেত্রে তা দু&#8217;ভাবে রাখা যায়:&nbsp;<code>json_encode()</code> করে কিংবা <code>serialize()&nbsp;</code>করে, এক্ষেত্রে ওয়ার্ডপ্রেস ব্যবহার করে serialization পদ্ধতি। সিরিয়ালাইযেশন ব্যাপারটা কেমন, দেখা যাক: যদি আমাদের কাছে একটা অ্যারে থাকে, আর আমরা তাকে সিরিয়ালাইয করি, তাহলে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<p>ফলাফল হবে এরকম:</p>



<pre class="wp-block-preformatted">a:2:{s:11:"extra_input";s:13:"data I stored";s:8:"file_url";s:61:"http://localhost/project/wp-content/uploads/2015/09/image.jpg";}</pre>



<p>দেখাই যাচ্ছে, সিরিয়ালাইয্‌ড তথ্যে সব তথ্যই সংক্ষেপে রাখা হয়, যেমন: array-কে লেখা হচ্ছে <code>a</code>, string-কে লেখা হচ্ছে <code>s</code>; এছাড়াও অ্যারে কিংবা স্ট্রিং-এর দৈর্ঘ্যও (length) জমা করে রাখে সে। যেমন: <code>extra_input</code> কী-র স্ট্রিং-এর দৈর্ঘ্য <code>১১</code>, আবার তাতে রক্ষিত তথ্যের স্ট্রিংটার দৈর্ঘ্য <code>১৩</code> ক্যারেক্টার;&nbsp;&#8230;এবং এখানেই আসল সমস্যার সূচনা।&nbsp;আমরা একটা প্রকল্পে&nbsp;<em>Bainternet</em>-এর Tax Meta Class ব্যবহার করছিলাম, তখন এই সমস্যাটির কারণে মহা ঝামেলায় পড়েছিলাম, যদিও অবশ্য পরে সমস্যাটার সমাধান আমরা করতে পেরেছিলাম একটা তৃতীয় পক্ষের কোডের মাধ্যমে।</p>



<p>সমস্যাটা কী?</p>



<p>ঐ ক্লাসটা দিয়ে কোনো ছবি আপলোড করে সংরক্ষণ করা হলে, সে ঠিক আমাদের সিরিয়ালাইয্‌ড তথ্যটার মতো একটা স্ট্রিং ডাটাবেযে সংরক্ষণ করতো। আমরা যখন লোকাল সার্ভার থেকে ডেভলপমেন্ট শেষ করে প্রকল্পটা সার্ভারে তুললাম, তখন আমরা ডাটাবেযের সবগুলো লোকাল পাথ বদলে সার্ভারের পাথ বানিয়ে নিতাম, অর্থাৎ <code>http://localhost/project/</code> বদলে সেখানে লিখতাম <code>http://project.com/</code> কিংবা হয়তো <code>http://dev.project.com/</code> ইত্যাদি। খুব সুন্দর! কিন্তু, এভাবে করার কারণে কিন্তু ঐ স্ট্রিংটার ক্যারেক্টারের সংখ্যা (character count) বদলাতো না। যেমন: আমাদের উদাহরণে, file_url-এ রাখা URL-টার দৈর্ঘ্য হচ্ছে <code>৬১</code>, যদি আমি এই স্ট্রিংটাকে এভাবে বদলে নেই,&nbsp;<code>http://project.com/wp-content/uploads/2015/09/image.jpg</code>, তাহলে তা হয়ে যায় <code>৫৫</code>, আর যদি dev দিয়ে করি তাহলে হয় <code>৫৯</code>। <strong>যখনই সিরিয়ালাইয্‌ড স্ট্রিং-এ স্ট্রিং কাউন্ট বদলে যায়, তখন পুরো সিরিয়ালাইয স্ট্রিং-এ থাকা কোনো তথ্যই আর ওয়ার্ডপ্রেস [কিংবা পিএইচপি] পড়তে পারে না</strong>। (ঘটনার লগ এবং সমাধান কৌশল পাওয়া যাবে &#8220;<a href="#more-to-read">বাড়তি পঠন অংশে</a>&#8220;)</p>



<p>তাই আমাদের পর্যবেক্ষণে যেটা বেরিয়ে আসে, তা হলো: যেখানেই প্রজেক্টের ইউআরএল সংরক্ষণ করার দরকার পড়বে, সেখানে ইউআরএল স্ট্রিং সরাসরি সংরক্ষণ না করে, সম্ভব হলে তার কোনো আইডি সংরক্ষণ করা উচিত।</p>



<h4>সমাধান</h4>



<p>যেভাবে সমাধান করলাম আমরা: আমরা ওয়ার্ডপ্রেসের মিডিয়া লাইব্রেরি ব্যবহার করে ছবি যোগ করে নিচ্ছিলাম একটা ফিল্ডে। তো আমরা তখন আর সরাসরি ছবির ইউআরএল ডাটাবেযে না পাঠিয়ে অ্যাটাচমেন্টটার আইডি পাঠিয়ে দিলাম ডাটাবেযে, ফলে যখন ছবিটা দেখানো দরকার, আমরা আইডি থেকে আবার ছবিটা পুণরুদ্ধার করে নিতে পারি।</p>



<p>আমরা টেক্সট ফিল্ড থেকে যেহেতু&nbsp;ছবিটার absolute URL পাচ্ছিলাম, আমরা <a href="https://pippinsplugins.com/retrieve-attachment-id-from-image-url/" target="_blank" rel="noopener">পিপিন-এর এই কোডটা^</a> তখন কাজে লাগিয়ে ছবিটার ইউআরএল থেকে তার আইডিটা বের করে নিলাম, এবং সংরক্ষণের সময় ইউআরএলটা না পাঠিয়ে সেই আইডিটা পাঠালাম:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<p>ফলে যেটা হলো, আমাদের <code>options</code> টেবিলে <code>image_id</code> কী&#8217;র অধীনে ফাইলের ইউআরএল না গিয়ে তার অ্যাটাচমেন্ট আইডিটা গেল। এটা এজন্য করছি, যাতে ইউআরএল বদলে গিয়ে ক্যারেক্টারের সংখ্যায় উলটপালট হয়ে পুরো ফিল্ডটাই ঝামেলা না পাকায়।</p>



<h3>সংরক্ষিত তথ্য দেখানো</h3>



<p>যা সংরক্ষণ করলাম, তা ডাটাবেয থেকে বের করে দেখানোটা খুব দরকার। সেটা আমরা edit পাতায় করেওছি। কিন্তু কাজের সুবিধার্থে আমরা কয়েকটা ফাংশন বানিয়ে নিলাম, যাতে আমরা খুব সহজে তথ্যগুলো বের করে দেখাতে পারি: প্রথম ফাংশনটা দিয়ে যেকোনো রকমের তথ্য বের করে দেখানো যাবে, আর দ্বিতীয় ফাংশন দিয়ে আমরা যেভাবে ছবির ইউআরএল না নিয়ে আইডি সংরক্ষণ করছিলাম, সেখান থেকে ছবিটার ইউআরএল বের করা যাবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/de3af92c59497867950b">Gist</a>.
</div></figure>



<h4>ব্যবহারবিধি</h4>



<ul>
<li><code>nano_get_tax_meta( 1 );</code> &#8211;&nbsp;<code>1</code> নং টার্মের জন্য রাখা সকল মেটা ফিল্ড বের করে দিবে, array আকারে।&nbsp;(দ্বিতীয় প্যারামিটার ঐচ্ছিক)</li>



<li><code>nano_get_tax_meta( 1, 'extra_input' );</code> &#8211; <code>1</code> নং টার্মের জন্য রাখা সকল মেটা ফিল্ড থেকে শুধুমাত্র <code>'extra_input'</code> কী&#8217;র তথ্যগুলো বের করে দিবে। (দ্বিতীয় প্যারামিটার ঐচ্ছিক)</li>



<li><code>nano_get_tax_meta_img_src( 1, 'extra_input', 'thumbnail' );</code> &#8211; <code>1</code> নং টার্মের জন্য&nbsp;রাখা <code>'extra_input'</code> ফিল্ডটা যদি কোনো ছবির আইডি (attachment ID) হয়, তাহলে এটি সেটার thumbnail আকারের ছবিটির URL বের করে দিবে। তৃতীয় প্যারামিটারের সম্ভাব্য মানগুলো হলো: <code>'thumbnail'</code>, <code>'medium'</code>, <code>'large'</code>, <code>'full'</code>, কিংবা নিজস্ব তৈরি করে নেয়া যেকোনো ইমেজ সাইয।&nbsp; (তৃতীয় প্যারামিটার ঐচ্ছিক, পূর্বনির্ধারিত মান: <code>thumbnail</code>)</li>



<li><code>nano_delete_tax_meta( 1 );</code> &#8211; <code>1</code> নং টার্মের জন্যে&nbsp;রাখা সকল তথ্য মুছে ফেলবে। (দ্বিতীয় প্যারামিটার ঐচ্ছিক)</li>



<li><code>nano_delete_tax_meta( 1, 'extra_input' );</code> &#8211; <code>1</code> নং টার্মের জন্য রাখা সকল তথ্য থেকে শুধুমাত্র <code>'extra_input'</code> কী-তে রাখা তথ্যগুলো মুছে ফেলবে। (দ্বিতীয় প্যারামিটার ঐচ্ছিক)</li>



<li><code>nano_update_tax_meta( 1, 'extra_input', 'Some value' );</code> &#8211; <code>1</code> নং টার্মের জন্য রাখা মেটা তথ্যের <code>'extra_input'</code> কী&#8217;র জন্য রাখা তথ্যকে <code>'Some value'</code> লেখাটি দিয়ে আপডেট করে দিবে। (তিনটি প্যারামিটারই দেয়া বাধ্যতামূলক)</li>
</ul>



<h3>উপসংহার</h3>



<p>তো, আর দেরি কেন? নেমে পড়ুন কাজে। আর এই তথ্যগুলো নিয়ে বানিয়ে ফেলুন নিজের পছন্দমতো ট্যাক্সোনমি মেটা। হয়তো আপনি খুব সহজে একটা কার্যকরী মেটা ক্লাসও বানিয়ে ফেলতে পারেন পিএইচপি দিয়ে। এগুলো কাজে লাগিয়ে আপনি কী বানালেন, আমাদের সাথে শেয়ার করতে ভুলবেন না কিন্তু। আর ওপেন সোর্স করে দিলে আপনার কাজ আরো অনেকে ব্যবহার করে উপকৃতও হবেন কিন্তু। তো, স্বাগতম! 😉</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 id="more-to-read">বাড়তি পঠন</h3>



<ul>
<li><a href="http://wordpress.stackexchange.com/q/184850/22728" target="_blank" rel="noopener">Tax Meta Class ব্যবহার করে পড়া সমস্যার লগ ও সমাধান-যাত্রা^</a> &#8211; WordPress StackExchange</li>



<li><a href="http://wordpress.stackexchange.com/q/183475/22728" target="_blank" rel="noopener">ওয়ার্ডপ্রেস কেন <code>json_encode()</code> ব্যবহার না করে <code>serialize()</code> ব্যবহার করে^</a> &#8211; WordPress StackExchange</li>
</ul>



<h3 id="update-20150909">হালনাগাদ</h3>



<p>Bainternet এই পোস্টে মন্তব্য করেন যে, যে পদ্ধতিতে আমরা ডাটাবেযে সার্চ-রিপ্লেস করছিলাম, ওয়ার্ডপ্রেসে তা করা ঠিক নয়। তাই তিনি তাঁর তৈরি ক্লাসের তথ্য সংরক্ষণ-পদ্ধতিকে ত্রুটি (bug) বলতে নারাজ। আমরা সেটা মেনে নিয়েছি, এবং এই প্রকাশনার তথ্যগুলো এমনভাবে বদলে নেয়া হয়েছে যে, <em>আমাদের কাজের ধারায় আমরা সমস্যার সম্মুখিন হয়েছিলাম</em>। আমরা যেহেতু মৌলিক জ্ঞান নিয়ে আলোচনা করেছি, তাই তা আমাদের আলোচনার সাথে সাংঘর্ষিকও নয়। Bainternet-কে ধন্যবাদ তাঁর বক্তব্যের জন্য। (<strong>Translation:</strong> Bainternet commented on this post that, search-and-replace site URL in database, is a big <em>no-no</em> in WordPress. So as we said earlier that, it&#8217;s a bug of his class, he doesn&#8217;t think so. And we admit it too, and made changes to this article in the way that, <em>we faced issues because we went through a process</em>. As we discussed the basics of Taxonomy Meta, it&#8217;s not contradictory to our main motive. Thanks to Bainternet for his concern.)</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/wordpress-taxonomy-meta-complete-guide/">ওয়ার্ডপ্রেসে ট্যাক্সোনমি মেটা ব্যবহার &#8211; সম্পূর্ণ গাইড</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/wordpress-taxonomy-meta-complete-guide/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>PHP-MySQL দিয়ে CSV ফাইল থেকে বাংলা তথ্য আপলোড</title>
		<link>https://mayeenulislam.github.io/tuts/csv-bengali-import-php-mysql/</link>
					<comments>https://mayeenulislam.github.io/tuts/csv-bengali-import-php-mysql/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Thu, 27 Aug 2015 12:48:40 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[ন্যানো বেসিX]]></category>
		<category><![CDATA[পিএইচপি টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[Unicode CSV]]></category>
		<category><![CDATA[অ্যাক্সেস থেকে সিএসভি]]></category>
		<category><![CDATA[বাংলায় সিএসভি]]></category>
		<category><![CDATA[সিএসভি আপলোড]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=666</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/csv-bengali-import-php-mysql/">PHP-MySQL দিয়ে CSV ফাইল থেকে বাংলা তথ্য আপলোড</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>অনেক তথ্য একসাথে, ডাটাবেযে ঢুকানো বা আপলোড করার (bulk upload) কাজটি অনেক ব্লগে, টিউটোরিয়ালেই আলোচনা করা হয়েছে। আমরা আসলে সেগুলো পড়েই কাজটা খুব সহজে করে ফেলতে পারি। কিন্তু সমস্যাটা সৃষ্টি হবে, যদি আপনি বাংলায় লেখা তথ্যগুলো ডাটাবেযে ঢুকাতে যান&#8230; তাছাড়া পুরো প্রক্রিয়াটা কিভাবে কী হচ্ছে, তাও জানা থাকা দরকার। শেঁকড়টা পোক্ত থাকলে ডালপালায় দৌঁড়ানো খুব সহজ। আমরা তাই পুরো প্রক্রিয়াটি এখানে বিস্তারিত আলোচনা করছি:</p>



<span id="more-666"></span>



<h3>CSV ফাইল কী?</h3>



<p>Comma Separated Values কথাটিকে সংক্ষেপে CSV বলে। এধরণের ফাইলগুলোর এক্সটেনশন হলো <code>.csv</code> [ডট সিএসভি]। ব্যাপারটা খুব সহজ:</p>



<pre class="wp-block-preformatted">1,Someone Extraordinary,Developer
2,Someone New,Debugger
3,John Kauwa Kala,QA Manager</pre>



<p>এই যে ফাইলের তথ্যগুলো উপরে দেখা যাচ্ছে, এখানে তথ্য থেকে তথ্যকে আলাদা করা হয়েছে কমা (,) দিয়ে আর একেকটা আলাদা আলাদা তথ্যগোষ্ঠিকে আলাদা করা হয়েছে এন্টার চেপে লাইন ব্রেক করে। এখন এই তথ্যগুলো একটা ফাইলে রেখে তার এক্সটেনশন <code>.csv</code> করে নিলেই তা হয়ে যাবে আমাদের কাঙ্ক্ষিত CSV ফাইল।</p>



<h3>কখন লাগবে সিএসভি ফাইল?</h3>



<p>ধরা যাক, আপনার ডাটাবেযের টেবিলে তিনটা ফিল্ড আছে: id, name, এবং designation। এই টেবিলে ৫০০০ [পাঁচ হাজার] জন আলাদা আলাদা ব্যক্তির তথ্য আছে। এবারে কোনো কারণে আরেকটা ফিল্ড বাড়ানো লাগলো: age। তখন এই ৫০০০ জনের তথ্য আলাদা আলাদা করে এডিট করে করে তাদের প্রত্যেকের বয়স ডাটাবেযে ঢুকিয়ে নিতে হবে। চিন্তা করুন তো একবার? ৫০০০টা তথ্য খুলে, এডিট করে, সংরক্ষণ করা&#8230; কতটা বিরক্তিজনক কাজ হবে! &#8230;কিংবা এমনও হতে পারে, একটা কোম্পানী ২০ বছর ধরে খাতায়-পত্রে তাদের কোম্পানীর কর্মচারীদের তথ্য লিখে রাখতো। এখন তারা আপনাকে দিয়ে একটা সফ্‌টওয়্যার বানিয়েছে। তো তারা চায় নতুন যারা আসবে, তাদের তথ্য তো সফ্‌টওয়্যারে নতুন করে লিখে নিবেনই, কিন্তু ২০ বছরের পুরোন সব কর্মচারীদের তথ্যও যেন সফ্‌টওয়্যারে ঢোকানো থাকে। এখানেই বিপুল পরিমাণ তথ্য একবারে ঢুকিয়ে দেয়ার জন্য ব্যবহার করা হয় CSV।</p>



<h3>CSV কিভাবে তৈরি করতে হয়?</h3>



<p>এরকম ক্ষেত্রে আমরা সাধারণত মাইক্রোসফ্‌ট এক্সেল-এর বহুল ব্যবহার করে থাকি, তবে অন্য যেকোনো স্প্রেডশিট সফ্‌টওয়্যার ব্যবহার করা যেতে পারে। আমরা এখানে এক্সেল এবং Open Office-এর OpenOffice Calc ব্যবহার করে কাজটি করা দেখাবো ইনশাল্লাহ। স্প্রেডশিটে মূলত দরকারি তথ্যগুলো বিভিন্ন রো&#8217; এবং কলামে লিখে ফেলা হয়:</p>



<pre class="wp-block-preformatted">+----+-----------------------+----------------+-----+
| id | Name                  | Designation    | Age |
+----+-----------------------+----------------+-----+
| 1  | Someone Extraordinary | Developer      | 26  |
| 2  | Someone New           | Debugger       | 21  |
| 3  | John Kauwa Kala       | QA Manager     | 32  |
+----+-----------------------+----------------+-----+</pre>



<p>যেমন আমরা মান্ধাত্যা আমলের সব তথ্য নিতে হলে এভাবে নিলাম। কিন্তু ধরা যাক, আগের সব তথ্য আছে, এখন শুধু &#8216;বয়স&#8217;-এর তথ্যটা নতুন যোগ হবে, সেক্ষেত্রে id আর age কলামই শুধু লিখলাম। আইডি এজন্য লিখলাম, যাতে একটা আনকোরা (unique) তথ্য যেন থাকে, যা দিয়ে আমরা একটা তথ্য থেকে আরেকটা তথ্যকে আলাদা করতে পারি, এবং বয়সের তথ্যটা ঠিক সেই ব্যক্তির ক্ষেত্রেই বসে, যার বয়স যেটা। সেক্ষেত্রে তাদের আইডি ধরে ধরে বসানোটাই সবচেয়ে সহজ।</p>



<p class="has-background" style="background-color:#c2ecdb"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>মনে রাখতে হবে,</strong> স্প্রেডশিটে তথ্য ঢোকানোর সময় যদি কোনো কলামের তথ্যে কমা (,) থেকে থাকে, তাহলে পুরো কলামের তথ্যটাকে অবশ্যই ডাবল কো’ট (“) দিয়ে আলাদা করে নিতে হবে। এই তথ্যগুলোকে আলাদা করার পদ্ধতি নিচে ফাংশনের ডেলিমিটার অংশে আলোচিত হলো।</p>



<p>এভাবে যত লক্ষ-কোটি তথ্য ইচ্ছা, আপনি প্রস্তুত করে নিতে পারেন স্প্রেডশিটে। এরপর <code>.csv</code> ফাইলে একে সংরক্ষণ করে নিতে হবে:</p>



<h4>মাইক্রোসফ্‌ট এক্সেল (২০০৭+) হলে:</h4>



<ul>
<li>ধরে নিচ্ছি আপনি স্প্রেডশিটে এভাবে তথ্যগুলো বসিয়ে নিয়েছেন, এবং একটা <code>.xlsx</code> কিংবা <code>.xls</code> ফাইল আছে আপনার। এবারে সেই ফাইল খুলে Office Button &gt; Save As &gt; Other Formats</li>



<li>ফাইলের একটা নাম দিয়ে, Save as type: ড্রপডাউন মেনু থেকে CSV (Comma delimited) (*.csv) বাছাই করুন</li>



<li>Save বোতাম চাপুন</li>



<li>ওয়ার্নিং আসতে পারে: প্রথম ওয়ার্নিং বলছে, <em>শুধু কিন্তু এই শিটটা সংরক্ষণ হচ্ছে (বাদবাকি শিট-এর খবর জানি না)</em> &#8211; আমরা Ok চাপবো</li>



<li>দ্বিতীয় ওয়ার্নিং বলছে, <em>CSV-তে এমন কিছু ফিচার আছে, যেগুলো কিন্তু সাপোর্ট করবে না</em> &#8211; আমরা সেটা মেনে নিবো &#8211; Yes চাপবো</li>



<li>এক্সেল বন্ধ করে দিই, এবং কোনো ডায়লগ বক্স এলে বলে দিই &#8211; No &#8211; আমরা আর সংরক্ষণ করতে চাই না (কারণ আমাদের কাজ তো হয়ে গেছে)</li>
</ul>



<h4><strong>ওপেনঅফিস ক্যাল্‌ক (4+) হলে:</strong></h4>



<ul>
<li>ধরে নিচ্ছি আপনি ক্যাল্‌ক-এর স্প্রেডশিটে তথ্যগুলো বসিয়ে নিয়েছেন, এবং একটা <code>.ods</code> ফাইল আছে আপনার। এবারে সেই ফাইল খুলে File &gt; Save as (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>S</kbd>) চাপুন</li>



<li>ফাইলের একটা নাম দিয়ে, Save as type: ড্রপডাউন মেনু থেকে Text CSV (.csv) (*.csv) বাছাই করুন</li>



<li>Save বোতাম চাপুন</li>



<li>ওয়ার্নিং আসতে পারে: <em>আপনি কি আসলেই ODS ফর্মেটের বাইরে সেভ করতে যাচ্ছেন</em> &#8211; আমরা Keep Current Format বাছাই করবো</li>



<li>Export Text File নামের একটা ডায়লগ বক্স আসবে, এখানে: Character set: থেকে Unicode (UTF-8) বাছাই করে দিন। আর বাকিগুলো যেমন আছে থাকুক: আমরা কমা (,) দিয়ে আলাদা করছি, আর টেক্সট ডেলিমিটার ডাবল কো&#8217;ট রাখছি (&#8220;) &#8211; OK বোতাম চাপুন</li>



<li>ওয়ার্নিং আসতে পারে: <em>শুধু কিন্তু এই শিটটা সংরক্ষিত হচ্ছে</em> &#8211; আমরা বলবো &#8211; OK</li>
</ul>



<p>কাজ শেষ।</p>



<p>আমাদের <code>.csv</code> ফাইল তৈরি। এবারে ফাইলটা সরাসরি Open না করে মাউসের ডান বোতাম চেপে Notepad (অথবা যেকোনো টেক্সট এডিটর, যেমন: Notepad++, Sublime Text)-এ খুলি। তাহলেই দেখতে পাবো, আমাদের স্প্রেডশিটে দেয়া তথ্যগুলো কমা দিয়ে আলাদা আলাদা হয়ে সুন্দর করে বসে গেছে।</p>



<h3>কিভাবে PHP দিয়ে CSV ফাইল পড়বো?</h3>



<p>এবারে খুব সহজেই আমরা PHP ব্যবহার করে তথ্যগুলো পড়তে পারি। নিচের কোড স্নিপেটটি একটা ফাইলে রেখে ফাইলটা সার্ভার থেকে খোলা যাক&#8230; ইনলাইন মন্তব্যগুলো দেখুন, বিস্তারিত পরে বলছি:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/03864e63b073fc81694b">Gist</a>.
</div></figure>



<p>এবারে এই পাতাটা খুললে আমরা খুব সাধারণ একটা এইচটিএমএল ফর্ম দেখতে পাবো:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/simple-form-to-upload-csv-file.png"><img decoding="async" width="431" height="92" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/simple-form-to-upload-csv-file.png" alt="সিএসভি আপলোড করার জন্য খুবই সাধারণ একটা HTML ফর্ম" class="wp-image-669" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/simple-form-to-upload-csv-file.png 431w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/simple-form-to-upload-csv-file-300x64.png 300w" sizes="(max-width: 431px) 100vw, 431px" /></a></figure></div>


<p>এখানে আমাদের তৈরি করা <code>.csv</code> ফাইলটা আপলোড করে Submit বোতাম চাইলেই সিএসভি&#8217;র চারটা কলামের তথ্যকে আমরা খুব সহজে দেখতে পাবো পর্দায়।</p>



<p>উপরের কোডটা এবার বোঝা যাক: একেবারে নিচে আমরা খুবই সাধারণ একটা এইচটিএমএল ফর্ম ব্যবহার করেছি, যা দিয়ে আমরা ফাইল আপলোড করতে পারি। ফর্মে <code>post</code> মেথড ব্যবহার করেছি, এবং এনক্রিপশন টাইপ রেখেছি <code>multipart/form-data</code>। এই ফর্মটা সাবমিট হলে উপরের পিএইচপি ব্লকে যায়। সেখানে চেক করে আসলেই কি কোনো ফাইল আপলোড হয়েছে কিনা, ফাইলের আকার (<code>size &gt; 0</code>) দেখে। তারপর আমরা ফাইলটাকে <code>$file</code> ভ্যারিয়েবলে রেখেছি। <code>$handle</code>-এ এসে আমরা ফাইলটাকে খুলে পড়েছি। এরপরে <code>while</code> loop-এর ভিতরে আমরা পিএইচপি&#8217;রই দেয়া <a href="http://php.net/manual/en/function.fgetcsv.php" target="_blank" rel="nofollow noopener"><code>fgetcsv()</code>^</a> ফাংশনটা ব্যবহার করেছি সিএসভি ফাইলটা নিজেদের মতো করে পড়ার জন্য। বাকিটা কেবলই ইতিহাস।</p>



<p>এপর্যায়ে fgetcsv() ফাংশনটাকে চেনা যাক:</p>



<pre class="wp-block-preformatted">fgetcsv( file, length, separator, enclosure);</pre>



<p>এখানে:</p>



<ul>
<li><code>file</code>&nbsp;হচ্ছে প্রথম প্যারামিটার, যা দিতেই হয়, এখানে আমরা আমাদের সিএসভি ফাইলটাকে দিবো</li>



<li><code>length</code>&nbsp;হচ্ছে আমাদের প্রতিটা লাইনে কতগুলো ক্যারেক্টার থাকবে তার পরিমাণ (যদি নিশ্চিত না হোন, তাহলে উল্লেখ করা থেকে বিরত থাকুন, কারণ ভুল হলে তথ্য ভেঙে যেতে পারে)</li>



<li><code>separator</code>&nbsp;হচ্ছে সেই ক্যারেক্টার, যা দিয়ে আপনার কলামগুলো আলাদা করা থাকবে, আমরা কমা দিয়ে কাজটি করছি। এক্ষেত্রে ফাংশনে তাই ডিফল্ট করা কমা (,), আমরা যদি অন্য কিছু দিয়ে করতাম, তাহলে এই প্যারামিটারে তা বলে দিতাম</li>



<li><code>delimiter</code>&nbsp;হচ্ছে স্ট্রিং-কে চিনিয়ে দেয়ার পদ্ধতি। CSV-তে কমা পেলেই সে আলাদা কলাম ধরে নিবে। কিন্তু আপনার তথ্যের মধ্যেই যদি কোনো কমা থেকে থাকে (যেমন: “He, you and I went there”), তখন কী হবে? তখন ঐ লেখাটিকে ডাবল কো’ট (“) দিয়ে আটকে দিতে হবে। আর সেটা এই প্যারামিটারে বলে দিলে একেকটা ডাবল কোটের ভিতরকার তথ্যে কমা থাকলেও সে সেটাকে কলাম ধরে নিবে না। এর ডিফল্ট হিসেবে ডাবল কো’ট (“) নির্ধারণ করে দেয়া আছে</li>
</ul>



<p>আমরা তথ্যগুলো পিএইচপি দিয়ে পড়ে ফেলার পর এতটুকু নিশ্চয়ই বুঝে গেছি যে, আমাদের স্প্রেডশিটে লেখা তথ্যগুলোর উপর দখল নিতে পেরেছি আমরা। তাহলে এপর্যায়ে আমরা এই তথ্য নিয়ে যা ইচ্ছা তা করতে পারি। আমরা নিশ্চয়ই এও বুঝে গেছি যে, কমা (,) দিয়ে আলাদা করা প্রতিটা কলামকে <code>fgetcsv()</code> একটা পিএইচপি অ্যারেতে নিয়েছে, তাই প্রথম কলামটা পেতে আমরা অ্যারের যিরো ইনডেক্স (<code>$data[0]</code>) ধরেছি। এভাবে প্রতিটা লাইনকে <code>fgetcsv()</code> আমাদের জন্য আলাদা করে বের করে নিয়ে এসেছে। যারা আগে থেকে কাজ করছেন, তাদেরকে আর বুঝিয়ে বলা লাগবে না, কিভাবে এই তথ্যকে ডাটাবেযে নিয়ে যেতে হবে। তবু আমরা সেবিষয়েও আলোকপাত করছি:</p>



<h3>কিভাবে MySQL ব্যবহার করে CSV ফাইলের তথ্য ডাটাবেযে নিবো?</h3>



<p>আমার উপরে কোড স্নিপেটটির সাথে MySQL কোড যোগ করে এখানে দেখিয়েছি, কিভাবে সিএসভি ফাইল থেকে আমরা যা পড়তে পারছি, তা খুব সহজে ডাটাবেযে নিয়ে যেতে পারি:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/03864e63b073fc81694b">Gist</a>.
</div></figure>



<p class="has-background" style="background-color:#c2ecdb"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>সচেতন থাকুন,</strong> অপরিশোধিত তথ্য ডাটাবেযে নেয়া খুবই বিপজ্জনক। এজন্য অবশ্যই তথ্যকে যথাযথ sanitization, validation আগে থেকে আপনাকে করে নিতে হবে – যা আমরা এখানে দেখাইনি।</p>



<p>আমরা ধরে নিয়েছি আপনি একটা MySQL ডাটাবেয তৈরি করে নিয়েছেন, যার নাম <code>csv_db</code> এবং তাতে একটা টেবিল আছে, যার নাম <code>csv_table</code>, যেখানে <code>id</code>, <code>name</code>, <code>designation</code>, <code>age</code> নামে চারটা কলাম তৈরি করাই আছে (এতগুলো বিষয় আমরা ইচ্ছে করেই দেখাচ্ছি না, টিউটোরিয়ালটাকে যথাসম্ভব ছোট রাখার জন্য)।</p>



<h4><code>$find_header &gt; 1</code> কেন?</h4>



<p>আপনারা আগের কোডের সাথে এখানে অতিরিক্ত একটা পিএইচপি কাউন্টার দেখতে পাচ্ছেন। আপনারা আগের কোডটি রান করালে দেখতে পাবেন, id, name, designation, age &#8211; স্প্রেডশিটের এই লাইনটাও আমাদের সিএসভি থেকে সে রিড করে ফেলেছে। এখন যখন আপনি বিপুল পরিমাণ ডাটা ডাটাবেযে ঢুকাতে যাবেন, তখন কিন্তু প্রথম ডাটা হিসেবে সে হেডারের এই তথ্যগুলোও নিয়ে নিবে। তাই আমরা প্রথম লুপটা অযথাই ঘুরিয়ে আনছি, আর যখন লুপটা একবার ঘুরে গেল, তার মানে প্রথম রো&#8217;-টা পার করে গেল, তখনই আমরা বলছি: <em>এবার তুমি ইনসার্ট করা শুরু করো</em>। তাই আমরা আমাদের কাউন্টার ১-এর বেশি হলে তখন থেকে শুরু করতে বলে দিচ্ছি।</p>



<p>ব্যস, আমরা আমাদের সিএসভি থেকে বিপুল পরিমাণ তথ্য নিয়ে ডাটাবেযে ঢুকিয়ে নিতে পেরেছি।</p>



<h3>CSV&#8217;র তথ্য যদি হয় বাংলায়?</h3>



<p>এটা একটা মহামসিবতের কথা!</p>



<p>আসলে, আমরা যখন প্রথম এই সমস্যার সম্মুখিন হয়েছিলাম, তখন আমরা মূলত বাংলা তথ্যকে ডাটাবেযে নিচ্ছিলাম। এবং মহামসিবতে পড়ে গিয়েছিলাম, কারণ ইউনিকোডে সিএসভি কনভার্শন রীতিমতো মহা ঝামেলার ছিল। কারণ উপরের পদ্ধতিমতে CSV-তে সংরক্ষণ করার পর ফাইলটা টেক্সট এডিটরে খুলে দেখা যায় সব বাংলা লেখা <code>??????</code> -এরকম প্রশ্নবোধক চিহ্ন হয়ে আছে।</p>



<p>তখন আমরা OpenOffice ব্যবহার করতাম না। কারণ ওপেনঅফিস-এর পদ্ধতিতে ৫ নম্বর ধাপে এনকোডিং যে Unicode (UTF-8)-এ হবে, তা বলে দেয়া যায়। আর তাতেই সমাধানটা হয়ে যায়। আমরা সমস্যায় পড়েছিলাম মাইক্রোসফ্‌টের Excell দিয়ে কাজটা করতে গিয়ে।</p>



<p>আমরা অনেক ঘাঁটাঘাঁটি করে তখন দুটো সমাধান পেয়েছিলাম, এখন আরেকটা বোনাস:</p>



<h4>এক্সেল দিয়ে Unicode CSV &#8211; সমাধান ১ (ঝামেলার):</h4>



<ul>
<li><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/csv-tab-replacing-with-commas.png"><img decoding="async" class="alignright size-medium wp-image-672" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/csv-tab-replacing-with-commas-300x265.png" alt="csv-tab-replacing-with-commas" width="300" height="265" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/csv-tab-replacing-with-commas-300x265.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/08/csv-tab-replacing-with-commas.png 417w" sizes="(max-width: 300px) 100vw, 300px" /></a>প্রথম ধাপ আগের মতো</li>



<li>দ্বিতীয় ধাপে এসে Save as type: থেকে Unicode Text (*.txt) বাছাই করুন (বুঝতেই পারছেন, আমরা সরাসরি সিএসভি বানাচ্ছি না)</li>



<li>ওয়ার্নিংগুলো আগের মতোই ডীল করুন, এবং এক্সেল বন্ধ করে দিন (এক্সেলে আর কোনো কাজ নেই)</li>



<li>এবারে যে <code>.txt</code> ফাইলটা তৈরি হয়েছে, তা Notepad-এ খুলুন, দেখবেন সবগুলো লেখাই পড়া যাচ্ছে, আগের মতো প্রশ্নবোধক চিহ্ন হয়ে যায়নি। কিন্তু এটা সিএসভি না, কারণ কলামগুলো কমা দিয়ে আলাদা নয়, বরং ট্যাব দিয়ে আলাদা করা</li>



<li>এবারে নোটপ্যাডের Edit &gt; Replace (<kbd>Ctrl</kbd> + <kbd>H</kbd>) চেপে Find&amp;Replace ডায়লগ বক্সটা খুলে নিয়ে Find what:-এ ছবিতে দেখানো পদ্ধতিতে ট্যাব-স্পেসটুকু কপি করে বসিয়ে দিতে পারেন। এতে দৃশ্যত প্রথম ফিল্ডটা আসলে ফাঁকাই দেখা যাবে। এবারে Replace with:-এ একটা কমা (,) বসিয়ে দিন। &#8230;হ্যা, বুঝে ফেলেছেন, যেহেতু পুরো ডকুমেন্ট ট্যাব দিয়ে আলাদা করা, আমরা ট্যাবগুলোকে কমা বানিয়ে ফেললেই এটা একটা কমা সেপারেটেড ফাইল হয়ে যাবে। &#8230;এবারে Replace All চাপুন</li>



<li>এবারে সাবধানতার জন্য ফাইলের এনকোডিংকে Unicode থেকে Unicode (UTF-8) করে নিতে হবে। এজন্য নোটপ্যাডে File &gt; Save as-এ ক্লিক করুন, এবং একেবারে নিচে Save বোতামের বাম দিকে Encoding থেকে UTF-8 বাছাই করে দিন। ফাইলের নতুন একটা নাম দিলে ঝামেলা নেই, একই নাম দিলে, রিপ্লেস করে নিতে হবে। কাজ শেষ, নোটপ্যাড বন্ধ করে দিন</li>



<li>এবারে ফাইলটা রিনেম করে এর <code>.txt</code> এক্সটেনশনটাকে বদলে <code>.csv</code> করে ফেলুন। যদি ফাইলের নাম হয়: <code>data.txt</code>, তাহলে একে আপনি বানাচ্ছেন <code>data.csv</code></li>
</ul>



<h4>এক্সেল দিয়ে Unicode CSV &#8211; সমাধান ২ (তুলনামূলক ঝামেলাহীন):</h4>



<ul>
<li>আমরা Jaimon Mathew-এর <a href="https://jaimonmathew.wordpress.com/2011/08/23/excel_addin_to_work_with_unicode_csv/" target="_blank" rel="nofollow noopener">এই ব্লগ পোস্টটি^</a> পেয়েছিলাম, যেখানে তাঁর তৈরি একটা অ্যাডইন রয়েছে (পুরো প্রোজেক্টের কোডটি তিনি <a href="https://github.com/jaimonmathew/Unicode-CSV-Addin" target="_blank" rel="nofollow noopener">গিটহাবে হোস্ট^</a> করে রেখেছেন)। অ্যাডইনটি ডাউনলোড করে নিতে হবে আগে (<a href="http://blog.jaimon.co.uk/UnicodeCSV/setupfiles.zip" target="_blank" rel="nofollow noopener">ডাউনলোড লিংক^</a> : <code>setupfiles.zip</code> &#8211; filesize: 247kb)</li>



<li>সেটআপ চালু হলে পিসি রিস্টার্ট নিবে, তাই কোনো কাজ থাকলে আগে ব্যাকআপ নিয়ে নিন</li>



<li>আনযিপ করে নিয়ে <code>Setup.exe</code> চালু করুন (ওটা কাজ না করলে <code>UnicodeCSVAddin.vsto</code> ফাইলটা চালু করতে নির্দেশনা রয়েছে)</li>



<li>এতে সে তার প্রয়োজনীয় ফাইল ইন্টারনেট ব্যবহার করে নামিয়ে নিয়ে তা কম্পিউটারে ইন্সটল করে নিবে। ইন্সটলেশনের অংশ হিসেবে সে পিসিকে নিজে থেকেই রিস্টার্ট করে নিবে। পিসিকে রিস্টার্ট হতে দিন</li>



<li>ইন্সটল করা হয়ে গেলে সরাসরি আপনার বাংলা লেখা এক্সেল ফাইলটা খুলে নিন এক্সেলে। এবারে রিবনে একটা আলাদা নাম দেখতে পাবেন: Unicode CSV। ওটাতে গিয়ে Save বোতাম চাপুন। নাম দিয়ে ফাইলটা সংরক্ষণ করে নিন</li>



<li>ব্যস, ইউনিকোডে আপনার সিএসভি ফাইল প্রস্তুত। যাচাই করতে এক্সেল বন্ধ করে দিয়ে <code>.csv</code> ফাইলটা নোটপ্যাডে খুলে দেখে নিন</li>
</ul>



<h4>এক্সেল দিয়ে Unicode CSV &#8211; সমাধান ৩ (গুগল ডক্স):</h4>



<ul>
<li>আপনার এক্সেল ফাইলটা <a href="http://drive.google.com/" target="_blank" rel="nofollow noopener">গুগল ড্রাইভে^</a> আপলোড করে দিন</li>



<li>এবারে তাকে Open with Google Sheets করে নিন</li>



<li>নতুন গুগল শিটে এবারে আপনার বাংলা স্প্রেডশিটটা খুললে File &gt; Download as &gt; Comma-separated values (.csv, current sheet) বাছাই করুন</li>



<li>ব্যস, ইউনিকোডে বদলে সিএসভি হয়ে নেমে আসবে আপনার স্প্রেডশিটটা</li>
</ul>



<h3>পরিশেষ</h3>



<p>দারুণ না! আমরা স্প্রেডশিট থেকে সিএসভি ফাইল তৈরি করা শিখলাম। তথ্যে ভাষা ইংরেজিভিন্ন অন্য যে কোনো ইউনিকোড হরফে হলে তাও আমরা সফলভাবে সিএসভি করে নিতে শিখলাম। এবং সর্বোপরি সিএসভি ফাইল পিএইচপি দিয়ে পড়তে পারলাম, এমনকি লুপ চালিয়ে তা সংযুক্ত মাইএসকিউএল ডাটাবেযেও ঢুকিয়ে নিতে পারলাম। <span style="text-decoration: underline;">আমরা অবশ্য ডাটাবেযে তথ্য নেয়ার আগে প্রয়োজনীয় স্যানিটাইযেশন, ভ্যালিডেশন এখানে দেখাইনি, যা খুবই গুরুত্বপূর্ণ, এবং বাস্তবে, কাজে সেগুলো অবশ্যই আসা উচিত।</span></p>



<h3>বোনাস: ওয়ার্ডপ্রেসে CSV পড়া</h3>



<p>ওয়ার্ডপ্রেসও কিন্তু PHP-MySQL-ভিত্তিক সিএমএস, সুতরাং আলাদা ঝামেলার কিছুই নেই। তবু আমি যেহেতু একজন ওয়ার্ডপ্রেস ডেভলপার, তাই ওয়ার্ডপ্রেসে কাজটি সহজে কিভাবে করা যায়, তা হয়তো বলে দিতেই পারি।</p>



<p>ওয়ার্ডপ্রেসে একটা পিএইচপি কোড রান করানোর জন্য বিভিন্নরকম প্লাগইন রয়েছে, যেমন: Otto&#8217;র <a href="https://wordpress.org/plugins/php-code-widget/" target="_blank" rel="nofollow noopener">PHP Code Widget^</a>। এই উইজেটে আপনার পিএইচপি কোড বসিয়ে নিয়ে তা ওয়ার্ডপ্রেসের যেকোনো উইজেট সক্রীয় অংশে রান করাতে পারবেন।</p>



<p>যাদের প্লাগইন ব্যবহার করতে মন চাইছে না, তারা কোডের বিপুল ঝামেলায় না গিয়ে যে কাজটি করতে পারেন খুব সহজে, তা হলো একটা Page Template বানিয়ে ফেলা, কিছুই না, শুধুমাত্র কমেন্টের ভিতরে Template Name: CSV বসিয়ে নিলেই যেকোনো ফাইলকে WordPress-এর পাতায় রান করানো যায়। এই ফাইলটা থিমের ফোল্ডারে থাকলে Add New Page থেকে নতুন পাতা তৈরি করে পেজ টেমপ্লেট হিসেবে CSV (আমাদের টেমপ্লেটের নাম) বাছাই করে দিলেই হলো।</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/03864e63b073fc81694b">Gist</a>.
</div></figure>



<p>আমরা ধরে নিয়েছি, আপনি কর্মচারীদের তথ্যাদি রাখার জন্য একটা কাস্টম পোস্টটাইপ তৈরি করে নিয়েছেন, এবং অতিরিক্ত তথ্যগুলো পোস্টমেটা হিসেবে postmeta টেবিলে সংরক্ষণ করছেন। এখানেও একই কথা প্রযোজ্য: <strong>কোনো স্যানিটাইযেশন কিংবা ভ্যালিডেশনের ধার ধারা হয়নি। বাস্তবে প্রয়োগের আগে অবশ্যই কাজগুলো করে নিতে হবে যথাযথ।</strong></p>



<p>এই লেখনি একটা প্রাথমিক দিকনির্দেশনা বলা যায়। আপনি কাজ করতে গিয়ে আরো সমস্যার সম্মুখিন হতে পারেন। সমাধানও বেরিয়ে আসবে ইনশাল্লাহ। তবে কাজে নেমে পড়ার জন্য যথেষ্ট তথ্য এখানে রয়েছে। কেমন কাজে লাগালেন, জানাতে ভুলবেন না কিন্তু।</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<p><span style="color: #999999;">____________________________________________________________</span></p>



<h3><strong>কৃতজ্ঞতা</strong></h3>



<p class="has-small-font-size">এই যাবতীয় অনুসন্ধিৎসায় আমার প্রাক্তন সহকর্মী ও টীম লীড তাহমিনা আখতার-এর সহায়তা কৃতজ্ঞতাচিত্তে স্মরণ করছি। আসলে আমরা উভয়ে মিলে, একটা পিএইচপি প্রোজেক্টে, এবিষয়ক সমস্যার সমাধান করছিলাম। এবং প্রায় ৩ লাখের বেশি তথ্য নিয়ে কাজ করেছিলাম আমরা, সাফল্যের সাথে, আলহ্বামদুলিল্লাহ। <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f60d.png" alt="😍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="has-small-font-size">প্রচ্ছদের ছবি <a href="https://commons.wikimedia.org/wiki/File:CSV_Logo.svg" target="_blank" rel="nofollow noopener">Christlich Soziale Volkspartei-এর তৈরি ছবি^</a>, উইকিমিডিয়া কমন্স থেকে নিয়ে বদলে নেয়া হয়েছে প্রয়োজনমতো।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/csv-bengali-import-php-mysql/">PHP-MySQL দিয়ে CSV ফাইল থেকে বাংলা তথ্য আপলোড</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/csv-bengali-import-php-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেসে অ্যাডভান্সড সার্চ তৈরির উপায়</title>
		<link>https://mayeenulislam.github.io/tuts/advanced-search-wordpress/</link>
					<comments>https://mayeenulislam.github.io/tuts/advanced-search-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Tue, 21 Oct 2014 05:46:21 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=507</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/advanced-search-wordpress/">ওয়ার্ডপ্রেসে অ্যাডভান্সড সার্চ তৈরির উপায়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-background" style="background-color:#f4dd9d"><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>সচেতন থাকুন:</strong> এই টিউটোরিয়ালটি অতি সাধারণ ধারণার ভিত্তিতে তৈরি, এবং এক প্রকারের বাংলা পদ্ধতি বলা যায়, মানে চলে, ব্যস চলছে-ঘরাণার সমাধান। প্রকৃত ওয়ার্ডপ্রেসভিত্তিক সমাধান নিয়ে একটি কিংবা একাধিক পোস্ট লেখার পর্যায়ে রয়েছে। সমাপ্ত হওয়ামাত্র আমরা এই tuts nano-তেই তা প্রকাশ করতে পারবো ইনশাল্লাহ।</p>



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



<h4>ধাপ ১</h4>



<span id="more-507"></span>



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



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/c21bc1ae03fc7503baddc15af16036e7">Gist</a>.
</div></figure>



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



<p class="has-background" style="background-color:#dae1e7">ফর্মের সিনট্যাক্স কেমন, কোডেক্স-এ ডিফল্ট সার্চ ফর্ম থেকে তার একটা ধারণা নেয়া যেতেই পারে।<br><a href="http://codex.wordpress.org/Function_Reference/get_search_form"><code>get_search_form()</code>&nbsp;– Codex</a></p>



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



<pre class="wp-block-preformatted">&lt;?php get_template_part( 'advanced', 'searchform' ); ?&gt;</pre>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/10/advanced-search-form-by-nanodesigns.png"><img decoding="async" width="205" height="214" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/10/advanced-search-form-by-nanodesigns.png" alt="Advanced Search form WordPress by nanodesigns" class="wp-image-513"/></a></figure></div>


<p>আমরা ওয়ার্ডপ্রেসের Default থিম TwentyFourteen-এর সাইডবারে কোডটা বসিয়ে পরীক্ষা করতে পারি:</p>



<p>তো আপনার সার্চ ফর্ম তৈরি। এবারে আপনার ব্যবহারকারীদের পছন্দ আপনি একটা URL-এ নিয়ে নিতে পারছেন। অথ্যাৎ যদি আপনি গাড়ির নামের জায়গায় &#8220;Ferrari&#8221; আর মডেলের জায়গায় &#8220;Model2&#8221; বাছাই করে সাবমিট করেন, তাহলে URL-টা দাঁড়াবে এরকম:</p>



<p><code>http://example.com/?search=advanced&amp;name=Ferrari&amp;model=model2</code></p>



<h4>ধাপ ২</h4>



<p>এবারে আপনার যা দরকার: ডাটাবেজে কুয়েরি করা এবং কাস্টম ফিল্ডে সার্চ কুয়েরি অনুযায়ী খুঁজে মিলিয়ে নেয়া। মনে রাখবেন, সার্চ কুয়েরি কিন্তু আপনার URL, যা আপনি ফর্মটা সাবমিট করার পরে পেয়েছেন। &#8230;এপর্যায়ে আপনি ওয়ার্ডপ্রেসকে বলে দিবেন যে, যখন আপনার ব্যবহারকারীরা সার্চ করবেন, তখন যেন আপনার নিজস্ব অনুসন্ধান পাতাটি খুঁজে এনে সেখানে ফলাফল দেখায়। এজন্য নিচের ফাংশনটি আপনার <code>functions.php</code> ফাইলে বসিয়ে নিন। এটি বসালে ফর্ম সাবমিট করার পরে ডিফল্ট সার্চ টেমপ্লেট না খুলে আপনার নিজস্ব সার্চ পাতা খুলবে।</p>



<pre class="wp-block-preformatted">&lt;?php
function wpse_load_custom_search_template() {
        if ( 'advanced' === isset($_REQUEST['search']) ) {
                require( 'advanced-search-result.php' );
                die();
        }
}

add_action( 'init', 'wpse_load_custom_search_template' );
</pre>



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



<p>ইতালির Giuseppe (G.M.) <a href="http://wordpress.stackexchange.com/a/125515/22728" target="_blank" rel="noopener">এব্যাপারে আরেকটি পথ বাৎলে দিয়েছেন^</a>, তাও দেখা যেতে পারে।</p>



<h4>ধাপ ৩</h4>



<p>আরেকটি নতুন ফাইল তৈরি করুন, যাকে <code>advanced-search-result.php</code> নাম দিয়ে সংরক্ষণ করা যাক (কারণ <code>functions.php</code>-তে আমরা এই নামটিই দিয়েছিলাম)। আর তাহলেই আপনি এবার মুক্ত &#8211; অবশ্যই। কারণ কনসেপ্ট বা মূল ধারণাটা হলো:</p>



<ul>
<li>URL থেকে তথ্যটা ধরুন,</li>



<li>একটা সাধারণ <code>WP_Query()</code> কাজে লাগান (কুয়েরি জটিল কিছু হলে <code>$wpdb</code> কুয়েরি ব্যবহার করুন)</li>



<li>কমান্ডগুলো কুয়েরিতে পাস করুন, আর ডাটাবেজ থেকে তথ্য বের করে নিন, এবং</li>



<li>ফলাফলটা দেখান</li>
</ul>



<p>উদাহরণ হিসেবে দেখা যাক:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/c21bc1ae03fc7503baddc15af16036e7">Gist</a>.
</div></figure>



<div class="is-layout-constrained wp-block-group has-background" style="background-color:#dae1e7"><div class="wp-block-group__inner-container">
<p><code>WP_Query()</code>&nbsp;ব্যবহার করার সময় আপনার সেরা বন্ধু হতে পারে কোডেক্স পাতাটি, এবং কাস্টম ফিল্ড সংক্রান্ত প্যারামিটারগুলো:</p>



<ul>
<li><a href="http://codex.wordpress.org/Function_Reference/WP_Query"><code>WP_Query()</code>&nbsp;– Codex^</a></li>



<li><a href="http://codex.wordpress.org/Function_Reference/WP_Query#Custom_Field_Parameters">কাস্টম ফিল্ড প্যারামিটারগুলো^</a></li>
</ul>
</div></div>



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



<ul>
<li><strong>বদলি অনুসন্ধান তথ্য:</strong> অ্যাডভান্সড সার্চ যেমন সবগুলো ফিল্ড মিলিয়ে হতে পারে, তেমনি যেকোনো একটি ফিল্ড দিয়েও হতে পারে, তাই আপনাকে নিশ্চিত হতে হবে যে, আপনার কুয়েরি সব ধরণের অবস্থায়ই ডাটাবেজে থাকা তথ্য ঠিক ঠিক বের করে আনছে।</li>



<li><strong>শুদ্ধিকরণ আর যাচাইকরণ:</strong> টেক্সট ফিল্ড আর টেক্সটএরিয়াগুলো খুবই মারাত্মক, কারণ এগুলো দিয়ে খুব সহজেই ডাটাবেজে অযাচিত তথ্য পাঠিয়ে ওয়েবসাইটের বারোটা বাজিয়ে দেয়া যেতে পারে। তাই বলে অন্যান্য ফর্ম এলিমেন্টও কম ঝুঁকির না। তাই সরাসরি তথ্য পাঠিয়ে দেয়াটা সবসময়ই অনিরাপদ, আপনাকে অবশ্যই আগে তথ্যকে পরিশুদ্ধ করে নিয়ে যথাযথ যাচাই-বাছাইয়ের মধ্য দিয়ে তথ্যকে ডাটাবেজ কুয়েরিতে পাঠাতে হবে &#8211; যাকে বলে Sanitization &amp; Validation। (<a href="http://code.tutsplus.com/articles/data-sanitization-and-validation-with-wordpress--wp-25536" target="_blank" rel="noopener"><strong>Data Sanitization and Validation with WordPress</strong> &#8211; TutsPlus^</a>)</li>



<li><strong>নকশায়ন:</strong> সাজিয়ে নেয়ার বিষয়টিও আসতে পারে, কিভাবে আপনি আপনার অনুসন্ধান পাতাটি সাজাবেন, সেক্ষেত্রে আপনি <code>page.php</code> (কিংবা <code>search.php</code>) টেমপ্লেটটির সহায়তা নিতে পারেন।</li>
</ul>



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



<p><strong>&#8211; মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/advanced-search-wordpress/">ওয়ার্ডপ্রেসে অ্যাডভান্সড সার্চ তৈরির উপায়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/advanced-search-wordpress/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেসের wp-config.php মুছে ফেললে করণীয়</title>
		<link>https://mayeenulislam.github.io/tuts/deleted-wp-config/</link>
					<comments>https://mayeenulislam.github.io/tuts/deleted-wp-config/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 17 Sep 2014 08:00:35 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=468</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/deleted-wp-config/">ওয়ার্ডপ্রেসের wp-config.php মুছে ফেললে করণীয়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>যারা ওয়ার্ডপ্রেস ব্যবহার করেন, তারা জানেন যে, ওয়ার্ডপ্রেসের <code>wp-config.php</code> ফাইলটি পুরো ওয়ার্ডপ্রেস ইন্সটলেশনের মাথাস্বরূপ। এই ফাইলে সামান্য ত্রুটির কারণে পুরো ওয়ার্ডপ্রেস ইন্সটলেশনই ভজকট পাকিয়ে যেতে পারে, এমনকি নতুন করে ওয়ার্ডপ্রেস ইন্সটল করা লাগতে পারে। সেকারণে এই ফাইলটি এডিট করতে খুব বেশি সাবধান থাকতে হয়, এবং ডেভলপারদেরকে এই ফাইলটি এডিট করার প্রয়োজনীয় নির্দেশনা দিয়ে দেয়া আছে (দেখুন: <a title="Editing wp-config.php - WordPress Codex" href="http://codex.wordpress.org/Editing_wp-config.php" target="_blank" rel="noopener">Codex: Editing wp-config.php^</a>), যাতে তারা পারতপক্ষে ভুল না করেন। ওয়ার্ডপ্রেস ম্যানুয়ালি, মানে নিজের হাতে আপডেট করার ক্ষেত্রেও এমনভাবে নির্দেশনা দেয়া আছে (দেখুন: <a title="Updating WordPress - WordPress Codex" href="http://codex.wordpress.org/Updating_WordPress" target="_blank" rel="noopener">Codex: Updating WordPress^</a>) যাতে, এই ফাইলটা তার মতো যথাস্থানে রেখেই আপনি নতুন ফাইল দিয়ে ওয়ার্ডপ্রেস আপডেট করে নিতে পারেন।</p>



<p>কিন্তু মানুষ মাত্রেই ভুল হতেই পারে। কিছু ভুল আছে, যেগুলো সংশোধনের অযোগ্য, কিন্তু আশার কথা হলো, এই ভুলটা সংশোধনযোগ্য, আর আজকে সেই কথাটিই জানাতে চাচ্ছি: ভুল করে <code>wp-config.php</code> ফাইলটি যদি মুছেই দিয়ে থাকেন, তাহলে দুটো উপায় অবলম্বন করতে পারেন:</p>



<ul>
<li>সহজ পদ্ধতি: পুণরুদ্ধার করা</li>



<li>একটু ঝামেলার: নতুন করে সাজিয়ে নেয়া</li>
</ul>



<h3>সহজ পদ্ধতি: পুণরুদ্ধার করা</h3>



<p>আপনার প্রজেক্টের যদি কোনো ব্যাকআপ থাকে, তাহলে সেটাই সবচেয়ে সহজ পদ্ধতি, পুরোন সেই ব্যাকআপ থেকে আপনার <code>wp-config.php</code> ফাইলটি কপি করে আপনার প্রজেক্টে পেস্ট করে নিন, ব্যস, কাজ শেষ। কিন্তু ব্যাকআপ যদি না থাকে, তাহলে&#8230;</p>



<p>কম্পিউটারে দুভাবে ফাইল ডিলিট করা যায়, শুধু <code>Del</code> (Delete) চেপে, কিংবা <code>Shift + Del</code> চেপে। প্রথম পদ্ধতিতে ডিলিট করলে বা মুছলে তা আমরা Recycle Bin-এ পাওয়া যায়, সেটা একটা শিশুও জানে, কিন্তু দ্বিতীয় পদ্ধতিতে মুছলে তা আর আমরা কোত্থাও পাই না&#8230; কথাটা পুরোপুরি ঠিক না। আসলে কম্পিউটার, পুরোপুরি মুছে ফেলা ফাইলগুলোকে এমন একটা পর্যায়ে নিয়ে রেখে দেয় যে, অন্য আরেকটা ফাইল দিয়ে তা ওভাররাইট বা প্রতিস্থাপন করা যায়, কিন্তু সেটা স্বাভাবিক কোনো অবস্থায় বা স্থানে আমরা দেখতে পাই না। সেই সব হারিয়ে যাওয়া ফাইল পুণরুদ্ধারের জন্য রয়েছে বিভিন্ন ডাটা-রিকভারি সফ্‌টওয়্যার। অনেক সফ্‌টওয়্যারই আমি এজন্য ব্যবহার করেছি, কিন্তু Piriform-এর Recuva&#8217;র মতো ছোট্ট আকারের, আর দ্রুত খুঁজে এনে দেয়ার মতো সফ্‌টওয়্যার, তাও আবার বিনামূল্যের সফ্‌টওয়্যার, আমি আর পাইনি। Recuva চালু করে, যে ড্রাইভ থেকে <code>wp-config.php</code> ফাইলটা হারিয়ে গেছে, সেই ড্রাইভটা স্ক্যান করুন, এরপর মুছে যাওয়া ফাইলটি, কিংবা হারিয়ে যাওয়া ফাইলটি উদ্ধার করে ফেলুন।</p>



<p>কিন্তু এজাতীয়, হারিয়ে যাওয়া, প্রতিস্থাপনযোগ্য ফাইল ফিরে পাওয়া ভাগ্যের ব্যাপার, তার উপর, আগের অবস্থায় যথাযথ রূপে ফিরে পাওয়া তো রীতিমতো দুষ্কর। তাই কোনো ফাইল ভুল করে মুছে ফেললে, কম্পিউটারে অন্য সকল কাজ বন্ধ রেখে আগে ডাটা রিকভারি সফ্‌টওয়্যার চালানো উচিত, নয়তো অন্য কোনো চালু প্রোগ্রামের মুছে ফেলা ক্যাশ ফাইল গিয়ে এ ফাইলটির খানিকটা কিংবা পুরোটা প্রতিস্থাপন করে ফেলতে পারে, হারিয়ে যেতে পারে আপনার কাঙ্ক্ষিত ফাইলটি।</p>



<p>তাই এই পদ্ধতিটা সহজ হলেও সব সময় ঠিক কাজের না, হারিয়ে যাওয়া <code>wp-config.php</code> ফাইলটা আমরা অনেক সময়ই পাই না। তাই দরকার পড়ে একটু ঝামেলা করে <code>wp-config.php</code> আবার নতুন করে সাজিয়ে ফেলার&#8230;</p>



<h3>একটু ঝামেলার: নতুন করে সাজিয়ে ফেলা</h3>



<span id="more-468"></span>



<p>ঝামেলা মনে করলেই ঝামেলা, জেনে গেলে কোনো কাজই আর ঝামেলার মনে হয় না। তাই ঐ &#8220;ঝামেলা&#8221; শব্দটিকে বুড়ো আঙ্গুল দেখিয়ে আমরা এবার পদ্ধতিটা শিখে নিব। নতুন ডাউনলোড করা একটা ওয়ার্ডপ্রেস ইঞ্জিনে প্রথমেই যে ফাইলগুলো থাকে, সেখানে লক্ষ করলে দেখতে পাবেন, সেখানে <code>wp-config-sample.php</code> নামে একটা ফাইল দেয়া থাকে।</p>



<p>এই sample বা নমুনা ফাইলটার একটা কপি তৈরি করুন (কপি করে পেস্ট করুন), তারপর ফাইলটিকে রিনেম করে একে <code>wp-config.php</code> নাম দিন। আশা করি বুঝে গেছেন যে, এতে প্রয়োজনীয় তথ্যাদি দিয়েই আমাদের যথাযথ কনফিগারেশন ফাইলটি আমরা সাজিয়ে নিচ্ছি। &#8216;বানিয়ে নিচ্ছি&#8217; বলছি না একারণে যে, এতে সবকিছু বানিয়ে দেয়া আছে, শুধু সাজিয়ে নিতে হবে।</p>



<p>মনে রাখতে হবে, নতুন একটা কনফিগারেশন ফাইল বানাতে আপনার মাত্র দুটো জিনিস দরকার, কিন্তু এই ওয়ার্ডপ্রেস ইন্সটলকে আরো বেশি নিরাপদ রাখতে সব মিলিয়ে আপনার দরকার পড়বে তিনটা জিনিস:</p>



<ul>
<li>ডাটাবেযের সাথে সংযোগের বৃত্তান্ত</li>



<li>ডাটাবেযের প্রিফিক্স</li>



<li>নিরাপত্তার জন্য salt</li>
</ul>



<p>sample ফাইল থেকেই যেহেতু আমাদের <code>wp-config.php</code> ফাইলটি বানানো, তাই এতে নিচের মতো করে লেখা দেখা যাবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/281cf93410c082540956ca571b5e23e9">Gist</a>.
</div></figure>



<p>এখানে আমাদের মূল কাজটি হচ্ছে <code>DB_NAME</code>, <code>DB_USER</code>, <code>DB_PASSWORD</code> নিয়ে। আপনার প্রজেক্টের ডাটাবেজ ম্যানেজারটি খুলুন, আমি ধরে নিচ্ছি phpMyAdmin। এবারে পিএইচপিমাইঅ্যাডমিনে আপনার কয়েকটা বিষয় জানা থাকতে হবে:</p>



<ol>
<li>ডাটাবেযের নাম</li>



<li>ডাটাবেযের ব্যবহারকারী নাম</li>



<li>ডাটাবেযের পাসওয়ার্ড</li>
</ol>



<p>প্রথমটা জানা না থাকলে সমস্যার শেষ নেই। সব ডাটাবেয ঘেঁটে ঘেঁটে আসল ডাটাবেয খুঁজে বের করাটা অনেক ঝামেলার কাজ, কিন্তু আসলে সেটি ছাড়া গত্যান্তর নেই। আর ডাটাবেযের নাম জানা থাকলে ডাটাবেযের ব্যবহারকারী নাম আর পাসওয়ার্ড হয়তো সহজে বের করা যাবে, বের না করা গেলেও বিকল্প উপায়ে তথ্যাদি অন্য নতুন ডাটাবেজে সরিয়ে নেয়া যাবে।</p>



<p>যাহোক, আমি ধরে নিচ্ছি, এই তিনটেই আপনি জানেন, অন্তত লোকালহোস্টে হলে তো অবশ্যই জানেন, যেমন WAMP ব্যবহার করলে ডাটাবেয ব্যবহারকারীর ডিফল্ট নামটি হলো root, আর পাসওয়ার্ড দেয়া থাকে না, তাই পাসওয়ার্ড ফিল্ডটা ফাঁকা রাখতে হয়। তাই ফিল্ডগুলো লোকালহোস্টের মতো করে সাজিয়ে নিলে হবে এরকম (ধরে নিলাম ডাটাবেযের নাম <code>mydbname</code>):</p>



<pre class="wp-block-preformatted">define('DB_NAME', 'mydbname');
define('DB_USER', 'root');
define('DB_PASSWORD', '');</pre>



<p>প্রাথমিক কাজ শেষ। অর্থাৎ আমাদের ওয়ার্ডপ্রেস ইন্সটলেশনটি এখন ডাটাবেযের সাথে সংযোগ করতে সক্ষম। কিন্তু এখনও পুরো কাজ শেষ হয়নি।</p>



<p>ওয়ার্ডপ্রেসের ডাটাবেয নিরাপত্তার অংশ হিসেবে টেবিলের prefix দেয়ার একটা রীতি প্রচলিত। প্রাথমিকভাবে ওয়ার্ডপ্রেস এটাকে <code>wp_</code> দিয়ে রাখে, এবং নিরাপত্তা বাড়ানোর জন্য বলা হয় যে, প্রজেক্টওয়ারি এই প্রিফিক্সটা বদলে নেয়া উত্তম। প্রিফিক্সটা আসলে কী করে? ওয়ার্ডপ্রেসের টেবিলগুলোর নামকে সহজে আন্দাজযোগ্য অবস্থা থেকে বের করে একটু আন্দাজঅযোগ্য অবস্থায় নিয়ে আসে, কারণ প্রিফিক্স জুড়ে দিলে ওয়ার্ডপ্রেসের ডিফল্ট টেবিলগুলোর নাম হয়ে যায় এরকম: <code>wp_posts</code>, <code>wp_options</code>; আর আপনি যদি আপনার পছন্দমতো প্রিফিক্সটা দিয়ে থাকেন, ভাবুন তা কতটা দুর্বোধ্য আর আন্দাজঅযোগ্য হবে&#8230; যেমন: <code>pst_posts</code>, <code>pst_options</code> ইত্যাদি। যেহেতু আপনি আপনার ডাটাবেযটি জানেন, তাই সেই ডাটাবেযে ঢু মারলেই টেবিলগুলোর নামের আগের ঐ প্রিফিক্সটা দেখলেই আপনি বুঝতে পারছেন প্রিফিক্সটা কী, কারণ প্রিফিক্সগুলো সাধারণত মূল টেবিলের নাম থেকে একটা আন্ডারস্কোর দিয়ে আলাদা করা থাকে, যেমন আমাদের উদাহরণের <code>pst_</code>। তাহলে এবারে <code>wp-config.php</code> ফাইলের ডাটাবেয প্রিফিক্সটা মিলিয়ে নিন:</p>



<pre class="wp-block-preformatted">/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'wp_';</pre>



<p>উদাহরণের মতো করে বদলালে লিখতে হবে:</p>



<pre class="wp-block-preformatted">$table_prefix  = 'pst_';</pre>



<p>ব্যস, এবারে আপনার ওয়ার্ডপ্রেস ইন্সটলেশন আপনার ডাটাবেযকে চেনার পাশাপাশি টেবিলগুলোকেও পড়তে পারবে। মূল কাজটা কিন্তু এখানেই শেষ।</p>



<p>কিন্তু আমরা বলেছিলাম, আমাদের একটা নিরাপদ ওয়ার্ডপ্রেস ইন্সটলেশনও দরকার, তাই salt দিয়ে ওয়ার্ডপ্রেসকে আরো বেশি নিরাপদ করে নেয়া উচিত হবে। সেজন্য আমরা নিচের ১০-১৭ লাইনগুলোকে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/281cf93410c082540956ca571b5e23e9">Gist</a>.
</div></figure>



<p>এখানে put your unique phrase here লেখাটিকে বদলে নিজের ইচ্ছেমতো হাবিজাবি, উল্টাপাল্টা ক্যারেক্টার: অক্ষর, সংখ্যা, চিহ্ন বসালেই কাজ শেষ। কিন্তু বিষয়টা যেহেতু নিরাপত্তা-সংশ্লিষ্ট, তাই এই উল্টাপাল্টাটাও যেন অনেক বেশি প্রকারের উল্টাপাল্টা হয়, যাতে আন্দাজ করা কোনোভাবেই সম্ভব না হয়, কিংবা অনেক বেশি কঠিন হয়, সেটাই নিশ্চিত করা উচিত। এজন্য রয়েছে WordPress Secret Key Generator। এই জেনারেটর কাজে লাগিয়ে আপনি এই ৮টা সিকিউরিটি কী তৈরি করে নিতে পারেন অনায়াসে।</p>



<ul>
<li><a title="Salt Generator - WordPress API" href="https://api.wordpress.org/secret-key/1.1/salt/" target="_blank" rel="noopener">WordPress Secret Key (Salt) Generator &#8211; WordPress API^</a></li>
</ul>



<p>কোনো কী খুব সহজ মনে হচ্ছে, পাতাটা রিফ্রেশ করুন, নতুন আরেক সেট পেয়ে যাবেন। সল্ট সম্পর্কে বিস্তারিত জানতে চাইলে নিচের লিংকগুলো দেখা যেতে পারে:</p>



<ul>
<li><a title="WordPress Security Keys - digwp.com" href="http://digwp.com/2010/09/wordpress-security-keys/" target="_blank" rel="noopener">সল্ট সম্পর্কে প্রাথমিক পরিচিতি &#8211; <em>Jeff Starr</em> &#8211; digwp.com^</a></li>



<li><a title="wp_salt() - WordPress Codex" href="http://codex.wordpress.org/Function_Reference/wp_salt" target="_blank" rel="noopener">wp-salt() &#8211; WordPress Codex^</a></li>



<li><a title="Why WordPress Authentication Unique Keys and Salts Are Important - codeseekah.com" href="http://codeseekah.com/2012/04/09/why-wordpress-authentication-unique-keys-and-salts-are-important/" target="_blank" rel="noopener">কেন ওয়ার্ডপ্রেস সল্ট গুরুত্বপূর্ণ &#8211; Codeseekah.com^</a></li>
</ul>



<p>আপনার ওয়ার্ডপ্রেস ইন্সটলেশনকে নিরাপদ করতে এই সল্টগুলো বদলে নিন, দুর্বোধ্য কিছু দিয়ে, আর এই কীগুলো কারো সাথে শেয়ার করবেন না, ব্যস। আপনার ওয়ার্ডপ্রেস আগের অবস্থায় সম্পূর্ণ প্রস্তুত। শুধু অ্যাডমিন প্যানেলে ঢুকতে আরেকবার লগ-ইন করা লাগবে &#8211; এই যা।</p>



<p>পুনশ্চ, যদি নতুন ডাটাবেয পাবার পরও সাইটের বিভিন্ন লিংক 404 এরর দেখায়, তাহলে অ্যাডমিন প্যানেলের Settings &gt; Permalink-এ গিয়ে Save changes বোতামে একবার ক্লিক করলেই rewrite rules-গুলো রিফ্রেশ হয়ে যাবে, সব আগের মতোই কাজ করবে ইনশাল্লাহ।</p>



<p>কোনো প্রশ্ন থাকলে যেমন শেয়ার করার অনুরোধ করছি, তেমনি অনুরোধ করছি, যদি এতে কোনো সমস্যা হয়, কিংবা আপনারা নতুন কিছু জেনে থাকেন, কিংবা আমার জানায় কোনো ঘাটতি থাকে&#8230;। স্বাগতম!</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/deleted-wp-config/">ওয়ার্ডপ্রেসের wp-config.php মুছে ফেললে করণীয়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/deleted-wp-config/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস ফ্রন্টএন্ড ও ব্যাকএন্ডে ফেভিকন যোগ</title>
		<link>https://mayeenulislam.github.io/tuts/wordpress-favicon/</link>
					<comments>https://mayeenulislam.github.io/tuts/wordpress-favicon/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sat, 12 Apr 2014 17:01:29 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্রাথমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=445</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/wordpress-favicon/">ওয়ার্ডপ্রেস ফ্রন্টএন্ড ও ব্যাকএন্ডে ফেভিকন যোগ</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center has-background" style="background-color:#fed6df"><strong>হালনাগাদ: জুন ৪, ২০১৬:</strong> ওয়ার্ডপ্রেস <a href="https://codex.wordpress.org/Creating_a_Favicon#WordPress_Version_4.3_or_later" target="_blank" rel="noopener">৪.৩ সংস্করণ</a> থেকে কাস্টোমাইযার ব্যবহার করে লগো আপলোডের সুবিধা যোগ করা হয়েছে এবং এই লগোই সাইটের জন্য ফেভিকনের কাজ করে। সুতরাং এই টিউটোরিয়ালটি অনুসরণের আগে নিশ্চিত হয়ে নিন, আপনার সাইটে লগো-সুবিধাটি থাকাসত্ত্বেয় আপনি এটি ব্যবহার করতে চান। ধন্যবাদ।</p>



<p class="has-text-align-center has-background" style="background-color:#c2ecdb">Grab the <strong><a href="http://wordpress.stackexchange.com/q/138098/22728" data-type="URL" data-id="http://wordpress.stackexchange.com/q/138098/22728" target="_blank" rel="noreferrer noopener">Original English version</a></strong> here on WordPress StackExchange</p>



<p><strong>জ্ঞানস্তর:</strong>&nbsp;প্রাথমিক/মাধ্যমিক স্তর</p>



<p><strong>সময়:</strong>&nbsp;৫ মিনিট</p>



<p>ফেভিকন (favicon) হলো ওয়েবসাইটের একটা সংক্ষিপ্ততম পরিচিতি বা ব্র্যান্ডিং, যা, আপনি ওয়েবসাইট খুললে ব্রাউযারের ট্যাবে কিংবা টাইটেল বারে, ওয়েবসাইটের নামের পাশে দেখা যায়। সাধারণত ওয়েবসাইটের লগো&#8217;র ছোট্ট রূপটাই ফেভিকন হিসেবে ব্যবহার করতে দেখা যায়, তবে এক্ষেত্রে ফেভিকনটা সম্পূর্ণই আপনার ব্যক্তিগত পছন্দ &#8211; যা ইচ্ছা তা হতে পারে। কোনো ওয়েবসাইটে ফেভিকন যুক্ত করার জন্য HTML <code>&lt;head&gt;</code> ট্যাগের ভিতর নিচের লাইনটি লিখতে হয়, আর যথাস্থানে <code>.ico</code> (Icon) এক্সটেনশানের একটা ইমেজ ফাইল রাখতে হয়:</p>



<pre class="wp-block-preformatted">&lt;link rel="shortcut icon" href="images/favicon.ico" /&gt;</pre>



<p>ওয়ার্ডপ্রেস ওয়েবসাইটেও একইভাবে ফেভিকন যুক্ত করা যায়, তবে ওয়ার্ডপ্রেসে ফাইলের পাথ (মানে কোথায় ফাইলটি আছে) বোঝানো একটু অন্যরকম, তাছাড়া সর্বত্র ফেভিকনকে দেখানোর বিষয়টিও আমরা এখানে আলোচনা করতে যাচ্ছি।</p>



<p>প্রথমত জেনে নেয়া দরকার, আপনি এই কাজটি থিম কিংবা প্লাগইন উভয় পদ্ধতিতেই করতে পারেন &#8211; আমরা উভয় পদ্ধতিই আলোচনা করছি:</p>



<h3>প্রস্তুতি</h3>



<p>যে ছবিটিকে ফেভিকন হিসেবে দেখাতে চান, তা নির্বাচন করুন, এবং যেকোনো ছবি এডিট করার টুল (যেমন: পেইন্ট, ফটোশপ, গিম্প ইত্যাদি) দিয়ে ছবিটিকে 16px × 16px কিংবা 32px × 32px-এ সংরক্ষণ করুন। ছবির ফাইলটি <code>.jpg</code> (JPEG), <code>.png</code> (PNG), <code>.gif</code> (GIF) ইত্যাদি যেকোনো ফর্মেটেরই হতে পারে। তবে ব্যাকগ্রাউন্ডহীন ছবি হলে <code>.png</code>-তে সংরক্ষণ করতে হবে।</p>



<p>ফাইলটিকে রিনেম করুন, এবং এক্সটেনশানটা বদলে <code>.ico</code> করে ফেলুন। ধরা যাক আপনার ছবিটি ছিল favicon.png, এবারে তা হয়ে গেল favicon.ico।</p>



<p>ব্যস, প্রস্তুতি শেষ। এবারে কাজে নামার পালা।</p>



<h3>থিম-এর মাধ্যমে ফেভিকন যোগ</h3>



<span id="more-445"></span>



<h4>স্ট্যাটিক বা স্থির কোড</h4>



<p>থিম তৈরি করার সময় থিমের images ফোল্ডারের ভিতর ফেভিকন আইকন ফাইলটি রেখে, থিমের&nbsp;হেডারে <code>&lt;head&gt;</code>&nbsp;ট্যাগের ভিতর উপরের কোডটি বসিয়ে দিলেই কাজটা হয়ে যাবে। তবে কোডটিতে একটু পরিবর্তন করে নিতে হবে:</p>



<pre class="wp-block-preformatted">&lt;link rel="shortcut icon" href="&lt;?php echo get_template_directory_uri(); ?&gt;/images/favicon.ico" /&gt;</pre>



<p>লক্ষ করুন এখানে&nbsp;<code>get_template_directory_uri()</code>ব্যবহার করা হয়েছে। ওয়ার্ডপ্রেসে থিমের ফোল্ডারটির পাথ সনাক্ত করাবার জন্য এটি ব্যবহার করা হয়ে থাকে। আপনি যদি চাইল্ড থিম নিয়ে কাজ করেন, তাহলে এক্ষেত্রে <code>get_stylesheet_directory_uri()</code>-এর ব্যবহার করুন।</p>



<p>আপনার ফেভিকনটি সাইটের ফ্রন্টএন্ডে দেখা যাবে, কিন্তু অ্যাডমিন প্যানেলে দেখা যাবে না। তাই আমরা একটি ডায়নামিক কোড লিখতে যাচ্ছি, যা দিয়ে আমরা, উপরের কোডটি ব্যবহার না করেই, সাইটের ফ্রন্টএন্ড এবং ব্যাকএন্ডে ফেভিকন লোড করতে পারবো।</p>



<h4>ডায়নামিক কোড</h4>



<p>ওয়ার্ডপ্রেস থিমের হেডারের <code>&lt;head&gt;</code> সেকশনে <code>wp_head()</code>-এর ব্যবহার উত্তম, এবং একটি আধুনিক পদ্ধতি &#8211; অনেক প্লাগইনই এর হুকটা ব্যবহার করে প্রয়োজনীয় কোড লোড করে। আপনার থিমে এই হুকটা যদি হেড সেকশনে বসানো থাকে, তাহলে থিমের <code>functions.php</code> ফাইলে নিচের কোডটি বসাতে হবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/312bfefcdb008599377c27ccb5513adb">Gist</a>.
</div></figure>



<p>এখানে আমরা একটা ফাংশনের ভিতরে আমাদের আগের স্ট্যাটিক কোডটাই লিখেছি। তারপর <code>add_action()</code> দিয়ে দুটো আলাদা জায়গায় হুক করেছি, পাশের কমেন্ট দেখে আপনারা বুঝতে পারছেন, কোন হুকটা দিয়ে আমাদের ফেভিকনটা কোথায় চলে যাচ্ছে &#8211; তবু বলে দিচ্ছি, প্রথম অ্যাকশন দিয়ে <code>wp_head()</code> হুকের মাধ্যমে সাইটের ফ্রন্টএন্ডে ফেভিকনটা দেখা যাবে, আর দ্বিতীয়টার ব্যবহারে সাইটের ব্যাকএন্ডেও ফেভিকনটা দেখা যাবে।</p>



<h4>রেফারেন্স লিংক:</h4>



<ul>
<li><a title="get_template_directory_uri() - WordPress Codex" href="http://codex.wordpress.org/Function_Reference/get_template_directory_uri" target="_blank" rel="noopener"><code>get_template_directory_uri()</code> &#8211; ওয়ার্ডপ্রেস কোডেক্স^</a></li>



<li><a title="get_stylesheet_directory_uri() - WordPress Codex" href="http://codex.wordpress.org/Function_Reference/get_stylesheet_directory_uri" target="_blank" rel="noopener"><code>get_stylesheet_directory_uri()</code> &#8211; ওয়ার্ডপ্রেস কোডেক্স^</a></li>
</ul>



<h3>প্লাগইন-এর মাধ্যমে ফেভিকন যোগ</h3>



<p>কখনও কখনও এমনও তো হতে পারে, আপনার সাইটের থিম পরিবর্তন করা লাগতে পারে। এক্ষেত্রে ধরা যাক আপনার ফেভিকনটা পরিবর্তন হচ্ছে না, তখন কিন্তু আগের থিমের সাথে আপনার ফেভিকনের কোডটাও চলে যাচ্ছে, অর্থাৎ সাইটে ফেভিকন নিষ্ক্রীয় হয়ে যাচ্ছে। এই সমস্যা দূর করতে আমরা আমাদের সাইটে ফেভিকন, একটা প্লাগইন ব্যবহার করেও দেখাতে পারি।</p>



<p>এজন্য শুরুতেই একটা <a title="Creating a site-specific snippets plugin - OttoPress.com" rel="noopener" href="http://ottopress.com/2011/creating-a-site-specific-snippets-plugin/" target="_blank">নিজস্ব প্লাগইন^</a> বানিয়ে নিতে পারি। কোড এডিটর খুলে নিচের কোডগুলো লিখুন:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/312bfefcdb008599377c27ccb5513adb">Gist</a>.
</div><figcaption class="wp-element-caption">Favicon যোগ করার জন্য ছোট্ট একটা প্লাগইন বানানো যেতে পারে</figcaption></figure>



<p>লক্ষ করুন, এখানে আমরা আগের ফাংশনটার বদলে <code>plugins_url()</code> ফাংশনটা ব্যবহার করেছি, কারণ আমরা প্লাগইনের ভিতরে আমাদের আইকন ফাইলটি রাখতে যাচ্ছি। এবারে ফাইলটি ধরা যাক <code>my-favicon.php</code> লিখে সংরক্ষণ করলাম। ফাইলটা একটা <code>my-favicon</code> নামক একটা ফোল্ডারে রেখে আমাদের <code>favicon.ico</code> ফাইলটি ঐ ফোল্ডারে রাখি। এবারে এই পুরো ফোল্ডারটি <code>wp-content/plugins</code> ফোল্ডারের ভিতর পেস্ট করি। তাহলে ব্যাপারটা যা দাঁড়ালো:</p>



<pre class="wp-block-preformatted">wp-content/
 &nbsp; &nbsp;plugins/
 &nbsp; &nbsp; &nbsp; my-favicon/
 &nbsp; &nbsp; &nbsp; &nbsp; -my-favicon.php
 &nbsp; &nbsp; &nbsp; &nbsp; -favicon.ico</pre>



<p>এখন আপনার ওয়ার্ডপ্রেস অ্যাডমিন প্যানেলের প্লাগইন্‌স পাতায় (সাধারণত <code>/wp-admin/plugins.php</code>) গিয়ে <code>My Favicon</code> নামক প্লাগইনটি অ্যাক্টিভেট বা সক্রীয় করুন।</p>



<p>ব্যস, এবার আপনার সাইটের ফ্রন্টএন্ড এবং ব্যাকএন্ডে উপভোগ করুন ফেভিকন!</p>



<h4>রেফারেন্স লিংক:</h4>



<ul>
<li><a title="plugins_url‎() - WordPress Codex" href="https://codex.wordpress.org/Function_Reference/plugins_url‎" target="_blank" rel="noopener"><code>plugins_url()</code>&nbsp;&#8211; ওয়ার্ডপ্রেস কোডেক্স^</a></li>
</ul>



<h3>বোনাস &#8211; অ্যাপল টাচ আইকন যোগ!</h3>



<p>অ্যাপলের মোবাইল (আইফোন) কিংবা আইপ্যাডে অ্যাপল টাচ আইকন দেখা যায়, যা আপনার সাইটের প্রতিনিধিত্ব করবে অনেকটা ফেভিকনের মতো। &nbsp;যদিও ফেভিকন এবং অ্যাপল টাচ আইকন ভিন্ন বিষয়, তবু এদের পদ্ধতিটা যেহেতু এক, তাই বিষয়টা এখানেই আলোচনা করা হলো:</p>



<p>ফেভিকন যেখানে ১৬-১৬ কিংবা ৩২-৩২ ডাইমেনশনে তৈরি করা হয়েছিল, অ্যাপল টাচ আইকনটা সেখানে তৈরি করতে হবে 129px × 129px ডাইমেনশনে, তবে ফাইলটা <code>.png</code> হলেও সমস্যা নেই। এবারে আগের কোডের মতোই হবে এবারের কোডটিও, লিখতে হবে:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/mayeenulislam/312bfefcdb008599377c27ccb5513adb">Gist</a>.
</div></figure>



<p>বাকিটা এবারে আপনিও পারবেন ইনশাল্লাহ। 🙂</p>



<p>এই অংশটির জন্য&nbsp;<a title="helgatheviking" href="http://wordpress.stackexchange.com/users/6477/helgatheviking" target="_blank" rel="noopener"><em>helgatheviking</em>^</a>-কে ধন্যবাদ (<a title="What's the proper way to add a favicon in WordPress without a plugin? - WordPress Development" href="http://wordpress.stackexchange.com/a/43932/22728" target="_blank" rel="noopener">মূল উৎস^</a>)।</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>



<p>______________________________</p>



<p><sup>পুরো টিউটোরিয়ালটা আগে, ইংরেজিতে প্রকাশ করেছিলাম StackExchange-এর WordPress Development প্রশ্নোত্তর সাইটে ১৬ মার্চ ২০১৪ তারিখে। (<a title="How to add favicon to my site - in both front end and admin panel - WordPress Stack Exchange" href="http://wordpress.stackexchange.com/q/138098/22728" target="_blank" rel="noopener">মূল লিংক^</a>)</sup></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/wordpress-favicon/">ওয়ার্ডপ্রেস ফ্রন্টএন্ড ও ব্যাকএন্ডে ফেভিকন যোগ</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/wordpress-favicon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস থীম অপশন্‌স &#8220;এডিটর&#8221; অ্যাকাউন্ট উপযোগী করার উপায়</title>
		<link>https://mayeenulislam.github.io/tuts/editors-access-theme-options/</link>
					<comments>https://mayeenulislam.github.io/tuts/editors-access-theme-options/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 29 Jan 2014 17:07:44 +0000</pubDate>
				<category><![CDATA[উচ্চস্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=408</guid>

					<description><![CDATA[<p>ওয়ার্ডপ্রেস থীম অপশন্‌স পাতা 'এডিটর' অ্যাকাউন্ট যাতে ব্যবহার করতে পারেন, সেজন্য যা যা করা লাগবে, কারণসহ তার উল্লেখ...</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/editors-access-theme-options/">ওয়ার্ডপ্রেস থীম অপশন্‌স &#8220;এডিটর&#8221; অ্যাকাউন্ট উপযোগী করার উপায়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>জ্ঞানস্তর:</strong> মাধ্যমিক/উচ্চস্তর<br><strong>সময়:</strong> ৫ মিনিট</p>



<p>ওয়ার্ডপ্রেস থিম ডেভেলপমেন্ট, মানে নিজের মতো করে থিম বানিয়ে নেবার সময় নিজস্ব একটা অ্যাডমিন প্যানেল পাতা বানিয়ে নেয়াটা দারুণ একটা উদ্যোগ, এবং এর মাধ্যমে ওয়েবসাইটের অনেক ফিচার অ্যাডমিন প্যানেল থেকে নিয়ন্ত্রণ করার সুযোগ এর অ্যাডমিন-ব্যবহারকারীদের দেয়া যায়। তো সেরকমই একটা ওয়েবসাইট ক্লায়েন্টকে বানিয়ে দেবার সময় দরকার পড়লো একটা অ্যাডমিন পাতা বানিয়ে দেবার।</p>



<p>ওয়ার্ডপ্রেসে অ্যাডমিন প্যানেলে আলাদা পাতা বানিয়ে সেটিংস ডাটাবেযে সংরক্ষণের চিন্তা করলেই আপনাকে ওয়ার্ডপ্রেসের <a title="Settings API - WordPress Codex" href="http://codex.wordpress.org/Settings_API‎" target="_blank" rel="noopener">Settings API^</a>&#8216;র কথা চিন্তা করতে হবে। কারণ এই পদ্ধতিতে আপনি অনেক ঝামেলার বিষয়কে এড়িয়ে, হ্যাকিংয়ের সম্ভাবনা কমিয়ে আপনার সাইটের অ্যাডমিন প্যানেলে একটি সুরক্ষিত অ্যাডমিন সেকশন তৈরি করে নিতে পারবেন। কিন্তু সেটিংস এপিআই একটু সময় নিয়ে করতে হয়। যাহোক, সেটিংস এপিআই নিয়ে অন্য একদিন কথা বলা যাবে। এছাড়াও বিভিন্ন অপশন্‌স ফ্রেমওয়ার্ক আছে, যেগুলো অনুসরণ করে অনেক কম সময়ে অনেক ভালো অ্যাডমিন সেকশন তৈরি করে ফেলা যায়। কিন্তু এই পদ্ধতিগুলোর একটা সমস্যা আছে, সেটা হলো গতি। অ্যাডমিন ফ্রেমওয়ার্কগুলো সাইটকে অনেক ধীর করে দেয়। খুব ছোটখাটো কাজের জন্য তাই ফ্রেমওয়ার্কের বিকল্প হলো আমার গুরু <a title="Sample Theme Options by Ian Stewart - ThemeShaper.com" href="http://themeshaper.com/2010/06/03/sample-theme-options/" target="_blank" rel="noopener"><em>Ian Stewart</em>-এর Sample Theme Options^</a>। মাত্র একটি ফাইল ব্যবহার করে দারুণ একটি থিম অপশন্‌স পেজ তৈরি করা যায় অনায়াসেই।</p>



<p>এরকমই একটি থিম অপশন্‌স পেজ তৈরি করে ফেলার পর যখন সাইটটা ক্লায়েন্টকে ডেলিভারি দেবার সময় ঘনিয়ে এলো, তখন বিভিন্নভাবে পরীক্ষা-নিরীক্ষা করতে গিয়ে দেখা গেলো, ক্লায়েন্টের জন্য তৈরি করা editor ইউযার রোল হিসেবে লগইন করে ঐ থিম অপশন্‌স পেজ থেকে কোনো কিছু সংরক্ষণ করা যায় না। একটা এরর দেখায়:</p>



<blockquote class="wp-block-quote">
<p>Cheatin’ uh?</p>
</blockquote>



<p>এররটা একটু বিতর্কিত, কারণ অনেকেই এধরণের ভুলকে &#8216;চিটারি&#8217; বলে অপমান করা মনে করেন। যাহোক, সেটা আমাদের বিষয় না। &#8230;অনেক ঘাঁটাঘাঁটি করলাম। কিন্তু আশানুরূপ কোনো সমাধান পেলাম না। ঘাঁটতে ঘাঁটতে ওয়ার্ডপ্রেসের <a title="WordPress Core Trac Ticket" href="https://core.trac.wordpress.org/ticket/14365" target="_blank" rel="noopener">trac-এ একটি টিকেট^</a> পেয়ে গেলাম, সেখানে একটা আপাত-সমাধান পেলাম।</p>



<p> সমাধানটা হলো ঐ পাতা ব্যবহারকারীর সক্ষমতা (capabilities) হিসেবে যদি <code>edit_theme_options</code>&#8216;র বদলে <code>manage_options</code> করে দেয়া যায়, তাহলেই সব সমাধান হয়ে যায়। অর্থাৎ <code>theme-options.php</code> ফাইলের <code>add_theme_page()</code> ফাংশনটিকে যদি নিচের মতো করে লেখা যায়:</p>



<span id="more-408"></span>



<pre class="wp-block-preformatted">add_theme_page(
    __( 'Theme Options', 'sampletheme' ),
    __( 'Theme Options', 'sampletheme' ),
    'manage_options',
    'theme_options',
    'theme_options_do_page'
);
</pre>



<p>কিন্তু এর একটা চরম সীমাবদ্ধতা কিংবা অপকারিতা আছে, যা ঐ ট্র্যাকেই উল্লেখ করা আছে:</p>



<blockquote class="wp-block-quote">
<p>&#8230;giving these users &#8216;manage_options&#8217; capability is not a good idea as that allows them to do other things that they shouldn&#8217;t be able to do (e.g. access wp-admin/options.php directly).</p>
</blockquote>



<p>অর্থাৎ, ব্যবহারকারীকে <code>manage options</code> সক্ষমতা দিয়ে দেয়ার ব্যাপারটা মোটেই কোনো ভালো আইডিয়া নয়, কারণ এর দ্বারা তাদেরকে এমন সব কাজ করার সুযোগ করে দেয়া যায়, যা তাদের জন্য প্রযোজ্য হওয়া উচিত নয় (যেমন: অ্যাডমিন প্যানেলের সেটিংস পাতায় ঢুকতে পারা)।</p>



<p>অর্থাৎ সমস্যাটা হলো, <code>manage_options</code> সক্ষমতাটা শুধুমাত্র অ্যাডমিনের জন্য প্রযোজ্য, কিন্তু এডিটর সেই প্রিভিলিজ পেয়ে গেলে সাইটকে নষ্ট করে দিতে পারেন। তাই বিষয়টা আমাকে ভাবিত করে তুললো। এবং এটাও বুঝলাম, <code>manage_options</code> কোনোভাবেই এই সমস্যার সমাধান হতে পারে না।</p>



<p>অনুসন্ধান চলতে থাকলো। তখনই wordpress.org/support ফোরামে Chip Bennett-এর একটা সমাধান দেখলাম (<a title="WordPress Settings API &quot;Cheatin' Uh?&quot; Error - WordPress.org Support Forum" href="http://wordpress.org/support/topic/wordpress-settings-api-cheatin-uh-error#post-2219995" target="_blank" rel="noopener">এই থ্রেডে^</a>), তিনি বলছেন, ওয়ার্ডপ্রেসের Twenty Eleven থীমে এরকম একটি ফাংশনের ব্যবহার করা হয়েছিল, যা দিয়ে এই সমস্যাটার সমাধান করা হয়েছে। পরবর্তিতে Ed Nailor-এর <a title="Allowing Non-Admin Users to Update Theme Options - Ed Nailor" href="https://web.archive.org/web/20161012060929/http://ednailor.com/2012/04/16/allowing-non-admin-users-to-update-theme-options/" target="_blank" rel="noopener">এই পোস্টটি^</a> (<a href="https://www.dropbox.com/s/kx8rdj3sgbff282/Allowing%20Non-Admin%20Users%20to%20Update%20Theme%20Options%20-%20Ed%20Nailor%20-%202012-04-16.png?dl=0" target="_blank" rel="noopener">আর্কাইভ লিংক^</a>) আমার নজরে আসে, এবং আমি একটা সমাধান পাবার ব্যাপারে আশাবাদী হই। এড ন্যাইলর এই বিষয়টাতে একটু বিস্তারিত বর্ণনা করেছেন, তাই কাজে নামতে কষ্ট হলো না আমার।</p>



<p>আমি Twenty Eleven-এর থীম ট্র্যাক থেকে <a title="Twenty Eleven Theme Options" href="http://core.svn.wordpress.org/tags/3.2.1/wp-content/themes/twentyeleven/inc/theme-options.php" target="_blank" rel="noopener">মূল কোডটা^</a> দেখে নিলাম। ফাংশনটা এরকম:</p>



<pre class="wp-block-preformatted">function twentyeleven_option_page_capability( $capability ) {
	return 'edit_theme_options';
}
add_filter( 'option_page_capability_twentyeleven_options', 'twentyeleven_option_page_capability' );
</pre>



<p>কিন্ত আমাকে আসলে বুঝতে হবে কিভাবে এই কোডটি কাজ করছে। যেহেতু ফাংশনটি <code>options_page_capability_twentyeleven_options</code>-এ ফিল্টার করা হয়েছে, তাই তা দিয়ে খুঁজলাম, কিন্তু কিছু পেলাম না। পরবর্তিতে ফাংশনটির উপরের কমেন্ট দেখে বিষয়টা বুঝতে পারলাম। লক্ষ করলে দেখবেন <code>register_setting()</code> ফাংশনের প্রথম প্যারামিটারটা হলো <code>twentyeleven_options</code>। অপশন পাতার এখানেই ফিল্টারটা কাজে লাগানো হয়েছে।</p>



<p>ফিরে এলাম ইয়ানের থিম অপশন্‌সে। এখানে <code>register_setting()</code>-এর প্রথম প্যারামিটার হলো <code>sample_options</code>। এবারে এড ন্যাইলরের পরামর্শটা মাথায় নিয়ে কাজে নেমে গেলাম। আমার থীমের <code>functions.php</code>-তে TwentyEleven-এর কোডটা নিয়ে নিজের প্রয়োজনমতো বদলে নিলাম:</p>



<pre class="wp-block-preformatted">function options_page_capability( $capability ) {
    return 'edit_theme_options';
}
add_filter( 'option_page_capability_sample_options', 'options_page_capability' );
</pre>



<p>এখানে ফাংশনের নামটা গুরুত্বপূর্ণ না, গুরুত্বপূর্ণ হলো ফিল্টারের হুকটা: <code>option_page_capability_sample_options</code>, যাতে <code>option_page_capability_</code> পর্যন্ত একই রেখে শুধু আমার থীম অপশনের সেটিংসটা বসিয়ে দিতে হয়েছে। সিনট্যাক্সটা হলো: <code>option_page_capability_{$option_group}</code>, তাই <code>register_setting</code>-এ অপশন গ্রুপ যা দিয়েছিলেন, হুকের শেষাংশে সেটাই বসিয়ে নিতে হবে, ব্যস, <em>কেল্লা ফতে</em>।</p>



<p>তারপরও যদি এডিটর, পাতাটি ঠিকমতো দেখতে কিংবা ব্যবহার করতে না পারেন, তাহলে এড ন্যাইলার নিচের কোডটি <code>functions.php</code>-তে বসিয়ে নেয়ার পরামর্শ দিয়েছেন:</p>



<pre class="wp-block-preformatted">$editor_role = get_role( 'editor' );
$editor_role-&gt;add_cap( 'edit_theme_options' );
</pre>



<p>এই কোডটি ব্যবহার না করেও আপনি User Role Editor প্লাগইন দিয়েও কাজটি করে নিতে পারেন। আপনার যদি White Label CMS প্লাগইনটাও ইন্সটল করা থাকে, তাহলে <a title="Activating a Theme Options page to Editor - not working" href="http://wordpress.stackexchange.com/q/131507/22728" target="_blank" rel="noopener">WPSE&#8217;র আমার খোলা এই বন্ধ থ্রেডটা^</a>ও দেখে নিতে পারেন।</p>



<p>আশা করি এখন থেকে ডেভলপাররা খুব সহজেই ইয়ানের অপশন কোড কাজে লাগিয়ে থীম অপশন্‌স পাতা তৈরি করতে পারবেন, এবং Editor অ্যাকাউন্টকেও তা ব্যবহারের পূর্ণ অধিকার দিতে পারবেন। 🙂</p>



<p><strong>-মঈনুল ইসলাম</strong><br><img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a rel="noreferrer noopener" href="https://mayeenulislam.github.io/" data-type="URL" data-id="https://mayeenulislam.github.io/" target="_blank">mayeenulislam.github.io</a></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/editors-access-theme-options/">ওয়ার্ডপ্রেস থীম অপশন্‌স &#8220;এডিটর&#8221; অ্যাকাউন্ট উপযোগী করার উপায়</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/editors-access-theme-options/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
