<?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>মাধ্যমিক স্তরের টিউটোরিয়াল Archives &bull; Tuts by Mayeenul Islam</title>
	<atom:link href="https://mayeenulislam.github.io/tuts/category/tuts-level/mid-level-tuts/feed/" rel="self" type="application/rss+xml" />
	<link>https://mayeenulislam.github.io/tuts/category/tuts-level/mid-level-tuts/</link>
	<description>Technology Tutorials by Mayeenul Islam</description>
	<lastBuildDate>Sat, 21 Jan 2023 14:45:26 +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>মাধ্যমিক স্তরের টিউটোরিয়াল Archives &bull; Tuts by Mayeenul Islam</title>
	<link>https://mayeenulislam.github.io/tuts/category/tuts-level/mid-level-tuts/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>HTML abbr ট্যাগ, CSS দিয়ে করুন দৃষ্টিনন্দন</title>
		<link>https://mayeenulislam.github.io/tuts/css-tooltip/</link>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Fri, 20 Jan 2023 06:20:17 +0000</pubDate>
				<category><![CDATA[ওয়েব ডিযাইন টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[সিএসএস টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">http://nanodesigns.wordpress.com/?p=210</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/css-tooltip/">HTML abbr ট্যাগ, CSS দিয়ে করুন দৃষ্টিনন্দন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns.jpg"><img decoding="async" width="574" height="158" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns.jpg" alt="CSS-tooltip-how-it-works" class="wp-image-213" title="tool-tip-nanodesigns" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns.jpg 574w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2012/06/tool-tip-nanodesigns-300x83.jpg 300w" sizes="(max-width: 574px) 100vw, 574px" /></a></figure></div>


<p><strong><span lang="BN-BD" style="font-size: 10pt; font-family: 'Siyam Rupali';">জ্ঞানস্তর:</span></strong><span lang="BN-BD" style="font-size: 10pt; font-family: 'Siyam Rupali';"> মাধ্যমিক</span></p>



<p>কোনো একটা লম্বা নামকে সংক্ষিপ্ত করে লেখার দরকার হলো, এজন্য প্রত্যেকটা শব্দের প্রথম অক্ষরগুলো, মানে আদ্যক্ষর নিয়ে, আপনি সেই নামটা তৈরি করলেন, ইংরেজিতে যাকে বলে acronym। যেমন: Bangladesh Agricultural and Rural Development-কে সংক্ষেপে ডাকা হয় BARD বলে; এখানে BARD হলো পুরো নামটার সংক্ষিপ্ত রূপ। ধরা যাক, একটা লেখা লিখছেন, যেখানে বারবার আপনি BARD-ই বলে যাচ্ছেন। কিন্তু একজন পাঠক BARD-এর মানে তো নাও জানতে পারেন। তাই এসব ক্ষেত্রে HTML-এর সহজ একটা কৌশল কাজে লাগানো হয়: <code>&lt;abbr&gt;</code> ট্যাগটি। এর আগে ব্যবহার করা হতো <code>&lt;acronym&gt;</code> ট্যাগটি, যা এখন deprecated বা বাতিল করা হয়েছে।</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/1f6072b6991f5120da7c17f3763454ca">Gist</a>.
</div><figcaption class="wp-element-caption">টুলটিপ দেখানোর জন্য HTML</figcaption></figure>



<p>এই কোডটা ব্যবহার করলে যখনই আপনি GDP কিংবা BARD লেখাটার উপরে মাউস আনবেন, একটু অপেক্ষা করলেই সেখানে একটা বাক্সে দেখাবে BARD-এর মানে, যা আপনি <code>&lt;abbr&gt;</code>-এর title-এ দিয়েছেন। কিন্তু পূর্বনির্ধারিত এই স্টাইলটি অনেকের পছন্দ নাও হতে পারে। সেজন্য নিচের এই CSSটুকু বসিয়ে নিয়ে আপনি আরো দৃষ্টিনন্দন করে নিতে পারেন HTML-এর নিজস্ব টুলটিপকেই। টুলটিপের জন্য অন্য কিছু আবিষ্কার না করে <code>&lt;abbr&gt;</code> ট্যাগ ব্যবহার করাটা Web Accessibility-ও নিশ্চিত করে।</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/1f6072b6991f5120da7c17f3763454ca">Gist</a>.
</div><figcaption class="wp-element-caption">টুলটিপ দেখানোর জন্য CSS</figcaption></figure>



<p>কেমন লাগলো, আর কাজে লাগলো কিনা অবশ্যই জানাতে ভুলবেন না। আর, আরো আরো সিএসএস প্রোপার্টি যোগ করে নতুন নতুন কিছু পরীক্ষা-নিরীক্ষা চালান, একটু opacity প্রয়োগ করে দেখুন… নতুন কিছু বের করতে পারলেও আমাদের সাথে শেয়ার করুন।</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 href="https://mayeenulislam.github.io/" target="_blank" rel="noreferrer noopener">mayeenulislam.github.io</a></p>



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



<p><span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';"><strong>মূলসূত্র:</strong></span> <span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';">পোস্টটা লিখতে এর মূল তথ্য গ্রহণ করা হয়েছে </span><span style="font-size: 11pt; line-height: 115%; font-family: 'Calibri', 'sans-serif';"><span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';">একটি তৃতীয় পক্ষীয় টিউটোরিয়াল</span></span><span lang="BN-BD" style="font-size: 10pt; line-height: 115%; font-family: 'Siyam Rupali';"> থেকে, যে লিংকটি বর্তমানে লভ্য নয়। তবে সেখানকার কোডগুলো ঝামেলা করে বলে তা সংশোধন ও পরিমার্জন করতে সহায়তা নেয়া হয়েছে সফ্‌টওয়্যার ইঞ্জিনিয়ার অমিত চৌধুরীর। কৃতজ্ঞতা তাই এঁদের প্রতি। মূল লেখাটি অনেক বছর আগে লেখা ছিলো, সেখানকার deprecated কোড সরিয়ে সাম্প্রতিক কোড যোগ করা হয়েছে।</span></p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/css-tooltip/">HTML abbr ট্যাগ, CSS দিয়ে করুন দৃষ্টিনন্দন</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
		
		
			</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>গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</title>
		<link>https://mayeenulislam.github.io/tuts/git-branching/</link>
					<comments>https://mayeenulislam.github.io/tuts/git-branching/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sun, 21 Feb 2016 15:45:12 +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=850</guid>

					<description><![CDATA[<p>গিট দিয়ে ভার্ষন নিয়ন্ত্রণ যখন জেনে গেছি, তখন গিট দিয়ে ব্রাঞ্চ বা শাখা তৈরি করার সহজ কিন্তু অপূর্ব আর শক্তিশালী ফিচারটা জেনে নেয়া যায়ই... স্বাগতম</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/git-branching/">গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>গিট নিয়ে ভয়-ভীতি আমরা এবারে কাটিয়ে উঠেছি। এখন সময় এসেছে এর নতুন নতুন ফিচার জানার। তাই এই ধারাবাহিক আলোচনাকে &#8220;একেবারে প্রাথমিক জ্ঞান&#8221; আর বলছি না, বরং গিট নিয়ে খেলাধুলা বলা যেতে পারে। কিন্তু যারা এখনও গিট নিয়ে ভয়-ভীতি কিংবা দোটানার মধ্যে আছেন, এবারে তাদেরকে অনুরোধ করবো আমাদের পূর্বতন দুটো টিউটোরিয়াল দেখে নেয়ার জন্য, আগে (কথা দিচ্ছি এর চেয়ে সহজ করে কেউ বলবে না কখনও):</p>



<ul>
<li><a href="https://mayeenulislam.github.io/tuts/git-basics-1/" target="_blank" rel="noreferrer noopener">গিট ব্যবহারের একেবারে প্রাথমিক জ্ঞান : পর্ব ১</a>, এবং</li>



<li><a href="https://mayeenulislam.github.io/tuts/git-basics-2/" target="_blank" rel="noreferrer noopener">গিট ব্যবহারের একেবারে প্রাথমিক জ্ঞান : পর্ব ২</a></li>
</ul>



<p>এবারে আমরা জানি গিট কাকে বলে, কত প্রকার, কী কী 🙂 । তাই আজকে আমরা আলোচনা করছি গিট ব্রাঞ্চিং নিয়ে।</p>



<p>অন্যান্য ভার্ষন নিয়ন্ত্রণ সফ্‌টওয়্যারের সাথে গিট-এর পার্থক্য করতে গেলে অনেককেই বলতে শুনি যে, গিটে ব্রাঞ্চিং যথেষ্ট cheap। এই cheap কথাটার&nbsp;মানে যেমন স্বল্প খরচসাপেক্ষ, তেমনি এর দ্বারা বোঝায় এটা যথেষ্ট সহজ, দ্রুত এবং ঝামেলাহীনও। স্বস্তা, কারণ খুব অল্প রিসোর্স ব্যবহার করেই গিট ব্রাঞ্চিং করা যায় অগণিত।</p>



<p>কী এই গিট ব্রাঞ্চিং? ব্রাঞ্চ শব্দটা শুনলেই ব্যাংকের ব্রাঞ্চের কথা মনে হয় না? ঠিকই আছে। ব্রাঞ্চিং সেরকমইতো।&nbsp;এবারে একটা ঘটনা দেখা যাক:</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.jpg" rel="attachment wp-att-853"><img decoding="async" width="200" height="300" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-200x300.jpg" alt="গিট-এ ব্রাঞ্চিং-এর সহজ চিত্র" class="wp-image-853" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-200x300.jpg 200w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.jpg 668w" sizes="(max-width: 200px) 100vw, 200px" /></a><figcaption class="wp-element-caption">গিট-এ ব্রাঞ্চিং-এর সহজ চিত্র</figcaption></figure></div>


<p>আমি <strong>মূল রাস্তা</strong> ধরে হাঁটছি। আমার সাথে <strong>২জন</strong>&nbsp;বন্ধু আছেন।</p>



<p>আমি মূল রাস্তা ধরে আরো এক মাইল এগোলাম, এবারে আমার সাথে আরো ২জন&nbsp;বন্ধু যোগ দিলেন।&nbsp;অর্থাৎ মোট বন্ধুর সংখ্যা&nbsp;<strong>৪জন</strong>।</p>



<p>এবারে আমি রাস্তা বদল করলাম। <strong>ডানের গলি</strong>তে ঢুকে গেলাম। এই গলিতে আমি আরো ২জন&nbsp;বন্ধু জুটিয়ে নিলাম। মোট বন্ধু: [আগের] ৪জন + [নতুন] ২জন = <strong>৬জন</strong>।</p>



<p>আরো এক মাইল এগোলাম, আরো ৪জন&nbsp;বন্ধু জুটিয়ে&nbsp;নিলাম, মোট বন্ধু&nbsp;হলেন ৬+৪=<strong>১০জন</strong>।</p>



<p>এমন সময় হঠাৎ, পথে আপনার সাথে দেখা। আপনি জিজ্ঞেস করলেন, আপনি এই রাস্তায় কেন? আপনার মূল রাস্তা কোথায়? আমি বললাম, সেটাতো ফেলে এসেছি। আপনি বললেন, বাহ, দারুণ! ১০জন বন্ধু নিয়ে পথ চলছেন!&nbsp;<strong>মূল রাস্তা</strong>তে&nbsp;আপনার কয় জন বন্ধু&nbsp;ছিলেন? বললাম, ৪জন। কেন, ১০জন নয় কেন? কারণ, বাকি ৬জন যে আমি <strong>ডানের গলি</strong>তে পেয়েছি।</p>



<p>হ্যা, ব্রাঞ্চিং-এর ক্ষেত্রে এই ব্যাপারটাই ঘটে। যতক্ষণ পর্যন্ত আপনি মূল রাস্তা ধরে হাঁটছেন, ততক্ষণ পর্যন্ত যা ঘটেছে, গলিপথে বা শাখা পথে ঢোকার সময় শাখা পথ কিন্তু ততটুকুর খবরই জানে। আর গলিপথে ঢুকে আপনি কতটুকু এগিয়েছেন, কী করেছেন, মূল পথ কিন্তু তার খবর জানে না।</p>



<p>স্বস্তাশ্রেণীর&nbsp;একটা উদাহরণ হয়ে গেল, তবু এটা বুঝলে ব্রাঞ্চিং-এর কিছুটা ধারণা পাওয়া যাবে। &#8230;কথা না বাড়িয়ে এবারে হাত নোংরা করা যাক&#8230;</p>



<p></p>



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



<h3>গিট ব্রাঞ্চ তৈরি করা</h3>



<p>নিজের কম্পিউটারে&nbsp;একটা ডিরেক্টরি (ফোল্ডার)&nbsp;তৈরি করি test নামে। এই ডিরেক্টরিতে ১টা&nbsp;ফাইল তৈরি করি <code>index.html</code> এবং সেই ফাইলে কিছু একটা লিখে দিই।&nbsp;যা ইচ্ছা লিখতে না চাইলে নিচের মতো লিখে একটা ভ্যালিড HTML ফাইল বানিয়ে নেয়া যেতে পারে:</p>



<pre class="wp-block-preformatted">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
   &lt;head&gt;
      &lt;meta charset="UTF-8"&gt;
      &lt;title&gt;Testing Git Branching&lt;/title&gt;
   &lt;/head&gt;
   &lt;body&gt;
      &lt;h1&gt;Testing Git Branching&lt;/h1&gt;
   &lt;/body&gt;
&lt;/html&gt;</pre>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit.png" rel="attachment wp-att-856"><img decoding="async" width="300" height="221" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit-300x221.png" alt=" গিট রেপোযিটরি তৈরি এবং প্রথম কমিট করা" class="wp-image-856" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit-300x221.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit-768x567.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-init-and-first-commit.png 810w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption"><strong>পর্দাদৃশ্য ১:</strong> গিট রেপোযিটরি তৈরি এবং প্রথম কমিট করা</figcaption></figure></div>


<p>ব্রাউযারে <code>index.html</code> ফাইলটা খুললে দেখা যাবে, সাদা দৃশ্যপটে কালো লেখা স্পষ্ট দেখা যাচ্ছে। এবারে সেই ডিরেক্টরি-পাথে git bash চালু করি (মাউসের ডান বোতামে git bash here চেপে &#8211; <a href="https://mayeenulislam.github.io/tuts/git-basics-2/" target="_blank" rel="noreferrer noopener">বিস্তারিত</a>)। যেহেতু এটা শ্রেফ একটা ডিরেক্টরি, তাই একে আগে গিট রেপোযিটোরিতে রূপান্তর করি: ব্যাশ-এ লিখি: <code>git init</code>। ব্যস, আমাদের ১টা ফাইলসমৃদ্ধ ডিরেক্টরিটা একটা গিট রেপোযিটোরিতে বদলে গেলো। আমরা এবারে আমাদের প্রথম commit করি, মানে আক্ষরিক অর্থে ভার্ষন নিয়ন্ত্রণ শুরু করি&#8230;। (দেখুন <strong>পর্দাদৃশ্য ১</strong>)</p>



<p>ভালো করে খেয়াল করে দেখুন, ঠিক প্রথম লাইনটার পরে পরের লাইনগুলোতে কোনো বিশেষ কিছু আপনার চোখে পড়ছে কিনা&#8230; &#8216;<strong><span style="color: #00ccff;">(master)</span></strong>&#8216; কথাটা যোগ হয়েছে প্রথম লাইনের পরে, এবং সেটা প্রতিবারই আপনার সাথে সাথে চলছে।</p>



<p>কী এই master?</p>



<h4><strong>কমান্ড: <code>git branch</code></strong></h4>



<p>কমান্ড দিই:</p>



<pre class="wp-block-preformatted">$ git branch</pre>



<p>অর্থাৎ, আমরা গিটকে বললাম, গিট তোমার ব্রাঞ্চের খবর জানাও। এবারে সে আমাদের দেখাবে:</p>



<pre class="wp-block-preformatted">* master</pre>



<p>আবারো সেই master।&nbsp;মানে সে জানালো, তোমার ব্রাঞ্চ বা শাখা হচ্ছে master। ঠিকইতো আছে, এখনও তো আমি মূল রাস্তায় আছি। তো আমাকে যদি কেউ জিজ্ঞেস করে, কোন রাস্তায়? আমি বলবো, মূল রাস্তায় (master)&nbsp;&#8211;&nbsp;এর বাইরে তো কিছু বলার প্রশ্নই উঠে না, তাই না?</p>



<p>এবারে চলুন আমরা ব্রাঞ্চ তৈরি করে দেখি&#8230; ধরা যাক, আমরা ঠিক করলাম, এবারে আমরা এই প্রোজেক্টে কিছু স্টাইলিং যোগ করবো। কিন্তু মূল প্রোজেক্টটাতে সেই স্টাইলিং নিবো কি নিবো না, তা এখনও সিদ্ধান্ত নিতে পারিনি আমরা। হয়তো, এমন হতে পারে, স্টাইল ছাড়াই প্রোজেক্টটা আমাদের ঠিকই আছে। কিন্তু স্টাইল করলে কেমন লাগবে, সেটা একটু পরখ করে দেখতেও চাচ্ছি। যদি ভালো লেগে যায়, তাহলে কাজে লাগালেও লাগাতে পারি আমরা। &#8230;তো এরকম অবস্থায় আমরা style নামে একটা ব্রাঞ্চ তৈরির সিদ্ধান্ত নিয়েছি।</p>



<h4><strong>কমান্ড: <code>git branch &lt;branch-name&gt;</code></strong></h4>



<p>ব্যাশে লিখলাম:</p>



<pre class="wp-block-preformatted">$ git branch style</pre>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.png" rel="attachment wp-att-865"><img decoding="async" width="300" height="211" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-300x211.png" alt="পর্দাদৃশ্য ২: গিট ব্রাঞ্চিং" class="wp-image-865" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching-300x211.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/git-branching.png 675w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption"><strong>পর্দাদৃশ্য ২:</strong> গিট ব্রাঞ্চিং</figcaption></figure></div>


<p>সে আমাদের কিছু না বললেও আসলে style নামে একটা ব্রাঞ্চ তৈরি করা শেষ। আপনার নামের ডানদিকে, এখনও দেখুন (master) কথাটাই আছে, তার মানে আমরা এখনও master ব্রাঞ্চেই রয়েছি। কিন্তু আমাদেরতো নতুন খোলা style ব্রাঞ্চে কাজ করার কথা। আসুন তবে নতুন পথ ধরি&#8230;</p>



<h3>গিট ব্রাঞ্চ অদলবদল</h3>



<h4><strong>কমান্ড: <code>git checkout&nbsp;&lt;branch-name&gt;</code></strong></h4>



<p>ব্যাশে লিখি:</p>



<pre class="wp-block-preformatted">$ git checkout style</pre>



<p class="has-background" style="background-color:#c2ecdb"><strong>টিপ্‌স:</strong><br>ব্রাঞ্চ তৈরি আর বদল করার জন্য দুটো কমান্ড শিখেছি। শর্টকাটে একটা কমান্ড দিয়েও কাজটা করা যায়, লিখতে হবে:<br><code>git checkout -b &lt;branch-name&gt;</code></p>



<p>সে বলছে, হ্যা, style ব্রাঞ্চে বদলে নিয়েছি। আমরা কিন্তু এবারে নতুন রাস্তায় উঠে গেছি। নতুন রাস্তাকে যদি জিজ্ঞেস করি, তোমার কাছে&nbsp;কয়টা ফাইল আছে? বলবে, ১টা (<code>index.html</code>)। তোমার কাছে কয়টা commit রেকর্ড আছে?&nbsp;বলবে, ১টা। আমরা যে আসলেই master ব্রাঞ্চ থেকে বদলে style ব্রাঞ্চে চলে এসেছি, সেটা আমরা এবারে নিজের নামের ডানদিকে দেখতেও পাচ্ছি, (master) নামটা বদলে &#8216;<strong><span style="color: #00ccff;">(style)</span></strong>&#8216; হয়ে গেছে। তবু আমরা একটু যাচাই করে দেখলাম:</p>



<pre class="wp-block-preformatted">$ git branch
  master
* style</pre>



<p>আশা করি বুঝে গেছি যে, ঐ স্টারটা (asterisk &#8211; <code>*</code>) আসলে আমাদের দেখায় আমার সক্রীয় ব্রাঞ্চ কোনটা।</p>



<p>এবারে আমাদের ডিরেক্টরিতে (ফোল্ডারে)&nbsp;একটা ফাইল তৈরি করলাম, <code>style.css</code> এবং তাতে লিখলাম:</p>



<pre class="wp-block-preformatted">body{
&nbsp; &nbsp;background-color: black;
&nbsp; &nbsp;color: white;
}
</pre>



<p>আর <code>index.html</code> ফাইলটা খুলে স্টাইলশিটটা লিংক&nbsp;করে দিলাম, <code>&lt;title&gt;</code> ট্যাগের ঠিক নিচেই লিখলাম:</p>



<p><code>&lt;link rel="stylesheet" href="style.css"&gt;</code></p>



<p>ব্যস, আমাদের সাইটে একটা দারুণ স্টাইলিং করা হয়ে গেল 🙂 ।</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch.png" rel="attachment wp-att-864"><img decoding="async" width="300" height="235" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch-300x235.png" alt="পর্দাদৃশ্য ৩: গিট ব্রাঞ্চে কাজ করা" class="wp-image-864" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch-300x235.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch-768x602.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/02/working-on-git-branch.png 810w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption"><strong>পর্দাদৃশ্য ৩:</strong> গিট ব্রাঞ্চে কাজ করা</figcaption></figure></div>


<p>এবারে ব্যাশে <code>git status</code> জানতে চাইলে দেখাবে <code>index.html</code> পরিবর্তন হয়েছে, আর <code>style.css</code> নতুন যোগ হয়েছে, তাই untracked। আমরা সব পরিবর্তনকে স্টেজ করে তারপর আরেকটা কমিট করি (ধরা যাক, কমিট বার্তা দিয়েছি: &#8220;styles added&#8221;)। এবারে গিটের লগ (কমান্ড: <code>git log</code>) পরখ করলে দেখা যাবে দুটো কমিট হয়েছে:</p>



<ul>
<li>একটা কমিট হয়েছিল master ব্রাঞ্চে থাকা অবস্থায় (বার্তা: &#8220;Initial Commit&#8221;)</li>



<li>আরেকটা কমিট এইমাত্র করলাম, style ব্রাঞ্চে থাকা অবস্থায় (বার্তা: &#8220;styles added&#8221;)</li>
</ul>



<p>আমরা যা শিখেছিলাম, সব মিলে গেল। মূল রাস্তা পর্যন্ত যা যা হয়েছিল, সব শাখা রাস্তায় এসেছে। আর শাখা রাস্তায়ও নতুন বন্ধু জুটিয়ে নিয়েছি (নতুন ফাইল কিংবা নতুন লাইন কিংবা পরিবর্তিত লাইন)। ব্রাউযারে <code>index.html</code> ফাইলটা খুললে দেখা যাবে, কালো দৃশ্যপটে সাদা লেখা স্পষ্ট দেখা যাচ্ছে।</p>



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



<p>আসল মজাটা এখনও শুরু হয়নি। আসল মজাটা দেখা যাবে, যদি আমরা এখন আবার master ব্রাঞ্চে ফিরে যাই। ব্যাশ খুলে লিখলাম:</p>



<pre class="wp-block-preformatted">$ git checkout master</pre>



<p>master ব্রাঞ্চে নিয়ে চলো। সে বরাবরের মতোই বলবে:</p>



<pre class="wp-block-preformatted">Switched to branch 'master'</pre>



<p>হ্যা, master ব্রাঞ্চে, মানে মূল রাস্তায় ফিরে এসেছি। এবারে ডিরেক্টরিটা (ফোল্ডার) খুলে একটু দেখুন তো&#8230;</p>



<p><span style="color: #ff6600;"><em>অ্যাবরাক্যাডাবরা! ছুহ মন্তর ছুহ, যাদু মন্তর ছুহ!</em></span></p>



<p>আমাদের <code>style.css</code> হাওয়ায় মিলিয়ে গেছে। শুধু তা-ই নয়, <code>index.html</code> ফাইলটা খুলে দেখুন, স্টাইলশিটটা লিংক করেছিলেন যে লাইন লিখে, সেই লাইনটিও নেই। কী মনে করে ব্রাউযার খুলে দেখলেন, কালো রঙের ব্যাকগ্রাউন্ডও হাওয়া। মাথায় হাত:&nbsp;<em>হায়, হায়! আমার এতো কষ্টের কোড সব মুছে ফেললো গিট!</em></p>



<p>না বৎস, ধৈর্য্যই ধর্ম্ম!</p>



<p>গিট একেবারে ঠিক কাজটিই করেছে। আপনি গিটকে জিজ্ঞেস করেছেন, গিট তোমার মূল রাস্তার খবর বলো। সে বলছে, ১টা ফাইল, আর ১০ লাইনের কোড। বাকি যা যা যোগ করেছিলেন এই রেপোযিটোরিতে, সব করেছেন নতুন রাস্তায় গিয়ে। পরে যে রাস্তা যোগ হয়েছে, আগের রাস্তা তার খবর কী করে রাখবে? তাই সে আসলে নতুন রাস্তার খবর জানে না। &#8230;শান্ত হোন, আপনার কোড হারিয়ে যায়নি। আপনার কোড এখনও নতুন রাস্তায় আছে ঠিকই। আবারও যদি নতুন রাস্তায় ঘুরতে যান, ঠিকই সবকিছু ঠিকঠাক পাবেন, সেখানকার বন্ধুদেরও পাবেন। ব্যাশে লিখুন:</p>



<pre class="wp-block-preformatted">$ git checkout style</pre>



<p>দেখুন তো সব ফিরে এসেছে কিনা? &#8230;এবার একটু প্রাণ খুলে হাসুন 😀 ।</p>



<p>আমি যখন প্রথম ব্যাপারটা লক্ষ করেছিলাম, আমি ব্যাশটাকে একপাশে এমনভাবে সরিয়ে রেখেছিলাম, যাতে মনিটরের আরেক পাশে ডিরেক্টরিটাও দেখতে পারি। তারপর ব্রাঞ্চ থেকে ব্রাঞ্চে একটু চেকআউট করে এই মজার দৃশ্য দেখেছিলাম মন ভরে। দারুণ লেগেছিল ব্যাপারটা আমার কাছে। 🙂</p>



<p>ব্যস, ব্রাঞ্চিং শেখা শেষ।</p>



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



<h3>গিট ব্রাঞ্চ মিশিয়ে&nbsp;নেয়া</h3>



<p>এবারে যদি আপনার style ব্রাঞ্চে করা স্টাইলগুলো দেখে আপনার মন পরিবর্তন করেন, চিন্তা করেন যে, <em>নাহ্‌! ভালোইতো লাগছে কালো ব্যাকগ্রাউন্ডটা</em> (নতুন রাস্তার বন্ধুরা তো ভালো মানুষই)। এক কাজ করি না কেন, মুল প্রজেক্টেই নিয়ে আসি না কেন (মূল রাস্তায়ই নিয়ে আসি বন্ধুদের)? যেই ভাবা, সেই কাজ। আপনি এবারে আপনার style ব্রাঞ্চটিকে master ব্রাঞ্চের সাথে মিলিয়ে নিবেন (merge করবেন)।</p>



<h4><strong>কমান্ড: <code>git merge&nbsp;&lt;branch-name&gt;</code></strong></h4>



<p>গাছের একটা ডাল কাটবেন, তো সেটা কি ডালে বসে কাটবেন, নাকি গাছের কান্ডে বসে কাটবেন?&nbsp;&#8230;তো সেজন্যই আগে কান্ডে ফিরে আসুন (মানে যে ব্রাঞ্চের মধ্যে অন্য ব্রাঞ্চটাকে মিলিয়ে নিতে চলেছেন)। আর তারপর ডালটার বিহিত করুন (master ব্রাঞ্চে style ব্রাঞ্চটা মার্জ্‌ করুন):</p>



<pre class="wp-block-preformatted">$ git checkout master
$ git merge style</pre>



<p>এতে সে দেখাবে: <em>এই হয়েছে, সেই হয়েছে, তোমার দুটো ব্রাঞ্চ মার্জ করে ফেলেছি।</em> অর্থাৎ style ব্রাঞ্চে যা যা করেছিলে, এখন তা হুবহু master ব্রাঞ্চেও যোগ/বিয়োগ করে মিলিয়ে নিয়েছি। তোমার সবকিছু রেডি। ব্যাশে লক্ষ করুন, আপনি এখন master ব্রাঞ্চে আছেন। ডিরেক্টরিতে লক্ষ করুন, style.css ফাইলটা দেখা যাচ্ছে। এই অবস্থায় আপনি ব্রাউযার রিলোড করে দেখুন, আপনার ওয়েবসাইট কালো ব্যাকগ্রাউন্ডে সাদা লেখা দেখাচ্ছে।</p>



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



<h3>গিট ব্রাঞ্চ&nbsp;রিমোটে তোলা</h3>



<p>যদি আপনি আপনার রেপোযিটরিটা সার্ভারে কোথাও ব্যাকআপ রাখেন, হতে পারে সেটা github, gitlab, bitbucket, meat ইত্যাদি আপনার নিজস্ব git সার্ভার কিংবা শ্রেফ কোনো শেয়ার্ড রেপোযিটরি। আমরা বোধহয় আলাদা করে গিট রিমোট যোগ করা দেখিনি। খুবই মামুলি কাজ, আমরা এবারে সেটা করে নিই। ধরা যাক, আমাদের গিটহাবে একটা রেপোযিটরি আছে test নামে, তার পাথটা নিলাম, তারপর ব্যাশে লিখলাম:</p>



<pre class="wp-block-preformatted">$ <span class="user-select-contain">git remote add origin <span class="js-git-clone-help-text">https://github.com/mayeenulislam/test.git</span></span></pre>



<p>ব্যস, তাতেই হয়ে গেল। origin নামে আমাদের একটা রিমোট যোগ হয়ে গেল, অর্থাৎ একটা সার্ভার কানেক্ট করে ফেললাম আমরা আমাদের এই রেপোযিটরিতে। এবারে আমরা চাচ্ছি, আমাদের style ব্রাঞ্চটা [মার্জ করি বা না করি], সেটা সার্ভারেও তুলে দিতে।</p>



<h4><strong>কমান্ড: <code>git push&nbsp;&lt;remote-name&gt; &lt;branch-name&gt;</code></strong></h4>



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



<pre class="wp-block-preformatted"><span class="user-select-contain">$ git push origin master</span>
$ git push origin style</pre>



<p>প্রথমে&nbsp;আমরা master ব্রাঞ্চটাকে ধাক্কা দিয়ে তুলে তারপর style ব্রাঞ্চটাকে ধাক্কা দিয়ে তুলে দিচ্ছি। (ইউযারনেম, পাসওয়ার্ড চাইলে দিয়ে দিতে হবে)</p>



<p>ব্রাঞ্চগুলোকে একবার পরখ করে দেখে নেয়া যেতে পারে:</p>



<pre class="wp-block-preformatted"><span class="user-select-contain">$ git branch --all</span>
* master
  style
  remotes/origin/master
  remotes/origin/style</pre>



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



<h3>গিট ব্রাঞ্চ&nbsp;মুছে ফেলা</h3>



<p>যেহেতু আমাদের style ব্রাঞ্চের কাজটা আমরা মূল ব্রাঞ্চে (master) মিশিয়ে নিয়েছি, আর ঐ ব্রাঞ্চ নিয়ে কাজ করারও ইচ্ছে নেই, তাই এখন আমরা চাইলে ব্রাঞ্চটা মুছে ফেলতে পারি। নতুন রাস্তার বন্ধুরা যদি আমার রাস্তায় চলে আসে, নাইবা থাকলো সে নতুন রাস্তা। 🙂</p>



<h4><strong>কমান্ড: <code>git branch -d&nbsp;&lt;branch-name&gt;</code></strong></h4>



<p>মুছে ফেলার কাজটা খুব সোজা, কান্ডে থাকা অবস্থায় কিন্তু ডাল কাটতে হবে, অর্থাৎ master ব্রাঞ্চে থাকা অবস্থায় শাখা মুছে ফেলার কমান্ড দিতে হবে:</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><br>ব্রাঞ্চ ডিলিট করার জন্য -d লেখাটা নিরাপদ। এতে সে মার্জ করতে না পারলেও কারণ দেখাবে। আর যদি আমরা -d না লিখে -D লিখতাম, তাহলে কিন্তু সে জোর করে ব্রাঞ্চটা ডিলিট করে দিত।</p>



<pre class="wp-block-preformatted">$ git branch -d style</pre>



<p>অর্থাৎ, গিট, style ব্রাঞ্চটাকে মুছে ফেলো তো। এতে সে লোকাল রেপোযিটরি থেকে style ব্রাঞ্চটা মুছে ফেলবে। পরখ করে দেখে নিতে পারেন:</p>



<pre class="wp-block-preformatted"><span class="user-select-contain">$ git branch --all</span>
* master
  remotes/origin/master
  remotes/origin/style</pre>



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



<p>সার্ভারের style ব্রাঞ্চটা মুছে ফেলা খুব সোজা। শুধু লোকালের style ব্রাঞ্চটা সার্ভারে একটু কেরামতি করি তুলে দিলেই হলো।</p>



<h4><strong>কমান্ড: <code>git push &lt;remote-name&gt;&nbsp;:&lt;branch-name&gt;</code></strong></h4>



<p>তাহলে আমাদের origin রিমোট থেকে style ব্রাঞ্চটি মুছে ফেলতে লিখতে হবে:</p>



<pre class="wp-block-preformatted">$ git push origin :style</pre>



<p>ব্রাঞ্চের নামের আগে কোলন (<code>:</code>) খেয়াল করবেন কিন্তু। এটা হচ্ছে <code>true</code>&#8216;র প্রতীক।</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><br>গিট ব্রাঞ্চিং ব্যবহার করার সময় খুব সতর্ক থাকতে হয় আপনি আসলে&nbsp;<em>কোন</em>&nbsp;ব্রাঞ্চে কাজ করছেন। ধরা যাক আপনি একটা ফিচার ব্রাঞ্চ খুলে কাজ করছিলেন, অথচ সপ্তা’খানেক পরে ভুলে গেলেন সেটা। আপনি অন্য কোনো কাজ ভুলে, এই ব্রাঞ্চে করে যাচ্ছেন অনবরত। অনেকদিন কাজ করার পর মনে পড়লো, হায় হায়, এটা কী করলাম, এই কাজ তো এই ব্রাঞ্চে করার কথা ছিল না। এই এত্তোগুলো কমিট তো এই ব্রাঞ্চে করার কথা ছিল না। তখন হয়তো ফেরা যাবে, কিন্তু সেটা যে বন্ধুর পথ হবে, সেটা আন্দাজ করা যায়।<br><br>এজন্য, যে এডিটর/আইডিই আপনি ব্যবহার করছেন, তাতে গিট ইন্টেগ্রেড করা গেলে খুব কাজের হয়। আর যদি তা না করা যায়, তাহলে প্রতিবার কাজে নামার আগে ব্যাশ খুলে ব্রাঞ্চটা দেখে নেয়ার অভ্যাস করতে পারেন।</p>



<p class="has-background has-small-font-size" style="background-color:#c2ecdb"><strong>আমার অভিজ্ঞতা:</strong><br>যারা আমার মতো LESS বা Sass দিয়ে সিএসএস করেন, তারা কোনো না কোনো কম্পাইলার ব্যবহার করে থাকেন। এই কম্পাইলারগুলো যদি সেটআপ করা থাকে যে স্বয়ংক্রীয়ভাবে কম্পাইল হবে, তাহলে এগুলো ফাইলের modified টাইমস্ট্যাম্পের দিকে খেয়াল রাখে। যদি এধরণের কম্পাইলার সক্রীয় থাকে আর আপনি কম্পাইল করে একটা মিনিফাইড সিএসএস ফাইল তৈরি করে থাকেন, তাহলে ব্রাঞ্চ থেকে ব্রাঞ্চে অদলবদল হবার সময় সে মনে করে ফাইলটা বদলেছে, সাথে সাথে সে একটা কম্পাইল্‌ড সংস্করণ তৈরি করে। এটা ব্রাঞ্চ থেকে ব্রাঞ্চে দৌঁড়াদৌঁড়ির সময় খুবই বিশ্রী রকমের ঝামেলা তৈরি করে। এই ঝামেলা এড়াতে আমি ব্রাঞ্চ বদলের আগে কম্পাইলারটা সাময়িক বন্ধ করে নিই। …আপনাদের কাছে ভালো কোনো সমাধান থাকলে, তা মন্তব্য করে জানালে খুব উপকার হবে।</p>



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



<p>ব্যস, গিট ব্রাঞ্চিং-এর প্রাথমিক আলোচনা শেষ। এবারে এই জ্ঞানকে আরো বাড়িয়ে নিতে হবে। <a href="https://www.youtube.com/watch?v=ZDR433b0HJY" target="_blank" rel="nofollow noopener">স্কট চ্যাকনের যে ভিডিও ইন্ট্রোটা দিয়েছিলাম গত পর্বে</a>, তাতে ব্রাঞ্চিং বিষয়ে আলোচনা আছে বিস্তারিত। এই আলোচনা আর কিছু অনুশীলনের পরে ঐ ভিডিওটা রীতিমতো চক্ষু-খুলে-দেয়া&#8217;র মতো হবে, কথা দিচ্ছি।</p>



<p>ব্রাঞ্চিং-এ গেলে কিংবা একাধিক ডেভলপার মিলে কাজ করতে গেলে সবচেয়ে বড় যে সমস্যাটার সম্মুখিন সবাই হয়, তা হলো merge conflict বা মেশানোতে&nbsp;সংঘর্ষ। এই মার্জ কনফ্লিক্ট, কলেবোরেট করে, মানে একাধিক ডেভলপার মিলে ঝামেলা না করে কাজ করা বিষয়ে আরেকটা আলোচনার জোর দাবি রাখে। আগামী কোনো পর্বে সেটা নিয়ে আলোচনা করার আশা রাখি, ইনশাল্লাহ। সেদিন আমরা সহজে বোধগম্য কোনো গিট মডেল নিয়ে আলোচনা করতে পারি, যা আমাদের কাজকে আরো ঝামেলাহীন করে কলেবোরেটিভ কোড করতে সহায়তা করবে।</p>



<h3>আরো গভীরে জানা যাক:</h3>



<ol>
<li><a href="https://git-scm.com/book/en/v2/Git-Branching-Branch-Management" target="_blank" rel="nofollow noopener">Git Branching &#8211; Branch Management &#8211; Git^</a> &#8211; Scott Chacon-এর বই</li>



<li><a href="http://makandracards.com/makandra/621-git-delete-a-branch-local-or-remote" target="_blank" rel="nofollow noopener">Git: Delete a branch (local or remote)^</a> &#8211; Tobias Kraze</li>



<li><a href="http://stackoverflow.com/q/24582319/1743124" target="_blank" rel="nofollow noopener">Branching and merging best practices in Git^</a> &#8211; StackOverflow</li>
</ol>



<p><small>প্রচ্ছদের ছবি:&nbsp;chloepettersson.com থেকে নেয়া ছবি ও অন্যান্য গিট ব্রাঞ্চিং মডেলের মন্তাজ।</small></p>



<p><strong>হালনাগাদ:</strong> ৩১ জানুয়ারি ২০১৭</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/git-branching/">গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#8211; git branch</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/git-branching/feed/</wfw:commentRss>
			<slash:comments>1</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>পিএইচপি লুপ দিয়ে কলাম তৈরি &#8211; ২ কলাম, ৩ কলাম এবং যত ইচ্ছা</title>
		<link>https://mayeenulislam.github.io/tuts/columns-php-loop/</link>
					<comments>https://mayeenulislam.github.io/tuts/columns-php-loop/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Fri, 14 Feb 2014 14:38:50 +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=417</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/columns-php-loop/">পিএইচপি লুপ দিয়ে কলাম তৈরি &#8211; ২ কলাম, ৩ কলাম এবং যত ইচ্ছা</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/banner-php-column-nanodesigns.jpg"><img decoding="async" width="800" height="300" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/banner-php-column-nanodesigns.jpg" alt="Column Design using PHP-CSS by nanodesigns" class="wp-image-430" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/banner-php-column-nanodesigns.jpg 800w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/banner-php-column-nanodesigns-300x113.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/banner-php-column-nanodesigns-768x288.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure></div>


<p><strong>জ্ঞানস্তর:</strong> মাধ্যমিক</p>



<p class="has-text-align-center"><strong>লক্ষ্যণীয়:</strong> এই আলোচনায় ধরে নেয়া হয়েছে যে, পাঠকের পিএইচপি কন্ডিশনাল স্টেটমেন্ট এবং লুপ সম্পর্কে প্রাথমিক ধারণা রয়েছে।</p>



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



<p>আমরা এরকম একটি অতি সাধারণ <tt>for loop</tt> নিলাম, যেখানে কিছু CSS ব্যবহার করে আমরা একটা প্রাথমিক চেহারা দাঁড় করাবো বিষয়টা বোঝার জন্য।</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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">PHP ব্যবহার করে লুপ চালিয়ে লেখা দেখানো</figcaption></figure>



<p>আমরা এজন্য কিছু CSS লিখলাম, যাতে বিষয়টা একটু বোধগম্য হয়, এই সিএসএস-এর সাথে কলামের এখনও কোনো সম্পর্ক নেই; আমরা আসলে, কলামটা যে ঠিকমতো কাজ করছে, সেটা যাতে বুঝতে পারি, তারই জন্য একটা প্রস্তুতি নিচ্ছি মাত্র।</p>



<span id="more-417"></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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">আমাদের লুপের লেখাগুলোকে একটু ডিযাইন করলাম আমরা</figcaption></figure>



<p>এবারে পাতাটা যদি আমরা ব্রাউযারে রান করি, তাহলে তা দেখা যাবে এরকম:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-1.jpg"><img decoding="async" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-1-1024x357.jpg" alt="আমাদের ডিভগুলোর প্রাথমিক চেহারা (nanodesigns)" class="wp-image-422"/></a><figcaption class="wp-element-caption">আমাদের div-গুলোর প্রাথমিক চেহারা</figcaption></figure></div>


<p>আমরা জানি পিএইচপি লুপ দিয়ে একইরকমের কাজের পুণরাবৃত্তি করা যায়। যেমন: আমরা এখানে মাত্র একটাই <tt>content-body</tt> ডিভ ৫ বার দেখিয়েছি। আমরা আগেই বলেছি, কলাম করার জন্য এটা শ্রেফ প্রস্তুতি, এবারে আমরা এই কোড দিয়েই কলাম তৈরি করবো। লক্ষ করলে দেখবেন test নামক ক্লাস দিয়ে একটা ডিভ রেখেছি, এখানে আমরা বিভিন্ন পরীক্ষা-নিরীক্ষাগুলো করবো, যে পরীক্ষা-নিরীক্ষাগুলো আমরা ব্রাউযারে দেখবো।</p>



<h3><strong>২ কলাম তৈরি</strong></h3>



<p>কলাম তৈরি করার জন্য একটু ছোটবেলায় ঢু মেরে আসা যাক। আচ্ছা&#8230;, ভাগ অংকের কথা মনে আছে? একটু দেখা যাক। ৪-কে ২ দিয়ে ভাগ করুন। না না না না, ক্যালকুলেটর দিয়ে ভাগ করলে হবে না, একটু হাতে-কলমে করুন। করা হয়ে গেলে, এরপর ৩-কে ২ দিয়ে ভাগ করুন।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-ramainder.jpg"><img decoding="async" width="360" height="215" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-ramainder.jpg" alt="ভাগ অংক - যেখানে ভাগশেষ বলে একটা কিছু ছিল :)" class="wp-image-419" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-ramainder.jpg 360w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-ramainder-300x179.jpg 300w" sizes="(max-width: 360px) 100vw, 360px" /></a><figcaption class="wp-element-caption">ভাগ অংক &#8211; যেখানে ভাগশেষ বলে একটা কিছু ছিল 🙂</figcaption></figure></div>


<p>বিষয়টা কী হলো? ৪-কে ২ দিয়ে ভাগ দেয়ায় তা দেয়া গেলো, অর্থাৎ ৪, ২ দিয়ে নিঃশেষে বিভাজ্য। কিন্তু ৩-কে ২ দিয়ে ভাগ দেয়া গেলো না, কারণ তাতে ১ ভাগশেষ হিসেবে অবশিষ্ট থাকে। হ্যা, আমাদের উদ্দেশ্য আসলে ঐ ভাগ অংক শেখানো নয়, বরং ঐ ভাগশেষের সাথে আপনাকে পরিচয় করিয়ে দেয়া, কারণ এই সাধারণ একটা গাণিতিক হিসাব আমাদেরকে কলাম তৈরিতে খুব সহায়তা করবে। এবং মজার ব্যাপার হলো আপনি ক্যালকুলেটরেই ভাগশেষের হিসাব বের করতে পারবেন, তাই মাথা খাটিয়ে অংক করার ঝামেলা নেই, সুতরাং শান্তিই শান্তি!</p>



<p>ক্যালকুলেটরে কিংবা কম্পিউটারে গাণিতিক হিসাবে ভাগশেষকে বলা হয় modulus (উচ্চারণ: <i>মড্যূলাস</i>)। আর ভাগশেষের প্রতীকটা হলো %, একে বলা হয় modulo (উচ্চারণ: <i>মড্যূলো</i>)। অর্থাৎ 4 % 2 = 0 এবং 3 % 2 = 1। তাহলে ক্যালকুলেটরে কিভাবে তা বের করা যায়? এজন্য লাগবে সাইন্টিফিক ক্যালকুলেটর। একজন প্রোগ্রামারের জন্য কম্পিউটারেই আছে একটা ক্যালকুলেটর, সেটাকে সাইন্টিফিক মোডে খুলে নিলেই হবে। সেখানে ভাগশেষকে ইংরেজিতে লেখা আছে Mod। তাহলে করা যাক: 4 Mod 2, আর 3 Mod 2, যথাক্রমে 0 এবং 1 দেখাবে। আমরা কলাম তৈরিতে এই ভাগশেষকে খুব বেশি ব্যবহার করবো।</p>



<p>আমরা যেহেতু ২ কলামের জন্য কোড করছি, ২ কলাম করলে তা কীরকম হবে, সেটা দেখা যাক:</p>



<figure class="wp-block-table"><table><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr><tr><td>5</td><td>&#8230;</td></tr></tbody></table><figcaption class="wp-element-caption">কলামের চেহারাটা যেমন হবে আরকি</figcaption></figure>



<p>এবারে এই সংখ্যাগুলোকে ২ দিয়ে ভাগ করি, যাতে ভাগশেষ জানতে পারি: 1 mod 2 = 1; 2 mod 2 = 0; 3 mod 2 = 1; 4 mod 2 = 0; 5 mod 2 = 1। কী বোঝা গেল? যেহেতু দুটি কলাম, তাই প্রথম ভাগশেষটা ১ এবং দ্বিতীয় ভাগশেষটা শূণ্য &#8211; এই ধারা বজায় রেখেই বারবার তারা ঘুরে ঘুরে আসছে। আমরা আসলে এই সুযোগটারই সদ্ব্যবহার করে আমাদের কলামের জন্য প্রয়োজনীয় ক্লাস লোড করবো।</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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">PHP Loop এবং Modulus ব্যবহার করে ২ কলাম তৈরি</figcaption></figure>



<p>কোডটা লিখে পেজটা রিফ্রেশ করুন&#8230; মজাটা কি এবারে দেখা যাচ্ছে? অবশ্যই দেখা যাচ্ছে। কী দেখা যাচ্ছে?</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-2.jpg"><img decoding="async" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-2-1024x474.jpg" alt="ডিভগুলোতে তাদের ক্রমসংখ্যানুপাতিক ভাগশেষ কেমন আসছে। (nanodesigns)" class="wp-image-423"/></a><figcaption class="wp-element-caption">ডিভগুলোতে তাদের ক্রমসংখ্যানুপাতিক ভাগশেষ কেমন আসছে</figcaption></figure></div>


<p>এখানে দেখতেই পাচ্ছেন, যখন ডিভটা হচ্ছে ‌১ (মানে প্রথম ডিভ), তখন ২ দিয়ে ভাগ করলে তার ভাগশেষটা হচ্ছে ১; যখন ডিভ ২, তখন ২ দিয়ে ভাগ করলে তার ভাগশেষটা ০। প্রশ্ন হচ্ছে আমরা দুই দিয়ে ভাগ করছি কেন?</p>



<p>উত্তরটা খুব সহজ: কারণ আমরা দুই কলাম (2-column code) তৈরি করার জন্য কোড করছি।</p>



<p>এবারে আমরা পরীক্ষা করার জন্য যে লাইনটা লিখেছিলাম, সেটা এখনই ফেলে না দিয়ে ওটা ব্যবহার করে কিছু কন্ডিশন বা শর্ত দেয়া যাক। আমরা জানি, পিএইচপি-তে শর্ত দেয়া মানেই <tt>if-else</tt>-এর ব্যবহার।</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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">PHP Loop এবং Modulus বা ভাগশেষ ব্যবহার করে আলাদা আলাদা ক্লাস লোড করা</figcaption></figure>



<p>আমরা ঐ ভাগশেষকে কাজে লাগিয়ে মাত্র একটা শর্ত দিয়ে কী দারুণভাবে কিছু ডায়নামিক লেখা যোগ করে ফেললাম। আমরা আমাদের <tt>test</tt> ডিভে সেটা দেখতে পাচ্ছি। (<em>দেখার জন্যই তো রেখেছি ওটাকে</em> 🙂 )</p>



<p>শর্তটা হলো:</p>



<p>যদি ডিভটাকে ২ দিয়ে ভাগ করলে ভাগশেষ শূণ্য পাও, তাহলে <tt>$class</tt> ভ্যারিয়েবলে রাখো “ second-div” কথাটা, নাহলে রাখো “ first-div” কথাটা।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-3.jpg"><img decoding="async" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-3-1024x506.jpg" alt="ভাগশেষ অনুসারে আমাদের লোড করা ক্লাসগুলো দেখা যাচ্ছে। (nanodesigns)" class="wp-image-424"/></a><figcaption class="wp-element-caption">ভাগশেষ অনুসারে আমাদের লোড করা ক্লাসগুলো দেখা যাচ্ছে</figcaption></figure></div>


<p>আপনি ব্রাউযারে Inspect Element করলেই আসল মজাটা পাবেন, কারণ দেখতে পাবেন, আপনার <tt>content-body</tt> ক্লাসের পাশে এবারে খুব সুন্দর করে যথাক্রমে <tt>first-div</tt> এবং <tt>second-div</tt> নামে দুটো HTML ক্লাস বসে গেছে। আসলে যে, ঐ <tt>first-div</tt> আর <tt>second-div</tt> কথাটা দুটো ক্লাসের নাম আমরা এখন সেটা বুঝতে পারছি আমরা। এজন্যই নামগুলোর আগে, ডাবল কোটের ভিতরে <strong>একটা স্পেস বা ফাঁকা স্থান রেখে নিয়েছি</strong>, যাতে, যখন তা ক্লাস হিসেবে বসবে, তখন যেন অন্য আরেকটা ক্লাসের সাথে লেগে না যায়, তাহলে কাজ করবে না।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-4.jpg"><img decoding="async" width="337" height="152" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-4.jpg" alt="ডেভলপার টুলে দেখা যাচ্ছে, কিভাবে ডিভে ক্লাসগুলো ক্রমান্বয়ে বসেছে। (nanodesigns)" class="wp-image-425" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-4.jpg 337w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-4-300x135.jpg 300w" sizes="(max-width: 337px) 100vw, 337px" /></a><figcaption class="wp-element-caption">ডেভলপার টুলে দেখা যাচ্ছে, কিভাবে ডিভে ক্লাসগুলো ক্রমান্বয়ে বসেছে</figcaption></figure></div>


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



<p>এবারে আমাদের <tt>content-body</tt> ক্লাসে দেয়া <tt>width</tt>-কে কমিয়ে অর্ধেকের একটু কম করে ফেলবো (অর্ধেক করছি কারণ পুরো ডিভ যদি 100%, তাকে 2 দিয়ে ভাগ করলে তা 50% হয়, আমরা দুটো কলামের মাঝে একটা ফাঁকা স্থান রাখার জন্য তা আরো একটু কমিয়ে এনেছি), এছাড়া এতে একটু <tt>float</tt> দিবো; আর নতুন দুটো ক্লাসে প্রোপার্টি দিবো।</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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">লুপের div-গুলোকে ডানে-বামে সাজানোর জন্য CSS লিখলাম</figcaption></figure>



<p>ব্যস, হয়ে গেলো আমাদের কলাম। এই প্রোপার্টিগুলো একটা একটা করে দিয়ে দিয়ে প্রিভিউ দেখলে বুঝতে পারা যাবে, কিভাবে কাজটি হচ্ছে। তবুও বলছি: আমরা <tt>content-body</tt>-তে বামে ফ্লট দিয়ে <tt>width</tt> [অর্ধেকেরও কমে] কমিয়ে দিতেই ডিভগুলো বাম বরাবর পাশাপাশি এসে যাবে। তারপর শুধু ডানপাশের ডিভগুলোকে (<tt>.second-div</tt>) ডানে ফ্লট করে দিতেই আমাদের কাঙ্ক্ষিত কলাম তৈরি হয়ে গেলো। শুধু একটাই সমস্যা: এখনতো সবগুলো ডিভের উচ্চতা সমান, তাই বিষয়টা বোঝা যাচ্ছে না, কিন্তু যখন ডায়নামিক কন্টেন্ট দিয়ে ডিভগুলো ভরবে, তখন এগুলো কোনটা উচ্চতায় ছোট, কোনোটা বড় হবে। তখন <tt>second-div</tt>-এর উচ্চতা কমলেই <tt>first-div</tt> লাফ দিয়ে ডানদিকে সরে গিয়ে উপরের ঐ ফাঁকা জায়গাটা ভরতে যাবে, কারণ সব ডিভেই ফ্লট দেয়া &#8211; যা আমরা কোনোভাবেই চাই না। এজন্য আমরা প্রত্যেকটা <tt>first-div</tt>-কে বলে দিলাম, তুমি ডানে-বামে কোনোদিকেই ফ্লট মানবে না। সব মিলে যা দাঁড়ালো:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-5.jpg"><img decoding="async" width="1024" height="398" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-5-1024x398.jpg" alt="ক্লাস অনুসারে সিএসএস বাসতেই কিভাবে ডিভগুলো যার যার অবস্থান করে নিয়েছে। (nanodesigns)" class="wp-image-426" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-5-1024x398.jpg 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-5-300x117.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-5-768x299.jpg 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-5.jpg 1366w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">ক্লাস অনুসারে সিএসএস বাসতেই কিভাবে ডিভগুলো যার যার অবস্থান করে নিয়েছে</figcaption></figure></div>


<p>ব্যস, হয়ে গেল আমাদের ২ কলাম তৈরি। শুধু আরেকটু সুন্দর করে উপস্থাপন করার জন্য আর কোড কমিয়ে আনার জন্য এবারে কোডে কিছু যাদু প্রয়োগ করা যাক:</p>



<p>আমরা <tt>test</tt> ডিভটা ফেলে দিবো, ওটার কাজ শেষ। আমরা যে কন্ডিশনাল স্টেটমেন্টটা লিখেছিলাম, তাকে শর্ট ফর্মে লিখতে পারি। তাহলে&#8230;</p>



<pre class="wp-block-preformatted">&lt;?php if( $divCounter % 2 == 0 ) { $class = ' second-div'; } else { $class = ' first-div'; } ?&gt;
</pre>



<p>হয়ে যাবে&#8230;</p>



<pre class="wp-block-preformatted">&lt;?php $class = ( $divCounter % 2 == 0 ? ' second-div' : ' first-div' ); ?&gt;</pre>



<p>আর সিএসএস-এ <tt>.content-body</tt> থেকে <tt>box-shadow</tt>’র লাইনটা বাদ দিয়ে দিই, তাহলে বর্ডারটা চলে যাবে। ব্যস হয়ে গেলো আমাদের দুই কলাম তৈরির কাজ। এবারে পূর্ণাঙ্গ কোডটি নিচের লিংক থেকে নামিয়ে মিলিয়ে নিতে পারেন।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-6.jpg"><img decoding="async" width="1024" height="332" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-6-1024x332.jpg" alt="পরীক্ষামূলক কোডগুলো সরিয়ে নিলেই ভেসে উঠলো আমাদের কাঙ্ক্ষিত কলাম। (nanodesigns)" class="wp-image-427" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-6-1024x332.jpg 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-6-300x97.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-6-768x249.jpg 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-6.jpg 1365w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">পরীক্ষামূলক কোডগুলো সরিয়ে নিলেই ভেসে উঠলো আমাদের কাঙ্ক্ষিত কলাম</figcaption></figure></div>


<h3>৩ কলাম তৈরি</h3>



<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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">PHP Loop এবং Modulus দিয়ে ৩ কলাম তৈরির কৌশল</figcaption></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/b286812097c0b3dadf05f8dfd389c656">Gist</a>.
</div><figcaption class="wp-element-caption">৩ কলামের লুপ কলাম আকারে দেখার জন্য প্রয়োজনীয় CSS</figcaption></figure>



<p>এবারে পাতাটি ব্রাউযারে খুললেই দেখা যাবে বিষয়টা কী হচ্ছে।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-7.jpg"><img decoding="async" width="1024" height="499" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-7-1024x499.jpg" alt="৩ কলামের চেহারাটা হবে এরকম। নিচে, ডেভলপার টুলে ডিভের ক্লাসগুলো কিভাবে লোড হয়েছে, তাও দেখা যাচ্ছে। (nanodesigns)" class="wp-image-421" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-7-1024x499.jpg 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-7-300x146.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-7-768x374.jpg 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-loop-image-7.jpg 1354w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">৩ কলামের চেহারাটা হবে এরকম। নিচে, ডেভলপার টুলে ডিভের ক্লাসগুলো কিভাবে লোড হয়েছে, তাও দেখা যাচ্ছে</figcaption></figure></div>


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



<figure class="wp-block-table"><table><tbody><tr><td>1</td><td>2</td><td>3</td></tr><tr><td>4</td><td>5</td><td>6</td></tr><tr><td>7</td><td>&#8230;</td><td>&#8230;</td></tr></tbody></table><figcaption class="wp-element-caption">৩ কলামের ক্ষেত্রে দৃশ্যমান চেহারাটা যেমন</figcaption></figure>



<p>এবারে ৩ দিয়ে একটা একটা করে ভাগ করা যাক, 1 mod 3 = 1; 2 mod 3 = 2; 3 mod 3 = 0; 4 mod 3 = 1; 5 mod 3 = 2; 6 mod 3 = 0; 7 mod 3 = 1। দেখা যাচ্ছে, যে সংখ্যাকে ভাগ করিনা কেন, তিনটা আলাদা আলাদা ভাগশেষ আসার পরই, আবার ঐ একই ভাগশেষই তিনবার তিনবার করে ঘুরে ঘুরে আসছে। আমরা আসলে এই ব্যাপারটাকেই টার্গেট করছি আর এর অনুপাতে প্রয়োজনীয় ডিভ ক্লাস লোড করছি।</p>



<p>লক্ষ করলে দেখবেন, আমরা মাত্র দুটো ক্লাস লোড করে দুটো কলামকে চিহ্নিত করেছি। কারণ, আমাদের কলাম তৈরি করাতে দ্বিতীয় কলাম কোনটি, তা না জানলেও চলছে। প্রথম কলামের জন্য লজিক আগের মতোই, ফ্লটকে ক্লিয়ার করে দিচ্ছি। তবে .content-body-তে অতিরিক্ত হিসেবে যোগ হয়েছে margin-right। ডানদিকে মার্জিন দেয়ার কারণে প্রথম কলাম থেকে দ্বিতীয় কলাম পর্যন্ত একটা ফাঁকা স্থান তৈরি হয়েছে, তেমনি দ্বিতীয় কলাম থেকে তৃতীয় কলাম পর্যন্ত ফাঁকা স্থান, তেমনি তৃতীয় কলাম থেকে ডানদিকে ফাঁকা স্থান। দেখা যাচ্ছে, এই ডানদিকে-মার্জিনের প্রভাব পড়ছে সবগুলো ডিভে, অথচ তৃতীয় কলামের ডানে আর মার্জিনের দরকার নেই আমাদের, কারণ ওপাশে আর কোনো কলাম নেই, তাই আমরা .third-div-এ margin: 0 করে দিয়েছি।</p>



<p>ব্যস, লজিকটা আমরা এবারে জেনে গেছি।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-final-nanodesigns.jpg"><img decoding="async" width="1024" height="606" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-final-nanodesigns-1024x606.jpg" alt="তিন কলাম দিয়ে তৈরি করা একটা নমুনা ডিযাইন। (nanodesigns)" class="wp-image-428" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-final-nanodesigns-1024x606.jpg 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-final-nanodesigns-300x178.jpg 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-final-nanodesigns-768x455.jpg 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2014/02/PHP-column-final-nanodesigns.jpg 1353w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">তিন কলাম দিয়ে তৈরি করা একটা নমুনা ডিযাইন</figcaption></figure></div>


<p>পুরো প্রজেক্টের সোর্স কোড নিচের লিংক থেকে নামিয়ে নিতে পারেন। সাথে, তিন কলাম দিয়ে করা নমুনা ডিযাইনও থাকছে।</p>



<h3>৪, ৫ ইত্যাদি আরো বেশি কলাম</h3>



<p>লজিকটা এখন আর আশা করি বুঝিয়ে বলা লাগবে না। এই এক লজিকে আমরা মনের মতো করে ডিভে ইচ্ছেমতো ক্লাস লোড করে নিতে পারি, আর সে অনুপাতে সিএসএস দিয়ে সাজিয়ে নিতে পারি আমাদের ডিভগুলোকে আলাদা আলাদা করে। শুধু সূত্রে পরির্বতনটা হবে, যে সংখ্যা দিয়ে ভাগ করা হচ্ছে, তা: কারণ ২ কলামের সময় ভাগ দিয়েছি ২ দিয়ে, ৩ কলামের সময় ৩&#8230; তো ৩৯ কলামের জন্য???</p>



<h3>শেষ কথা</h3>



<p>এই টিউটোরিয়ালে আমরা পিএইচপি লুপ কাজে লাগিয়ে ক্লাস লোড করে করে তাতে সিএসএসের প্রয়োগ করে কলাম তৈরি করেছি। এখানে আমরা CSS2 ব্যবহার করেছি। কিন্তু CSS3 দিয়ে, ক্লাস লোড না করেই এরকম কলাম তৈরি করা যায়। সেটা আমরা অন্য অরেকদিন দেখবো। তবে, এই লুপ দিয়েই এখনকার মতো অনেক কাজ আপনারা সেরে নিতে পারবেন।</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>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/columns-php-loop/">পিএইচপি লুপ দিয়ে কলাম তৈরি &#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/columns-php-loop/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
