حلقه چندگانه در وردپرس یا Multiple Loops

حلقه چندگانه در وردپرس یا همان Multiple Loops از مفاهیم بسیار مهم و کاربردی در وردپرس می باشد که شما باید کاملا با آن آشنا باشید چرا که در بسیاری از موارد لازم دارید تا از چندین حلقه یا همان حلقه چندگانه در وردپرس، در بین کدهای خود استفاده کنید.

در بسیاری از موارد در وردپرس، شما نیاز دارید تا بیشتر از یک حلقه را در کدهای خود استفاده کنید. در این موارد شما نیاز خواهید داشت تا از مفاهیم مهم در مورد حلقه چندگانه در وردپرس، بهره بگیرید.

به عنوان مثال فرض کنید که شما می خواهید در بالای صفحه، عنوان های پست های خود را در یک جدول به صورت لیست وار نمایش دهید و سپس در ادامه صفحه، محتوای داخل هر پست را به نمایش در آورید.

از آنجایی که کوئری شما برای حلقه، عوض نمی شود و دقیقا همان کوئری قبلی می باشد شما نیاز دارید تا به راحتی عمل rewind کردن در حلقه (دوباره صدا زدن حلقه از ابتدا) را اجرا کنید تا بتوانید برای بار دوم به داخل حلقه در وردپرس بازگشته و روی پست های دارای شرط اجرای حلقه، کدهای خود را مجددا اجرا نمایید.

برای این منظور شما می باید از تابع rewind_post استفاده نمایید.

حلقه چندگانه در وردپرس و کاربردهای آن

نحوه استفاده از تابع rewind_post

همانگونه که در بالا نیز اشاره شد، شما زمانی می توانید از تابع rewind_post استفاده کنید که بخواهید یک کوئری یکسان را (که کمی پیشتر در کد خود استفاده کرده اید) برای بار دوم اجرای حلقه در وردپرس، فراخوانی کنید.

در واقع شما می خواهید اطلاعات برگشتی یک کوئری را دوبار و در جاهای مختلف یک صفحه، مورد استفاده قرار دهید. مثال زیر نمونه ای از استفاده تابع rewind_post می باشد:

// Start the main loop
<?php
    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 with the same query as before
    while ( have_posts() ) : the_post();
        the_content();
    endwhile;
?>

ساخت کوئری دوم در یک صفحه و استفاده از حلقه چندگانه در وردپرس

همانگونه که مشاهده کردید، استفاده از  دو حلقه با یک کوئری یکسان بسیار آسان می باشد، اما این چیزی نیست که شما همیشه در حلقه چندگانه در وردپرس به آن نیاز دارید.

یکی دیگر از موارد استفاده از حلقه چندگانه در وردپرس این می باشد که شما نیاز دارید بعد از یک کوئری و استفاده آن در حلقه، از یک کوئری دوم جداگانه ای در صفحه استفاده کرده، تا محتوای متفاوتی را در صفحه خود نمایش دهید.

به عنوان مثال شما می خواهید دو دسته از پست های خود را در دو بخش مجزا در یک صفحه به نمایش در بیاورید بنابراین برای اجرا شدن آن می باید از دو کوئری متفاوت در حلقه های خود استفاده نمایید. این مثال ساده، یک مورد دیگر از کاربردهای حلقه چندگانه در وردپرس یا همان Multiple Loops ، می باشد.

مثال زیر این مورد را به روشنی برای شما نمایش می دهد. در این مثال، ابتدا در حلقه اول، یک پست به صورت تکی (یا همان Single Post) به نمایش در می آید و سپس در حلقه بعدی لیست پست هایی که دسته بندی یکسان با این پست را دارند (یا همان پست های مرتبط با پست نمایش داده شده) نمایش داده می شود.

<?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();
        echo '<li>' . get_the_title() . '</li>';
    endwhile;
    echo '</ul>';
    endif;
wp_reset_postdata();
?>

همانگونه که در مثال بالا مشاهده می کنید، در ابتدا یک حلقه ساده در ورپرس اجرا شده است، سپس یک متغیر جدید با کلاس WP_Query  جهت درخواست یک دسته بندی خاص، ساخته شده است تا کوئری آن در حلقه اجرا شود (در این مثال از دسته بندی example-category استفاده شده است)

در کدها مشخص است که تفاوت عمده این مثال با مثال قبل، فراخوانی تابع wp_reset_postdata می باشد که قبل از تعریف متغیر کوئری در حلقه اول، استفاده شده است. این تابع برای reset کردن داده های حلقه قبلی مورد استفاده قرار می گیرد.

همواره در نظر داشته باشید که در حلقه چندگانه در وردپرس، هرگاه بخواهید از حلقه دوم در یک صفحه استفاده کنید، پیش از استفاده از حلقه دوم، شما نیاز دارید که کلیه داده های پست های حلقه قبل reset نمایید. برای این کار دو راه دارید:

  • استفاده از تابع rewind_post (در صورت استفاده از یک کوئری یکسان در هر دو حلقه)
  • ساخت یک شی کوئری جدید یا همان new query object و استفاده از wp_reset_postdata پیش از آن

Reset کردن حلقه چندگانه در وردپرس

این امر بسیار مهم است که در هنگام استفاده از حلقه های چندگانه در یک قالب، پس از هر حلقه، آن ها را reset نمایید. در صورت انجام ندادن این کار و به دلیل اینکه داده ها به چه نحوی در داخل متغیر سراسری post یا همان global $post variable ذخیره می شوند، شما ممکن است نتایج دور از انتظاری را مشاهده نمایید.

سه راه اصلی برای reset کردن حلقه چندگانه وجود دارد که استفاده از آن به این بستگی دارد که شما چه فراخوانی هایی را در بین کدهای خود انجام داده اید. این سه راه عبارتند از:

  • استفاده از تابع wp_reset_postdata

  • استفاده از تابع wp_reset_query

  • استفاده از تابع rewind_posts

موارد استفاده از تابع wp_reset_postdata

بطور کلی می توان گفت شما هرجا که از حلقه چندگانه در وردپرس و یا هر کوئری سفارشی که با WP_Query ایجاد کرده اید، استفاده می کنید، می باید پس از آن از تابع wp_reset_postdata برای reset کردن حلقه چندگانه در وردپرس، بهره ببرید.

استفاده از این تابع باعث می شود تا وردپرس متغیر سراسری post (یا همان global $post variable) را دوباره به حالت پست جاری در کوئری اصلی برگردانده و این متغیر را جایگزین متغیر post قبلی گرداند.

در صورتی که شما اصول استاندارد سازی کدها در وردپرس یا همان best practice های وردپرس را رعایت می کنید، یک best practice عمومی این می باشد که شما بعد از استفاده از هر حلقه در وردپرس، آن را توسط این تابع reset نمایید.

در واقع هرجا که از WP_Query استفاده کرد، پس از پایان شرط حلقه، بهتر است تا از کد زیر استفاده نمایید:

<?php wp_reset_postdata(); ?>

مثال زیر نیز، یک نمونه از کاربرد 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 داده های متغیر سراسری post و همین طور شی ساخته شده از WP_Query را به حالت کوئری اصلی، بازیابی می کند.توجه داشته باشید، در صورتی که شما در حلقه خود از تابع query_posts استفاده کرده باشید، حتما باید از این تابع برای reset کردن حلقه قبلی خود استفاده نمایید، در غیر این صورت با خروجی های غیرقابل انتظاری در بین کدهای خود مواجه خواهید شد.

در نظر بگیرید که شما برای reset کردن هر نوع کوئری سفارشی خود که با WP_Query نیز ایجاد شده است، می توانید پس از حلقه های سفارشی خود، از این تابع استفاده کنید، چرا که در واقع در داخل این تابع، تابع wp_reset_postmeta فراخوانی می شود. اگرچه best practice این می باشد که به جای استفاده از آن، از تابع wp_reset_postmeta بعد از حلقه های سفارشی خود که با WP_Query ایجاد شده است، استفاده کنید.

برای استفاده از این تابع، باید تابع wp_reset_query را دقیقا بعد از هر حلقه ای که با query_post اجرا می شود، قرار دهید.

راهنما برای مطالعه بیشتر:

شما می توانید از لینک های زیر برای مطالعه بیشتر استفاده نمایید:

بازگشت به همه سرفصل های مرجع طراحی قالب وردپرس