WP_Query

کلاس نوشتن کوئری‌های متنوع در وردپرس

Source File:wp-includes/class-wp-query.php

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

یکی از این کلاسها، WP_Query می‌باشد. با استفاده از کلاس WP_Query شما دو سناریو برای گرفتن یک کوئری بهینه پیش رو دارید. در ابتدا شما باید بدانید که وردپرس در حال حاضر با چه نوع درخواستی روبروست.

برای دانستن این موضوع ویژگی $is_* طراحی شده است که این اطلاعات را در خود نگه می دارد. با استفاده از عبارت‌های شرطی می توانید برای تعامل و گرفتن خروجی استفاده کنید.

این سناریو را پلاگین‌نویسها بیشتر استفاده می کنند.(سناریو دوم را طراحان قالب استفاده می‌کنند.)

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

برای نمونه، have_post() که به صورت $wp_query->have_posts() فراخوانی می شود و در صورتی که پستی وجود داشته باشد آنها را نمایش می‌دهد.

در صورتی که یک حلقه while در ابتدای حلقه باشد، از have_post به عنوان یک شرط استفاده می‌شود و تا زمانی که پستی برای نمایش وجود داشته باشد این حلقه تکرار می‌شود.

در هر بار تکرار حلقه، the_post()، که به صورت $wp_query->the_post() فراخوانی می‌شود، متغیرهای داخلی wp_query  و متغیر سراسری post را مقداردهی می‌کند.

معمولا این توابع زمانی که طراح قالب نیاز به استفاده از یک لوپ داشته باشد استفاده می‌شود.

نکته مهم: اگر از the_post در کوئری استفاده کردید، حتما در انتهای حلقه از wp_reset_postdata استفاده کنید تا تنظیمات کوئری‌های بعدی مقدارهای درست را برگرداند.

یک مثال در یک حلقه استاندارد:

<?php
 
// The Query
$the_query = new WP_Query( $args );
 
// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

یک مثال دیگر از نحوه استفاده از WP_Query در حلقه‌ها

<?php 
// the query
$the_query = new WP_Query( $args ); ?>
 
<?php if ( $the_query->have_posts() ) : ?>
 
    <!-- pagination here -->
 
    <!-- the loop -->
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <h2><?php the_title(); ?></h2>
    <?php endwhile; ?>
    <!-- end of the loop -->
 
    <!-- pagination here -->
 
    <?php wp_reset_postdata(); ?>
 
<?php else : ?>
    <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>

اگر شما نیاز دارید که WP_Query را در چند حلقه استفاده کنید به شکل زیر می‌توانید این کار را انجام دهید.

<?php
 
// The Query
$query1 = new WP_Query( $args );
 
// The Loop
while ( $query1->have_posts() ) {
    $query1->the_post();
    echo '<li>' . get_the_title() . '</li>';
}
 
/* Restore original Post Data 
 * NB: Because we are using new WP_Query we aren't stomping on the 
 * original $wp_query and it does not need to be reset with 
 * wp_reset_query(). We just need to set the post data back up with
 * wp_reset_postdata().
 */
wp_reset_postdata();
 
 
/* The 2nd Query (without global var) */
$query2 = new WP_Query( $args2 );
 
// The 2nd Loop
while ( $query2->have_posts() ) {
    $query2->the_post();
    echo '<li>' . get_the_title( $query2->post->ID ) . '</li>';
}
 
// Restore original Post Data
wp_reset_postdata();
 
?>

ویژگی‌ها و متدها

WP_Query شامل ویژگی‌ها و متدهای متنوعی می‌باشد، اما نباید آنها را مستقیما تغییر داد. می توان با استفاده از متدهای موجود مقادیر آنها را تغییر داد.

این مقاله ادامه دارد….