حلقه وردپرس چیست؟
حلقه وردپرس یک مکانیسم پیشفرض در وردپرس میباشد که میتوان توسط ان با قرار دادن ان در فایل های قاب وردپرس از نوشته ها یا پست ها خروجی گرفت.
در حلقه های وردپرس تمام موارد مختلف نوشته را بازیابی میکند و سپس طبق دستور العمل شما ان را فرمت میکند و خروجی میدهد.کار در حلقه وردپرس به این صورت است که تمام اطلاعات یک نوشته را از پایگاه داده وردپرس استخراج میکند و سپس بر اساس کدنویسی شما بر پایه php و html ان را پردازش میکند.
فهرست محتوای این مقاله
جزئیات حلقه
حلقه پایه به شکل زیر است :
<?php
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// Display post content
endwhile;
endif;
?>
این حلقه می گوید وقتی پست وجود دارد ، حلقه ها را حلقه زده و نمایش دهید. با جزئیات بیشتر شکسته شده است:
- have_posts() بررسی میکند که ایا اصن نوشته ای وجود دارد؟
- اگر نوشته ای وجود دارد ، حلقه
while
ادامه میدهد تا زمانی که شرط داخل پرانتز صحیح باشدتا زمانی که have_posts() درست باشد ، حلقه ادامه خواهد یافت.
آموزش استفاده از حلقه
از حلقه معرفی شده باید در جای مناسب مثل فایل index.php و.. استفاده شود.به طور مثال نمونه کد زیر برای فایل 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();
get_footer();
?>
حلقه چه مورادی را نمایش میدهد؟
حلقه وردپرس میتواند المان های مختلف یک نوشته را در خود نمایش دهد. که میتواند شامل موراد زیر باشد .
next_post_link() – a link to the post published chronologically after the current post
previous_post_link() – a link to the post published chronologically before the current post
the_category() – the category or categories associated with the post or page being viewed
the_author() – the author of the post or page
the_content() – the main content for a post or page
the_excerpt() – the first 55 words of a post’s main content followed by an ellipsis (…) or read more link that goes to the full post. You may also use the “Excerpt” field of a post to customize the length of a particular excerpt.
the_ID() – the ID for the post or page
the_meta() – the custom fields associated with the post or page
the_shortlink() – a link to the page or post using the url of the site and the ID of the post or page
the_tags() – the tag or tags associated with the post
the_title() – the title of the post or page
the_time() – the time or date for the post or page. This can be customized using standard php date function formatting.
شما همچنین میتوانید از توابع شرطی زیر هم استفاده کنید
is_home() – Returns true if the current page is the homepage
is_admin() – Returns true if inside Administration Screen, false otherwise
is_single() – Returns true if the page is currently displaying a single post
is_page() – Returns true if the page is currently displaying a single page
is_page_template() – Can be used to determine if a page is using a specific template, for example: is_page_template('about-page.php')
is_category() – Returns true if page or post has the specified category, for example: is_category('news')
is_tag() – Returns true if a page or post has the specified tag
is_author() – Returns true if inside author’s archive page
is_search() – Returns true if the current page is a search results page
is_404() – Returns true if the current page does not exist
has_excerpt() – Returns true if the post or page has an excerpt
مثال های پایه و کاربردی از لوپ وردپرس
ارشیو وبلاگ
به طور ساده و معمول در صفحه بایگانی وبلاگ از کد زیر استفاده میشود
<?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;
?>
استایل متفاوت برای دسته بندی خاص
<?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 کردن در حلقه (دوباره صدا زدن حلقه از ابتدا) را اجرا کنید تا بتوانید برای بار دوم به داخل حلقه در وردپرس بازگشته و روی پست های دارای شرط اجرای حلقه، کدهای خود را مجددا اجرا نمایید.
برای این منظور شما می باید از تابع rewind_post استفاده نمایید.
<?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;
?>
ساخت کوئری دوم در یک صفحه و استفاده از حلقه چندگانه در وردپرس
همانگونه که مشاهده کردید، استفاده از دو حلقه با یک کوئری یکسان بسیار آسان می باشد، اما این چیزی نیست که شما همیشه در حلقه چندگانه در وردپرس به آن نیاز دارید.
یکی دیگر از موارد استفاده از حلقه چندگانه در وردپرس این می باشد که شما نیاز دارید بعد از یک کوئری و استفاده آن در حلقه، از یک کوئری دوم جداگانه ای در صفحه استفاده کرده، تا محتوای متفاوتی را در صفحه خود نمایش دهید.
به عنوان مثال شما می خواهید دو دسته از پست های خود را در دو بخش مجزا در یک صفحه به نمایش در بیاورید بنابراین برای اجرا شدن آن می باید از دو کوئری متفاوت در حلقه های خود استفاده نمایید. این مثال ساده، یک مورد دیگر از کاربردهای حلقه چندگانه در وردپرس یا همان 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 تا حد امکان
یکی دیگر از best practice ها در وردپرس، جلوگیری از استفاده تابع query_post می باشد. تا حد امکان سعی می شود که از این تابع در کدها استفاده نشود مگر اینکه واقعا مجبور به استفاده از آن باشیم. به همین دلیل که از این تابع به ندرت استفاده می شود بنابراین نباید بصورت زیاد از wp_reset_query در بین کدهای شما، استفاده گردد و به جای آن از تابع wp_reset_postmeta برای reset کردن حلقه های چندگانه، استفاده گردد.
برای استفاده از این تابع، باید تابع wp_reset_query را دقیقا بعد از هر حلقه ای که با query_post اجرا می شود، قرار دهید.
منبع : https://developer.wordpress.org/themes/basics/the-loop/#the-loop-in-detail