<?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/feed/" rel="self" type="application/rss+xml" />
	<link>https://mayeenulislam.github.io/tuts/category/tuts-level/</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/</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>কিভাবে ফ্রি-তে Let&#8217;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়</title>
		<link>https://mayeenulislam.github.io/tuts/free-ssl/</link>
					<comments>https://mayeenulislam.github.io/tuts/free-ssl/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Sat, 23 Mar 2019 06:00:30 +0000</pubDate>
				<category><![CDATA[উচ্চস্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1271</guid>

					<description><![CDATA[<p>কিভাবে Let's Encrypt ব্যবহার করে বিনে পয়সায় ওয়েবসাইটে এসএসএল সার্টিফিকেট ইস্যু এবং অ্যাক্টিভেট করা যায়, এবং HTTP ওয়েবসাইটকে HTTPS-এ বদলে ফেলা যায় তার ধারণা দেয়া হয়েছে।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/free-ssl/">কিভাবে ফ্রি-তে Let&#8217;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়</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:#f9e7b5"><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>এটি একটি পুরোন কৌশল, তবে কার্যকরী। আপনার পক্ষে Certbot দিয়ে SSL Certificate ইস্যু করা সম্ভব হলে, সেটাই সহজতর পদ্ধতি। তবে এখানে Free SSL, Paid SSL ইত্যাদি বিভিন্ন ধারণা নিয়ে বিস্তারিত আলোচনা করা হয়েছে, যা যে-কারো জন্যই কাজে লাগবে।</p>



<p>কিভাবে Let&#8217;s Encrypt ব্যবহার করে বিনে পয়সায় ওয়েবসাইটে এসএসএল সার্টিফিকেট ইস্যু এবং অ্যাক্টিভেট করা যায়, এবং HTTP ওয়েবসাইটকে HTTPS-এ বদলে ফেলা যায় তার ধারণা দেয়া হয়েছে।</p>



<p>মূল ইভেন্টটি টেকনোভিস্তা লিমিটেড-এ ২৪ ফেব্রুয়ারি ২০১৯-এ অনুষ্ঠিত হয়েছিল। পরবর্তীতে সেই বক্তব্যই অডিও আকারে আলাদা করে রেকর্ড করা হয়েছে, যাতে বক্তব্যগুলো ছড়িয়ে দেয়া যায়।</p>



<h3>ভিডিও</h3>



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



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="কিভাবে ফ্রি-তে Let&#039;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়" width="720" height="405" src="https://www.youtube.com/embed/bk868eeiN8w?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>



<h3>প্রেযেন্টেশন</h3>



<figure class="wp-block-embed is-type-rich is-provider-slideshare wp-block-embed-slideshare"><div class="wp-block-embed__wrapper">
<iframe title="How to Issue and Activate Free SSL using Let&#039;s Encrypt" src="https://www.slideshare.net/slideshow/embed_code/key/v9bWW2yRkpabzA" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/MayeenulIslam/how-to-issue-and-activate-free-ssl-using-lets-encrypt" title="How to Issue and Activate Free SSL using Let&#39;s Encrypt" target="_blank">How to Issue and Activate Free SSL using Let&#39;s Encrypt</a> </strong> from <strong><a href="https://www.slideshare.net/MayeenulIslam" target="_blank">Mayeenul Islam</a></strong> </div>
</div></figure>



<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/free-ssl/">কিভাবে ফ্রি-তে Let&#8217;s Encrypt ব্যবহার করে SSL Certificate ইস্যু এবং অ্যাক্টিভেট করা যায়</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/free-ssl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>অ্যাডমিন প্যানেলে নিজস্ব $wp_query&#8217;র জন্য পেজিনেশন</title>
		<link>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/</link>
					<comments>https://mayeenulislam.github.io/tuts/custom-pagination-admin-panel-wp-query/#respond</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 01 Jun 2016 13:44:21 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্রাথমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=1027</guid>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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


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



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



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



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



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

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



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



<h3>রিলিয দেয়ার গিট পদ্ধতি</h3>



<p>git ব্যবহার করে প্রোডাক্ট রিলিয দেয়ার পদ্ধতি হচ্ছে <code>git tag</code>। কমান্ডলাইনে (git bash ব্যবহার করে) কাজটা করার উপায় হচ্ছে:</p>



<pre class="wp-block-preformatted">git tag -a v1.0.0 -m "First Release"</pre>



<p>এতে যেটা হবে সর্বশেষ কমিটে <code>v1.0.0</code> ট্যাগটি জুড়ে যাবে। এবারে কমান্ডলাইনে ট্যাগ পুশ করে দিলেই গিটহাবে একটা ট্যাগ তৈরি হয়ে যাবে।</p>



<pre class="wp-block-preformatted">git push -u origin --tags</pre>



<p>কিন্তু এতে রিলিয নোট লেখা হবে না।&nbsp;তাই ট্যাগ তৈরি এবং রিলিয দেয়ার জন্য গিটহাব-এ রয়েছে রিলিয ফিচার:</p>



<h3>কিভাবে রিলিয করতে হয়</h3>



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



<p><code>https://github.com/username/repo</code>&nbsp;সাধারণত এইরকমই হয় গিটহাবে রেপোযিটোরির লিংক। তো আপনার রেপোযিটোরিতে&nbsp;<kbd>releases</kbd>&nbsp;লিংকে ক্লিক করুন।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano.png" rel="attachment wp-att-998"><img decoding="async" width="600" height="41" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano.png" alt="গিটহাবে 'releases' লিংকে ক্লিক করুন" class="wp-image-998" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano.png 600w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-release-link-tutsnano-300x21.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a><figcaption class="wp-element-caption">গিটহাবে &#8216;releases&#8217; লিংকে ক্লিক করুন</figcaption></figure></div>


<p>রিলিযেয পাতায় Create a new Release&nbsp;বোতামে ক্লিক করুন।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano.png" rel="attachment wp-att-999"><img decoding="async" width="503" height="246" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano.png" alt="রিলিয পর্দায় 'Create a new release' বোতামে ক্লিক করুন" class="wp-image-999" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano.png 503w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-create-new-release-tutsnano-300x147.png 300w" sizes="(max-width: 503px) 100vw, 503px" /></a><figcaption class="wp-element-caption">রিলিয পর্দায় &#8216;Create a new release&#8217; বোতামে ক্লিক করুন</figcaption></figure></div>


<p>রিলিয নোট পাতায় রিলিয নোট লিখে শেষ করুন।</p>


<div class="wp-block-image">
<figure class="alignright"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano.png" rel="attachment wp-att-1000"><img decoding="async" width="300" height="270" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano-300x270.png" alt="রিলিয নোট লিখুন" class="wp-image-1000" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano-300x270.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-fill-up-release-note-tutsnano.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">রিলিয নোট লিখুন</figcaption></figure></div>


<p><strong>&#8220;Tag version&#8221;</strong> হলো সংস্করণের নাম্বার, অর্থাৎ যে সংস্করণটি রিলিয করতে যাচ্ছেন আপনি, আমাদের ক্ষেত্রে যেমন ব্যাপারটা হলো 1.0.0। <strong>&#8220;Release title&#8221;</strong>&nbsp;যেকোনো কিছু&nbsp;হতে পারে, আপনি যা দিয়ে এই রিলিযটাকে সূচিত করতে চান আরকি। উদাহরণ হিসেবে বলা যায়, ওয়ার্ডপ্রেস তাদের রিলিযগুলো একেকজন জ্যায শিল্পীর নামানুসারে করে থাকে, তো আপনার ক্ষেত্রে এটা যেকোনো কিছু হতে পারে। আমরা নাম দিতে পারি &#8220;প্রথম রিলিয&#8221;, কিংবা &#8220;প্রাথমিক রিলিয&#8221;, কিংবা &#8220;আন্তর্জাতিক রিলিয&#8221; ইত্যাদি যেকোনো কিছুই।</p>



<p><strong>বিবরণ</strong>&nbsp;অংশে মার্কডাউন দিয়ে রিলিয সম্পর্কে বিস্তারিত লিখতে পারবেন। কিন্তু রিলিযের ফিচার সংশ্লিষ্ট তথ্যাদি দিয়ে যথোপযুক্ত রিলিয নোটই লিখতে উৎসাহিত করা হচ্ছে।&nbsp;আপনি প্রাকদর্শনও দেখতে পারবেন।</p>



<p>এটা যদি আপনার প্রাক-রিলিয হয়ে থাকে, যা আসলে আনুষ্ঠানিক কোনো রিলিয না, কিংবা [মোটামুটি প্রস্তুতই], পরীক্ষা করার জন্য, কিংবা ডেভলপমেন্ট পরখ করার জন্য ইত্যাদি ক্ষেত্রে, আপনি চাইলে:</p>



<blockquote class="wp-block-quote">
<p>This is a pre-release checkbox.</p>
</blockquote>



<p>লেখা চেকবাক্সটি&nbsp;চেক করে দিতে পারেন।</p>



<p>আপনি এই মুহূর্তে প্রকাশ করতে চাচ্ছেন না? চাইলে, রিলিযের তথ্যগুলো খসড়া আকারে সংরক্ষণ করেও রেখে দিতে পারেন।&nbsp;কিংবা চাইলেই এক ক্লিকে প্রকাশও করে ফেলতে পারেন। আপনার রিলিয যেকোনো সময় সম্পাদনা কিংবা হালনাগাদও করতে পারেন।তো, আপনার রেপোযিটোরি/প্রোজেক্ট এখন প্রকাশিত।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano.png" rel="attachment wp-att-1001"><img decoding="async" width="300" height="236" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano-300x236.png" alt="সংস্করণটি গিটহাবে রিলিয দেয়া হয়েছে" class="wp-image-1001" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano-300x236.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-tutsnano.png 504w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">সংস্করণটি গিটহাবে রিলিয দেয়া হয়েছে</figcaption></figure></div>


<h4><strong>বাইনারি ফাইল যোগ</strong></h4>



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



<p>সত্যি বলতে কি, এটা আপনার প্রোজেক্টের ঐ ভার্ষনের ফাইলগুলো, যেখানে অবাঞ্ছিত ফাইল কিংবা কোনো অবাঞ্ছিত কোড নেই।</p>



<p>তো, কিভাবে একটা বাইনারি ফাইল বানানো যায়? আসলে, সেটা আপনার প্রোজেক্টের ধরণই নির্ধারণ করে দিবে। স্ক্রিপ্টিং ল্যাঙ্গুয়েজের (যেমন: পিএইচপি) কোনো প্রোজেক্টের ক্ষেত্রে আমার পছন্দ হলো রেপোযিটোরির বিদ্যমান অবস্থার (যা আসলে আপনার রিলিয পাবার উপযুক্ত কোডের সংকলন) একটা যিপ সংস্করণ নামিয়ে নেয়া। এই কাজটা গিটহাবে খুব সহজে করা যায়, রেপোযিটোরির ডান দিকের &#8220;Download Zip&#8221; বোতামে ক্লিক করে খুব সহজে পুরো রেপোযিটোরি কমপ্রেস্‌ড অবস্থায় নামিয়ে নেয়া যায়।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano.png" rel="attachment wp-att-1002"><img decoding="async" width="996" height="40" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano.png" alt="রেপোযিটোরিটা যিপ আকারে নামিয়ে নিন" class="wp-image-1002" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano.png 996w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano-300x12.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-download-the-zip-tutsnano-768x31.png 768w" sizes="(max-width: 996px) 100vw, 996px" /></a><figcaption class="wp-element-caption">রেপোযিটোরিটা যিপ আকারে নামিয়ে নিন</figcaption></figure></div>


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



<p>তো, রেপোযিটোরিটা খুব সহজে ডাউনলোড করে নিন, আর <code>.zip</code>&nbsp;ফাইলটা আপনার রিলিযের সাথের বাইনারি ফাইল হিসেবে যোগ করে দিন। আমরা এবারে আমাদের আগে প্রকাশ করা রিলিযটাকেই সম্পাদনা করে দেখাচ্ছি:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano.png" rel="attachment wp-att-1003"><img decoding="async" width="600" height="118" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano.png" alt="রিলিযের সাথে বাইনারি ফাইলসমূহ যোগ করুন" class="wp-image-1003" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano.png 600w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-attach-binaries-tutsnano-300x59.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a><figcaption class="wp-element-caption">রিলিযের সাথে বাইনারি ফাইলসমূহ যোগ করুন</figcaption></figure></div>


<p>পরখ করে দেখার জন্য আমরা এবারে এটাকে&nbsp;<em>Pre-release</em>&nbsp;চেকবাক্সে ক্লিক করে প্রাকরিলিয বানিয়ে নিলাম।</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano.png" rel="attachment wp-att-1004"><img decoding="async" width="300" height="268" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano-300x268.png" alt="রিলিযটাকে প্রাকরিলিয করে দেখা যাক" class="wp-image-1004" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano-300x268.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2016/03/release-on-github-released-prerelease-tutsnano.png 486w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption class="wp-element-caption">রিলিযটাকে প্রাকরিলিয করে দেখা যাক</figcaption></figure></div>


<p>আমরা আমাদের <code>xyz.zip</code> বাইনারি ফাইলটা যোগ করেছি, এবং খুব সহজেই আমাদের ব্যবহারকারীদের কাছে এই zip ফাইলের পাথটা ছড়িয়ে দিতে পারি, যাতে তাঁরা ডাউনলোড করে নিতে পারেন আমাদের রিলিয করা পণ্যটি। এই পাথটা মোটামুটি এরকম হয়:</p>



<pre class="wp-block-preformatted">https://github.com/username/repo/releases/download/1.0.0/xyz.zip</pre>



<h4><strong>বাইনারিগুলো কেন</strong></h4>



<p>বাইনারি ফাইল ছাড়াও যেকেউই আপনার রিলিয করা সংস্করণটা খুব সহজেই ডাউনলোড করতে পারেন &#8220;<strong>Source Code</strong>&nbsp;(zip)&#8221;-এ ক্লিক করেই। কিন্তু এই যিপ ফাইলটা ডাউনলোড করলে:</p>



<ul>
<li>আপনার ব্যবহারকারীদের কাছে অপ্রয়োজনীয়ভাবেই গিট রিভিশনের ইতিহাসগুলোও চলে যায়</li>



<li>আর, আপনি চাইলেও, কোনো রিলিয ঠিক কতবার ডাউনলোড হলো, তার কোনো সংখ্যাও আপনি পাবেন না</li>
</ul>



<p>হ্যা, শুধুমাত্র একটা বাইনারি ফাইলই আপনার রিলিযের <strong>ডাউনলোডের পরিমাণ</strong>&nbsp;জানান দিতে সক্ষম।</p>



<h3>ডাউনলোডের হিসাব পান</h3>



<p>আপনি যদি আপনার গিটহাবের রেপোযিটোরির এপিআই ইউআরএল ব্রাউয করেন, তাহলে আপনি আপনার রিলিযের আদ্যোপান্ত JSON আকারে দেখতে পাবেন (শুধুমাত্র ব্যবহারকারী নাম আর রেপোযিটরির নামটা বদলে নিতে হবে):</p>



<pre class="wp-block-preformatted">https://api.github.com/repos/[username]/[repo-name]/releases</pre>



<p>এবং আমরা জানি, জেকুয়েরির&nbsp;<code>getJSON</code>&nbsp;মেথড কাজে লাগিয়ে, আমরা আমাদের রিলিযের ডাউনলোডের সংখ্যা খুব সহজেই পেতে পারি।</p>



<pre class="wp-block-preformatted">$.getJSON("https://api.github.com/repos/someone/kauwa-kala/releases").done(function (json) {
&nbsp;&nbsp;&nbsp; var release = json[0];
&nbsp;&nbsp;&nbsp; console.log(release);
&nbsp;&nbsp;&nbsp; console.log(release.assets[0].download_count);
});</pre>



<h3>ইতি কথা</h3>



<p>তো, আপনার প্রোগ্রাম, প্রোজেক্ট কিংবা রেপোযিটোরি খুব সহজেই গিটহাবে রিলিয করতে পারেন, এবং রিলিযপ্রতি আপনার পণ্যের ডাউনলোডের পরিমাণও জানতে পারেন। সুতরাং, গিটহাবে শ্রেফ রেপোযিটোরিই নয়, আপনার গুছিয়ে আনা রেপোযিটোরিটি পণ্য আকারে রিলিযও করতে থাকুন। <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></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/releasing-github-project/">কিভাবে গিটহাবে প্রোজেক্ট রিলিয করতে হয়</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/releasing-github-project/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</title>
		<link>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/</link>
					<comments>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Tue, 01 Mar 2016 17:14:57 +0000</pubDate>
				<category><![CDATA[ওয়ার্ডপ্রেস টিউটোরিয়াল]]></category>
		<category><![CDATA[ওয়েব ডেভলপমেন্ট টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[থিম টিউটোরিয়াল]]></category>
		<category><![CDATA[প্লাগইন টিউটোরিয়াল]]></category>
		<category><![CDATA[মাধ্যমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[মাল্টিসাইট টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=894</guid>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p>এবং</p>



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



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



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



<p>এবং</p>



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



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



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



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



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



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



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



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



<p>এবং</p>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p>এই লেখাটির সংক্ষিপ্ত সংস্করণ ইংরেজিতে পাওয়া যাবে <a href="http://wordpress.stackexchange.com/q/219271/22728" target="_blank" rel="noopener">WordPress Development StackExchange ওয়েবসাইটের এই থ্রেডে^</a>।</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/">ওয়ার্ডপ্রেস মাল্টিসাইটে নিজস্ব সাইনআপ পাতা তৈরির কৌশল</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mayeenulislam.github.io/tuts/custom-signup-wordpress-multisite/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>গিট দিয়ে ভার্ষন নিয়ন্ত্রণ &#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>CSS3 ব্যবহার করে কলাম তৈরি</title>
		<link>https://mayeenulislam.github.io/tuts/column-design-css3/</link>
					<comments>https://mayeenulislam.github.io/tuts/column-design-css3/#comments</comments>
		
		<dc:creator><![CDATA[মঈনুল ইসলাম]]></dc:creator>
		<pubDate>Wed, 07 Oct 2015 19:25:41 +0000</pubDate>
				<category><![CDATA[ওয়েব ডিযাইন টিউটোরিয়াল]]></category>
		<category><![CDATA[জ্ঞান-স্তরভিত্তিক টিউটোরিয়াল]]></category>
		<category><![CDATA[প্রাথমিক স্তরের টিউটোরিয়াল]]></category>
		<category><![CDATA[সিএসএস টিউটোরিয়াল]]></category>
		<guid isPermaLink="false">https://mayeenulislam.github.io/tuts/?p=724</guid>

					<description><![CDATA[<p> [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/column-design-css3/">CSS3 ব্যবহার করে কলাম তৈরি</a> appeared first on <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/">Tuts by Mayeenul Islam</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>পত্রিকার ডিযাইনে কলাম দেখা যায়, ছবিগুলো অ্যালবামে কলাম আকারে সাজানো থাকে, আপনার পোর্টফোলিও কলাম আকারে গুছিয়ে দেখাতে পারেন &#8211; কলাম ডিযাইন তৈরি ঘুরেফিরেই আপনার প্রয়োজন হবে। এজন্যই এর আগে আমরা দেখেছিলাম কিভাবে <a href="https://mayeenulislam.github.io/tuts/columns-php-loop/" target="_blank" rel="noreferrer noopener">পিএইচপি লুপ ব্যবহার করে ওয়েবসাইটে কলামের ডিযাইন</a> করা যায়। আমরা সেদিন বলেছিলাম, CSS3 দিয়েও কাজটা আরো সহজে করা যায়। এতোদিন পরে হলেও আমরা কথা রাখতে পেরেছি, আজ আমরা সেটাই দেখবো ইনশাল্লাহ।</p>



<p>সিএসএস৩ দিয়ে তৈরি কলাম আরো পরিচ্ছন্ন, আরো সহজ। এখানে স্তবকে স্তবকে সাজানো<code> &lt;div&gt;</code>-গুলোকে কোনো ক্লাস কিংবা সিলেক্টরের তোয়াক্কা না করে শ্রেফ সিএসএস দিয়ে ধরে ধরে কলাম আকারে সাজিয়ে ফেলা যাবে। এবং রেসপন্সিভ ডিযাইনেও একই কৌশল কাজে লাগিয়ে লেআউটকে বিভিন্ন ভিউপোর্টে ইচ্ছামতো বদলে নেয়া যাবে।</p>



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



<span id="more-724"></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/21d8e81800455702e4b9">Gist</a>.
</div></figure>



<p>আমরা <code>&lt;div&gt;</code>-কে বলে দিচ্ছি বামদিকে চলে যেতে, সবগুলো <code>&lt;div&gt;</code>-এর <code>width</code> বলে দিয়েছি, প্রয়োজনীয় মার্জিন দিয়ে সরিয়ে সরিয়ে দেখিয়েছি, আর সবগুলোতে একটা নির্দিষ্ট ম্যাটম্যাটে রং দিয়ে দিয়েছি। তাতে যেটা হবে, বামদিকে চেপে একের পর এক <code>&lt;div&gt;</code> বসে যাবে (আমরা <code>&lt;div&gt;</code>গুলোকে বোঝার জন্য <code>100px</code>-এর একটা উচ্চতা দিয়েছি)। এবারে আমরা CSS3 সিলেক্টর ব্যবহার করে কলাম ১ এবং কলাম ৩-এর জন্য আলাদা আলাদা সিএসএস র&#x200d;্যুল ডিক্লেয়ার করেছি। আমরা বলেছি:</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/21d8e81800455702e4b9">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/10/css3-column.png"><img decoding="async" width="1024" height="314" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-column-1024x314.png" alt="সিএসএস৩ দিয়ে ৩ কলামের ডিযাইন" class="wp-image-728" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-column-1024x314.png 1024w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-column-300x92.png 300w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-column-768x236.png 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-column.png 1365w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">সিএসএস৩ দিয়ে ৩ কলামের ডিযাইন</figcaption></figure></div>


<p>এখন সময় এসেছে CSS3 ছদ্ম (pseudo) সিলেক্টর <code>:nth-of-type(n)</code> সম্পর্কে জানার:</p>



<p><code>:nth-of-type(n)</code> হলো কোনো একই এলিমেন্টের <code>n</code> তম-টিকে ধরার জন্য ব্যবহৃত সিলেক্টর। এটি ব্যবহার করে কোনো সিলেক্টরের, শীর্ষ&#8217;র&nbsp;ভিতরকার, নিজস্ব ধরণের <code>n</code> তম-টিকে ধরা যায়। <code>n</code> হতে পারে কোনো অংক, কীওয়ার্ড কিংবা কোনো ফর্মুলা।</p>



<p>এই কথাটা&nbsp;বোঝার জন্য নিচের কোড স্নিপেটটি দেখা যাক:</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/21d8e81800455702e4b9">Gist</a>.
</div></figure>



<p>মানে হচ্ছে, একটা <code>&lt;div&gt;</code>-এর ভিতরে <code>&lt;p&gt;</code>, <code>&lt;span&gt;</code>, <code>&lt;a&gt;</code> ইত্যাদি বিভিন্ন ধরণের&nbsp;ট্যাগ থাকলে, <code>&lt;div&gt;</code>টা হচ্ছে শীর্ষ বা প্যারেন্ট; এখন আমরা যদি <code>p:nth-of-type(2)</code> লিখি, তাহলে তা এর ভিতরকার দ্বিতীয় p ট্যাগকে ধরবে। যদিও দ্বিতীয় এলিমেন্টটা p না, বরং a, কিন্তু সে যেহেতু শুধুমাত্র একই ধরণের এলিমেন্টকে টার্গেট করে, তাই p-এর দ্বিতীয় এলিমেন্টকে সে ধরবে। আমাদের এই উদাহরণে <code>n</code> হচ্ছে ২, কেননা আমরা দ্বিতীয়টাকে সিলেক্ট করার জন্য বলেছি।</p>



<p>ঠিক একইভাবে <code>:nth-child(n)</code>-ও ব্যবহার করা যায়, কিন্তু <code>nth-child</code> যেটা করে, সে, ধরণের ধার ধারে না, বরং শীর্ষ&#8217;র ভিতরকার <code>n</code>-তম সন্তানকে খুঁজে নেয়। যেমন: উপরের উদাহরণে আমরা যদি <code>p:nth-child(2)</code> লিখতাম, তাহলে সে কিন্তু কিছুই করতো না, কারণ আমাদের শীর্ষ&#8217;র দ্বিতীয় এলিমেন্টটা কোনো <code>&lt;p&gt;</code> ট্যাগ না, বরং একটা <code>&lt;a&gt;</code> ট্যাগ।</p>



<p>আমরা যখন ডিযাইন করছি, তখন শুধু <code>&lt;div&gt;</code> দিয়ে হয়তো করছি, বিভিন্ন এলিমেন্টের মিশেল না হলে <code>nth-of-type</code> কিংবা <code>nth-child</code>-এর যেকোনোটি ব্যবহার করা যায়। কিন্তু যদি বিভিন্ন এলিমেন্টের মিশেল থাকে, তাহলে <code>nth-of-type</code>-এর ব্যবহার নির্দিষ্ট আর&nbsp;নিরাপদও।</p>



<h3>ফর্মুলা</h3>



<p>এখানে তো আমরা ৩টি কলামের কোড দেখিয়েছি বোঝানোর জন্য। আপনার তো ৪ কলাম, ৫ কলাম, ১০ কলাম অনেক কিছুরই দরকার হতে পারে, তখন কী করবেন? তাই জেনে নিতে হবে ফর্মুলাটা। তাহলে যেকোনো সংখ্যক কলাম তৈরিতে নিশ্চিন্ত থাকা যাবে:</p>



<p class="has-text-align-center"><strong>কলাম সংখ্যা × n + লক্ষ্য কলাম</strong></p>



<p>কয়টা কলাম হবে? ৪টা। তাহলে কলাম সংখ্যা হলো ৪। এবারে কোন কলামকে টার্গেট করে সিএসএস লিখতে চান? প্রথম&nbsp;কলামকে। তাহলে লক্ষ্য কলাম হচ্ছে ১। কোন কলামকে টার্গেট করে সিএসএস লিখতে চান? ৪র্থ কলামকে। তাহলে লক্ষ্য কলাম হচ্ছে ৪।</p>



<pre class="wp-block-preformatted">.item:nth-of-type(4n + 1){ /* css rules here */ }
.item:nth-of-type(4n + 4){ /* css rules here */ }
</pre>



<p>আমরা ঠিক এই কৌশল কাজে লাগিয়ে পত্রিকার জন্য একটা লেআউট তৈরি করলাম:</p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-columns-preview-by-nanodesigns.jpg"><img decoding="async" width="1008" height="1024" src="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-columns-preview-by-nanodesigns-1008x1024.jpg" alt="CSS3 দিয়ে করা কলাম দিয়ে পত্রিকার লেআউট" class="wp-image-729" srcset="https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-columns-preview-by-nanodesigns-1008x1024.jpg 1008w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-columns-preview-by-nanodesigns-295x300.jpg 295w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-columns-preview-by-nanodesigns-768x780.jpg 768w, https://mayeenulislam.github.io/tuts/wp-content/uploads/2015/10/css3-columns-preview-by-nanodesigns.jpg 1349w" sizes="(max-width: 1008px) 100vw, 1008px" /></a><figcaption class="wp-element-caption">CSS3 দিয়ে করা কলাম দিয়ে পত্রিকার লেআউট</figcaption></figure></div>


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



<p>CSS3 ছদ্ম সিলেক্টরগুলো ব্যবহারে কিছুটা সীমাবদ্ধতা আছে। বিশেষ করে Internet Explorer 8-এ <code>:nth-of-type(n)</code> এবং <code>:nth-child(n)</code> কাজ করে না। এই ছদ্ম সিলেক্টরদ্বয় সমর্থনকারী প্রথম সংস্করণগুলো হলো: Google Chrome 4.0, Internet Explorer (IE) 9, Mozilla Firefox 3.5, Apple Safari 3.2, এবং Opera 9.6। যদি আপনার সাইট এসকল ব্রাউযারে ব্রাউয হবার সম্ভাবনা থাকে, তাহলে আপনার জন্য বিকল্প হিসেবে <a href="https://mayeenulislam.github.io/tuts/columns-php-loop/" target="_blank" rel="noreferrer noopener">PHP দিয়ে তৈরি কলাম</a> তো থাকলোই&#8230;। <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<div class="is-content-justification-center is-layout-flex wp-container-1 wp-block-buttons">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://github.com/mayeenulislam/css3-columns" target="_blank" rel="noreferrer noopener">Github রেপোযিটোরি</a></div>



<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="http://mayeenulislam.github.io/css3-columns/" target="_blank" rel="noreferrer noopener">প্রিভিউ দেখুন</a></div>
</div>



<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>



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



<h3>বাড়তি সহায়তা</h3>



<ul>
<li><a rel="noreferrer noopener" href="https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type" target="_blank">CSS3 <code>:nth-of-type</code> Selector^</a> &#8211; MDN Dev Net</li>



<li><a rel="noopener" href="https://css-tricks.com/examples/nth-child-tester/" target="_blank">nth-child, nth-of-type, nth-last-child, nth-last-of-type সিলেক্টর পরখ করে দেখার অনলাইন অ্যাপ^</a> &#8211; সিএসএস ট্রিক্‌স</li>
</ul>
<p>The post <a rel="nofollow" href="https://mayeenulislam.github.io/tuts/column-design-css3/">CSS3 ব্যবহার করে কলাম তৈরি</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/column-design-css3/feed/</wfw:commentRss>
			<slash:comments>1</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>
	</channel>
</rss>
