Comment

থিম বেসিক

লুপ

Estimated reading: 4 minutes 22 views Contributors

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

লুপ ওয়ার্ডপ্রেস ডাটাবেস থেকে প্রতিটি পোস্টের ডেটা বের করে এবং প্রতিটি টেমপ্লেট ট্যাগের জায়গায় উপযুক্ত তথ্য সন্নিবেশ করে। লুপের মধ্যে থাকা যেকোনো HTML বা PHP কোড প্রতিটি পোস্টের জন্য প্রসেস করা হয়ে থাকে।

সহজভাবে বলতে গেলে, লুপ তার নামের প্রতি সত্য: এটি বর্তমান পেজের জন্য পুনরুদ্ধার করা প্রতিটি পোস্টের মাধ্যমে একবারে একটি করে লুপ করে এবং আপনার থিমে নির্দিষ্ট করা কাজটি সম্পন্ন করে।

আপনি বিভিন্ন জিনিসের জন্য লুপ ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

  • আপনার ব্লগের হোমপেজে পোস্ট টাইটেল এবং সারাংশ দেখানোর জন্য;
  • একটি সিঙ্গেল পোস্টে বিষয়বস্তু এবং কমেন্ট দেখানোর জন্য;
  • টেমপ্লেট ট্যাগ ব্যবহার করে একটি পৃথক পেজে বিষয়বস্তু দেখানোর জন্য;
  • এবং কাস্টম পোস্ট প্রকার এবং কাস্টম ফিল্ড থেকে ডেটা দেখানোর জন্য।

বিভিন্ন কন্টেন্ট দেখানো এবং ম্যানিপুলেট করতে আপনি আপনার টেমপ্লেট ফাইলগুলি জুড়ে লুপটি কাস্টোমাইজ করতে পারেন।

লুপের বিস্তারিত ব্যাখ্যা

মূল লুপটি হল:

<?php
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        // পোস্টের বিষয়বস্তু প্রদর্শন করুন
    endwhile;
endif;
?>

এই লুপটি বলছে যে, যখন পোস্ট থাকে, তখন লুপের মাধ্যমে পোস্টগুলিকে দেখানো হবে। আরও বিস্তারিতভাবে বললে:

  1. have_posts() ফাংশনটি পরীক্ষা করে যে কোনো পোস্ট আছে কি না।
  2. যদি পোস্ট থাকে, তাহলে একটি while লুপ চলতে থাকে যতক্ষণ পর্যন্ত () এর মধ্যে থাকা কন্ডিশনটি যৌক্তিকভাবে সত্য থাকে। যতক্ষণ পর্যন্ত have_posts() সত্য হতে থাকে, ততক্ষণ পর্যন্ত লুপটি চলতে থাকবে।
  3. the_post() ফাংশনটি বর্তমান পোস্টটিকে সেট করে, যাতে এটির বিষয়বস্তু দেখানো যেতে পারে।
  4. পোস্টের বিষয়বস্তু ডিসপ্লে করুন এই অংশে আপনি পোস্টের টাইটেল, বিষয়বস্তু, ইত্যাদি ডিসপ্লে করার জন্য কোড লিখবেন।

উদাহরণস্বরূপ, এই কোডটি পোস্টের টাইটেলগুলির একটি তালিকা দেখাবে:

<?php
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        echo '<h2>' . get_the_title() . '</h2>';
    endwhile;
endif;
?>

লুপ ব্যবহার করা

লুপটি index.php ফাইলে রাখা উচিত, এবং যেকোনো অন্যান্য টেমপ্লেটে যেখানে পোস্টের তথ্য দেখানো হয়। আপনি বারবার আপনার হেডারটির ডুপ্লিকেট করতে চান না বলে, লুপটি সর্বদা get_header() ফাংশনের কল করার পরে রাখা উচিত। উদাহরণস্বরূপ:

<?php
get_header();
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        // Display post content
    endwhile;
endif;
?>

উপরের উদাহরণে, Loop-এর সমাপ্তি endwhile এবং endif দিয়ে দেখানো হয়েছে। Loop-টি অবশ্যই সর্বদা একই if এবং while স্টেটমেন্ট দিয়ে শুরু করতে হবে, যেমনটি উপরে উল্লেখ করা হয়েছে এবং একই end স্টেটমেন্ট দিয়ে শেষ করতে হবে।

যে সমস্ত টেমপ্লেট ট্যাগগুলি আপনি সমস্ত পোস্টে প্রয়োগ করতে চান তা শুরু এবং সমাপ্তি স্টেটমেন্টগুলির মধ্যে থাকতে হবে।

আপনি একটি কাস্টম 404 “Not found” বার্তা অন্তর্ভুক্ত করতে পারেন যা ডিসপ্লে হবে যদি নির্দিষ্ট মানদণ্ডের সাথে কোনো পোস্ট না পাওয়া যায়। বার্তাটি endwhile এবং endif স্টেটমেন্টগুলির মধ্যে রাখতে হবে, যেমন নিচের উদাহরণগুলিতে দেখানো হয়েছে।

একটি অত্যন্ত সহজ index.php ফাইল এর মত দেখাবে:

<?php
get_header();

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_content();
    endwhile;
else :
    _e( 'Sorry, no posts matched your criteria.', 'textdomain' );
endif;

get_sidebar();

লুপ কী ডিসপ্লে করতে পারে

লুপ প্রতিটি পোস্টের জন্য বিভিন্ন এলিমেন্ট ডিসপ্লে করতে পারে। উদাহরণস্বরূপ, অনেক থিমে ব্যবহৃত কিছু সাধারণ টেমপ্লেট ট্যাগ হল:

  • next_post_link() – সুশৃঙ্খলভাবে বর্তমান পোস্টের পরে পাবলিশ করা পোস্টের একটি লিঙ্ক
  • previous_post_link() – সুশৃঙ্খলভাবে বর্তমান পোস্টের আগে পাবলিশ করা পোস্টের একটি লিঙ্ক
  • the_category() – দেখানো পোস্ট বা পেজের সাথে অ্যাটাচ করা ক্যাটাগরি বা ক্যাটাগরিগুলি
  • the_author() – পোস্ট বা পেজের লেখক
  • the_content() – একটি পোস্ট বা পেজের জন্য মেইন কন্টেন্ট
  • the_excerpt() – একটি পোস্টের মেইন কন্টেন্টের প্রথম ৫৫টি শব্দ, এর পরে একটি উপবৃত্ত (…) বা সম্পূর্ণ পোস্টে যাওয়ার জন্য আরও পড়ুন লিঙ্ক। আপনি একটি নির্দিষ্ট উদ্ধৃতির দৈর্ঘ্য কাস্টোমাইজ করতে একটি পোস্টের “Excerpt” ফিল্ডটিও ব্যবহার করতে পারেন।
  • the_ID() – পোস্ট বা পেজের জন্য ID
  • the_meta() – পোস্ট বা পেজের সাথে যুক্ত কাস্টম ফিল্ড
  • the_shortlink() – সাইটের URL এবং পোস্ট বা পেজের ID ব্যবহার করে পেজ বা পোস্টের একটি লিঙ্ক
  • the_tags() – পোস্টের সাথে যুক্ত ট্যাগ বা ট্যাগগুলি
  • the_title() – পোস্ট বা পেজের টাইটেল
  • the_time() – পোস্ট বা পেজের জন্য সময় বা তারিখ। এটি স্ট্যান্ডার্ড PHP তারিখ ফাংশন ফর্ম্যাটিং ব্যবহার করে কাস্টমাইজ করা যেতে পারে।

আপনি শর্তসাপেক্ষ ট্যাগগুলিও ব্যবহার করতে পারেন, যেমন:

  • is_home() – বর্তমান পেজটি হোমপেজ হলে সত্য প্রদান করে
  • is_admin() – অ্যাডমিন স্ক্রিনের ভিতরে থাকলে true রিটার্ন করে, অন্যথায় false
  • is_single() – পেজটি বর্তমানে একটি সিঙ্গেল পোস্ট দেখালে true রিটার্ন করে
  • is_page() – পেজটি বর্তমানে একটি সিঙ্গেল পেজ দেখালে true রিটার্ন করে
  • is_page_template() – একটি পেজ একটি নির্দিষ্ট টেমপ্লেট ব্যবহার করছে কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ: is_page_template(‘about-page.php’)
  • is_category() – পেজ বা পোস্টে নির্দিষ্ট ক্যাটাগরি থাকলে true রিটার্ন করে, উদাহরণস্বরূপ: is_category(‘news’)
  • is_tag() – পেজ বা পোস্টে নির্দিষ্ট ট্যাগ থাকলে true রিটার্ন করে
  • is_author() – লেখকের আর্কাইভ পেজের ভিতরে থাকলে true রিটার্ন করে
  • is_search() – বর্তমান পেজটি একটি সার্চ রেজাল্টের পেজ হলে true রিটার্ন করে
  • is_404() – পেজটি বিদ্যমান না থাকলে true রিটার্ন করে
  • has_excerpt() – পোস্ট বা পেজে একটি সারাংশ থাকলে true রিটার্ন করে

উদাহরণ

চলুন এক নজরে লুপ ইন অ্যাকশনের কিছু উদাহরণ দেখি:

মৌলিক উদাহরণ

ব্লগ আর্কাইভ

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

<?php
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_title( '<h2>', '</h2>' );
        the_post_thumbnail();
        the_excerpt();
    endwhile;
else:
    _e( 'Sorry, no posts matched your criteria.', 'textdomain' );
endif;
?>

আলাদা পোস্ট

ওয়ার্ডপ্রেসে, প্রতিটি পোস্টের নিজস্ব একটি পেজ রয়েছে, যা সেই পোস্টের জন্য প্রাসঙ্গিক তথ্য ডিসপ্লে করে। টেমপ্লেট ট্যাগগুলি আপনাকে কাস্টোমাইজ করার অনুমতি দেয় যে আপনি কোন তথ্য ডিসপ্লে করতে চান।

নিচের উদাহরণে, লুপটি পোস্টের টাইটেল এবং কন্টেন্ট আউটপুট দেয়। আপনি একটি পোস্ট বা পেজের টেমপ্লেট ফাইলে এই উদাহরণটি ব্যবহার করতে পারেন পোস্ট সম্পর্কে সবচেয়ে প্রাইমারি তথ্য ডিসপ্লে করতে। আপনি ক্যাটাগরির মতো পোস্টে আরও ডেটা যুক্ত করার জন্য এই টেমপ্লেটটি কাস্টোমাইজ করতে পারেন।

<?php
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_title( '<h1>', '</h1>' );
        the_content();
    endwhile;
else:
    _e( 'Sorry, no pages matched your criteria.', 'textdomain' );
endif;
?>

ইন্টারমিডিয়েট উদাহরণ

কিছু ক্যাটাগরির পোস্ট ভিন্নভাবে স্টাইল করুন

নিচের উদাহরণটি কয়েকটি কাজ করে:

  • প্রথমত, এটি প্রতিটি পোস্টকে তার টাইটেল, টাইম, অথার, কন্টেন্ট এবং ক্যাটাগরি সহ ডিসপ্লে করে, উপরের পৃথক পোস্টের উদাহরণের মতো।
  • পরবর্তীতে, এটি in_category() টেমপ্লেট ট্যাগ ব্যবহার করে “3” ক্যাটাগরি ID সহ পোস্টগুলিকে ভিন্নভাবে স্টাইল করা সম্ভব করে।

এই উদাহরণে কোডের কমেন্টগুলি লুপের প্রতিটি পর্যায়ে বিশদ বিবরণ প্রদান করে:

<?php
// Start the Loop.
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        /* * See if the current post is in category 3.
          * If it is, the div is given the CSS class "post-category-three".
          * Otherwise, the div is given the CSS class "post".
        */
        if ( in_category( 3 ) ) : ?>
        <div class="post-category-three">
        <?php else : ?>
        <div class="post">
        <?php endif; 

            // Display the post's title.
            the_title( '<h2>', ';</h2>' ); 

            // Display a link to other posts by this posts author.
            printf( __( 'Posted by %s', 'textdomain' ), get_the_author_posts_link() );

            // Display the post's content in a div.
            ?>
            <div class="entry">
                <?php the_content() ?>
             </div>

            <?php
            // Display a comma separated list of the post's categories.
            _e( 'Posted in ', 'textdomain' ); the_category( ', ' ); 

        // closes the first div box with the class of "post" or "post-cat-three"
       ?>
       </div>

    <?php
    // Stop the Loop, but allow for a "if not posts" situation
    endwhile; 

else :
    /*
      * The very first "if" tested to see if there were any posts to
      * display. This "else" part tells what do if there weren't any.
     */
     _e( 'Sorry, no posts matched your criteria.', 'textdomain' );

// Completely stop the Loop.
 endif;
?>

একাধিক লুপ

কিছু পরিস্থিতিতে, আপনাকে একাধিক লুপ ব্যবহার করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি পেজের শীর্ষে একটি সূচিপত্র তালিকায় পোস্টের টাইটেলগুলি ডিসপ্লে করতে চাইতে পারেন এবং তারপরে পেজের আরও নিচে কন্টেন্ট ডিসপ্লে করতে পারেন। যেহেতু ক্যোয়ারী পরিবর্তন করা হচ্ছে না, আমাদের কেবল পোস্টগুলির মাধ্যমে দ্বিতীয়বার লুপ করার প্রয়োজন হলে লুপটি রিওয়াইন্ড করতে হবে। এর জন্য আমরা rewind_posts() ফাংশনটি ব্যবহার করব।

rewind_posts() ব্যাবহার করে

একই ক্যোয়ারী আবার লুপ করার জন্য rewind_posts() ব্যবহার করা হয়। যদি আপনি একই পেজে বিভিন্ন স্থানে একই ক্যোয়ারী দুবার ডিসপ্লে করতে চান তবে এটি কার্যকর।

rewind_posts() ব্যবহারের একটি উদাহরণ এখানে দেওয়া হল:

<?php
// Start the main loop
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_title();
    endwhile;
endif;

// Use rewind_posts() to use the query a second time.
rewind_posts();

// Start a new loop
while ( have_posts() ) : the_post();
    the_content();
endwhile;
?>

সেকেন্ডারি কোয়েরি এবং লুপ তৈরি করা

একই কোয়েরি ব্যবহার করে দুটি লুপ তৈরি করা তুলনামূলকভাবে সহজ ছিল তবে সবসময় যা আপনার প্রয়োজন হবে না। পরিবর্তে, আপনি প্রায়শই টেম্পলেটে আলাদা কন্টেন্ট দেখানোর জন্য একটি দ্বিতীয় কোয়েরি তৈরি করতে চাইবেন। উদাহরণস্বরূপ, আপনি একই পেজে দুটি পোস্টের গ্রুপ ডিসপ্লে করতে চাইতে পারেন, তবে প্রতিটি গ্রুপের সাথে আলাদা কিছু করতে পারেন। নীচে দেখানো হয়েছে এমন একটি সাধারণ উদাহরণ হল সিঙ্গেল পোস্টের নিচে একই ক্যাটাগরির পোস্টের তালিকা সহ একটি সিঙ্গেল পোস্ট ডিসপ্লে করা।

<?php
// The main query.
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_title();
        the_content();
    endwhile;
else :
    // When no posts are found, output this text.
    _e( 'Sorry, no posts matched your criteria.' );
endif;
wp_reset_postdata();                                                        

/*
 * The secondary query. Note that you can use any category name here. In our example,
 * we use "example-category".
 */
$secondary_query = new WP_Query( 'category_name=example-category' );        

// The second loop.
if ( $secondary_query->have_posts() )
    echo '<ul>';
    while ( $secondary_query->have_posts() ) : $secondary_query->the_post();
        the_title( '<li>', '</li>' );
     endwhile;
     echo '</ul>';
endif;
wp_reset_postdata();
?>

উপরের উদাহরণে যেমন দেখা যাচ্ছে, প্রথমে আমরা একটি নিয়মিত লুপ দেখাই। তারপর আমরা একটি নতুন ভেরিয়েবল নির্ধারণ করি যা একটি নির্দিষ্ট ক্যাটাগরি ক্যোয়ারী করতে WP_Query ব্যবহার করে; আমাদের ক্ষেত্রে, আমরা example-category slug বেছে নিয়েছি।

উপরের উদাহরণে নিয়মিত লুপের একটি পার্থক্য রয়েছে তা লক্ষ্য করুন: এটি পোস্ট ডেটা রিসেট করতে wp_reset_postdata() কল করে। দ্বিতীয় লুপ ব্যবহার করার আগে, আপনাকে পোস্ট ডেটা রিসেট করতে হবে। এটি করার দুটি উপায় রয়েছে:

rewind_posts() ফাংশন ব্যবহার করে; অথবা নতুন ক্যোয়ারী অবজেক্ট তৈরি করে।

একাধিক লুপ রিসেট করা

একটি টেম্পলেটে একাধিক লুপ ব্যবহার করার সময় সেগুলোকে রিসেট করা অত্যন্ত গুরুত্বপূর্ণ। রিসেট না করলে বৈশ্বিক $post ভ্যারিয়েবলের মধ্যে কিভাবে তথ্য সংরক্ষণ ও ব্যবহার করা হয় তার কারণে অপ্রত্যাশিত ফলাফল দেখা দিতে পারে। লুপ রিসেট করার জন্য তিনটি প্রধান উপায় রয়েছে যেগুলো কল করার পদ্ধতির উপর নির্ভর করে:

  • wp_reset_postdata()
  • wp_reset_query()
  • rewind_posts()

wp_reset_postdata ব্যবহার করে

wp_reset_postdata() ব্যবহার করুন যখন আপনি WP_Query সহ কাস্টম বা একাধিক লুপ চালাচ্ছেন। এই ফাংশনটি প্রধান ক্যোয়েরিতে বর্তমান পোস্টে গ্লোবাল $post ভেরিয়েবলটি পুনরুদ্ধার করে।

আপনি যদি সর্বোত্তম অনুশীলনগুলি অনুসরণ করে থাকেন, তবে লুপগুলি পুনরায় সেট করতে এটি সবচেয়ে সাধারণ ফাংশন যা আপনি ব্যবহার করবেন।

এই ফাংশনটি সঠিকভাবে ব্যবহার করতে, WP_Query সহ যেকোনো লুপের পরে নিম্নলিখিত কোডটি রাখুন:

<?php wp_reset_postdata(); ?>

এখানে WP_Query ব্যবহার করে একটি লুপের উদাহরণ রয়েছে যা wp_reset_postdata() দিয়ে পুনরায় সেট করা হয়েছে।

 <?php
// Example argument that defines three posts per page.
$args = array( 'posts_per_page' => 3 ); 

// Variable to call WP_Query.
$the_query = new WP_Query( $args ); 

if ( $the_query->have_posts() ) :
    // Start the Loop
    while ( $the_query->have_posts() ) : $the_query->the_post();
        the_title();
        the_excerpt();
    // End the Loop
    endwhile;
else:
// If no posts match this query, output this text.
    _e( 'Sorry, no posts matched your criteria.', 'textdomain' );
endif; 

wp_reset_postdata();
?> 

wp_reset_query() ব্যবহার করে

wp_reset_query() WP_Query এবং global $post ডেটাকে অরিজিনাল মেইন ক্যোয়ারিতে পুনরুদ্ধার করে। আপনার লুপের মধ্যে query_posts() ব্যবহার করলে এই ফাংশনের মাধ্যমে আপনার লুপ রিসেট করতে হবে। আপনি কাস্টম লুপের পরে WP_Query দিয়ে এটি ব্যবহার করতে পারেন কারণ এটি চালানোর সময় এটি আসলে wp_reset_postdata() কল করে। যাইহোক, WP_Query-এর সাথে জড়িত যেকোনো কাস্টম লুপের সাথে wp_reset_postdata() ব্যবহার করা সর্বোত্তম অনুশীলন।

এই ফাংশনটি সঠিকভাবে ব্যবহার করতে, query_posts() সহ যেকোনো লুপের পরে নিম্নলিখিত কোডটি রাখুন।

<?php wp_reset_query(); ?>

Leave a Comment

Share this Doc

লুপ

Or copy link

CONTENTS

Subscribe

×
Cancel