آموزش کوئری وردپرس + query در وردپرس

با کوئری در وردپرس می‌توانیم انواع پست تایپ‌های سایت را فراخوانی کرده و نمایش دهیم. در آموزش یاد می‌گیرید با query وردپرس به ۲ روش اصلی کار کنید. همچنین ترفندها و پارامترهای پرکاربرد آن را با مثال عملی بررسی می‌کنیم.

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

کوئری در وردپرس استفاده فراوانی دارد! معروف‌ترین آن‌ها نمایش پست‌ها (نوشته، برگه، محصولات و …) در صفحات مختلف سایت است. مثلاً وقتی صفحه اول یک سایت وردپرسی را باز می‌کنید، جدیدترین نوشته‌ها، آخرین محصولات، پر بازدیدترین‌ها و حتی محبوب‌ترین‌های سایت به شما نمایش داده می‌شود.

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

ساختار کوئری وردپرس

وقتی از کوئری وردپرس استفاده می‌کنیم، نیاز نیست مستقیماً با دیتابیس صحبت کنیم. دوستانی که با زبان‌های دیتابیسی مثل SQL آشنا هستند، می‌دانند که برای واکشی داده‌ها از دیتابیس باید دستورات مخصوصی بنویسیم. (مثل کار با یتابیس PHP)

در استفاده از query در وردپرس صرفاً می‌گوییم که چه پست‌هایی را می‌خواهیم واکشی کنیم. ایجاد دستورات دیتابیس و فراخوانی آن‌ها بر عهده وردپرس خواهد بود و ما صرفاً از نتایجش استفاده می‌کنیم. 🙂

در یک نگاه کلی، استفاده از کوئری سه بخش کلی دارد:

  • ایجاد کوئری و تعریف پارامترها (ویژگی پست‌هایی که می‌خواهیم نمایش داده شوند)
  • نمایش پست‌ها به کمک حلقه‌های وردپرس
  • ریست کردن query برای پاکسازی نتایج استخراج‌شده

اگر می‌خواهید داده‌هایی را در جداول سفارشی خودتان ثبت کنید یا آن‌ها را فراخوانی کنید شاید wpdb وردپرس برایتان مناسب‌تر باشد.

پارامترهای کوئری وردپرس

قبل از هر چیزی، ابتدا باید مشخص کنیم که کدام پست‌ها در سایت را لازم داریم. می‌دانید که در وردپرس نوع پست (post type) های مختلفی وجود دارد. اگر نمی‌دانید آموزش ساخت پست تایپ جدید در وردپرس را مرور کنید تا یاد بگیرید چطور یک نوع جدید بسازید!

همچنین هر کدام از پست‌ها دارای ویژگی‌های متفاوتی اما مشابهی هستند. مثلاً با دسته‌بندی در وردپرس این پست‌ها را دسته‌بندی می‌کنیم. به هر کدام برچسب زده و برای هر پست تاریخی برای انتشار و آخرین ویرایش داریم. هر پست می‌تواند وضعیت‌های مختلفی داشته باشد؛ مثلاً منتشر شده، پیش‌نویس یا در انتظار بازبینی باشد.

علاوه بر ویژگی‌هایی که مربوط به پست‌های سایت است، یکسری ویژگی‌ها مخصوص کوئری فعلی است که از وردپرس می‌خواهیم مجموعه‌ای از پست‌ها را نمایش دهد. مثلاً ممکن است بخواهیم در صفحه اصلی ۲۰ پست آخر را نمایش دهیم. اما برای بخش مطالب پیشنهادی، صرفاً ۳ مورد را قرار دهیم.

قبل از استفاده از کوئری وردپرس باید این ویژگی‌ها را مشخص کنیم تا بتوانیم پست‌های مورد نظرمان را از دیتابیس فراخوانی کرده و نمایش دهیم.

چند پارامتر پرکاربرد query

برای تعریف پارامترها، از یک آرایه کلید-مقدار استفاده می‌کنیم. (آرایه در PHP) ابتدا به ساختار زیر توجه کنید تا بعدش در مورد پارامترها توضیح دهم:

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 6,
    'cat'         => '1,4,6,7',
    'orderby'        => 'modified'
);

در قطعه کد بالا، ۴ پارامتر مشخص کرده‌ام که ویژگی‌های پست مورد نظر من را مشخص می‌کند:

  • post_type : پست تایپ مورد نظر من را مشخص می‌کند. می‌توانم به جای یک رشته متنی، از آرایه استفاده کنم تا چند پست تایپ را انتخاب کنم.
  • posts_per_page : تعداد پست‌هایی که قرار است واکشی شود را مشخص می‌کند. همانطور که از اسمش مشخص است، تعداد پست‌های موجود در هر صفحه از این کوئری را مشخص می‌کنیم. اگر تعریفش نکنم، به طور پیشفرض از تنظیمات وردپرس خوانده می‌شود.
  • cat : مقدار id دسته‌بندی‌هایی که پست‌ها در آن‌ها قرار گرفته را مشخص می‌کند.
  • orderby : ویژگی که مرتب‌سازی پست‌ها بر اساس آن انجام می‌شود را مشخص می‌کند. در اینجا من با modified ترتیب نمایش را بر اساس آخرین به‌روزرسانی‌ها تعیین کرده‌ام.

اگر پارامترهای بالا را به query وردپرس بدهیم، انتظار داریم «۶ تا نوشته به‌روزشده‌ای که در دسته‌های 1 و 4 قرار دارند» را به ما بدهد. در ادامه دو روش برای اجرا و نمایش این پست‌ها یاد می‌گیریم.

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

کلاس WP_Query در وردپرس

اولین روش، استفاده از کلاس WP_Query است که امکان کار با کوئری‌های وردپرس را به صورت شئ گرا به ما می‌دهد. از نظر ساختاری، این کلاس در فایل query.php در مسیر wp-includes قرار گرفته است، اما می‌توانیم از آن در همه فایل‌های پوسته یا پلاگین اختصاصی خود استفاده کنیم.

می‌دانیم که برای ایجاد شئ از کلاس در PHP از کلیدواژه new استفاده کرده و در صورت نیاز، ورودی‌هایی برای آن تعیین می‌کنیم. من چند پارامتر ساده تعیین می‌کنم و یک شئ از WP_Query می‌سازم:

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 6,
    'orderby'        => 'rand',
    'author'         => 9
);

$query = new WP_Query( $args );

در این کوئری وردپرس، ۶ نوشته‌ی آخر کاربر با id شماره 9 را گرفته و به شکل رندوم مرتب‌سازی می‌کنم. منظور از رندوم این است که در هر بار اجرا، ترتیب ۶ نوشته به طور تصادفی انتخاب می‌شود.

اکنون نتایج فراخوانی پست‌های ما در شئ $query قرار دارد. همانطور که از اصول برنامه نویسی شی گرا می‌دانیم، هر شئ متدها و ویژگی‌هایی دارد. شئ کوئری وردپرس ما نیز دارای متدها و مقادیر ویژگی مختلفی است که بنا به نیازمان از آن‌ها استفاده می‌کنیم.

از متدهای آن در قسمت حلقه‌ها استفاده می‌کنیم، اما برای مثال، دو ویژگی (متغیر) که این شئ دارد عبارت‌اند از:

  • post_count : تعداد پست‌هایی در کوئری که برای نمایش آماده هستند.
  • current_post : وقتی اطلاعات تک تک پست‌ها را دریافت می‌کنیم، این ویژگی به ما شماره اندیس پست فعلی که در حال نمایش داده شدن است را برمی‌گرداند.

برای دسترسی به ویژگی‌ها، به شکل $query->current_post عمل می‌کنیم.

کد حلقه query در وردپرس

حالا نوبت نمایش پست‌های فراخوانی شده رسیده! با متد have_posts() چک می‌کنیم که آیا پستی برای نمایش باقی مانده یا نه. سپس در هر با اجرای حلقه، از the_post() استفاده می‌کنیم تا اطلاعات هر پست در اختیارمان قرار بگیرد.

while ( $query->have_posts() ) {

    $query->the_post();

    // post loop contents

}

من در اینجا به جای استفاده از شرط PHP برای بررسی اینکه آیا پستی وجود دارد یا نه، مستقیماً از حلقه while استفاده می‌کنم. به اینصورت اگر پستی برای نمایش وجود داشته باشد، وارد بدنه حلقه شده و محتوای پست را نمایش می‌دهد. (ببینید: حلقه در PHP)

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

while ( $query->have_posts() ) {

    $query->the_post(); ?>

    <div class="post-item">
        <a href="<?php the_permalink() ?>"><?php the_title() ?></a>
		<p class="post-exceprt"><?php the_exceprt() ?></p>
    </div>

<?php } ?>

در این قطعه کد، عنوان، لینک و خلاصه پست را با توابع زیر قرار داده‌ام:

  • the_permalink() : لینک پست (پیوند یکتا) را چاپ می‌کند.
  • the_title() : عنوان پست را در خروجی نمایش می‌دهد.
  • the_exceprt() : خلاصه پست را چاپ می‌کند. (اگر خلاصه خالی باشد، چند خط ابتدای متن اصلی را استفاده می‌کند.)

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

در انتهای حلقه، می‌بایست عملیات پاکسازی کوئری (ریست کوئری) انجام دهیم. اگر این کار را انجام ندهیم و پس از این کوئری، query دیگری اجرا شود، نتایج و پارامترهای این کوئری روی query بعدی در وردپرس تأثیر خواهد گذاشت.

برای این کار کافی است پس از پایان حلقه نمایش پست‌ها با کوئری، تابع wp_reset_postdata() را صدا بزنید.

<?php
while ( $query->have_posts() ) {

    $query->the_post();
    // post loop contents
}
wp_reset_postdata();
?>

تابع get_posts وردپرس

برای اجرای کوئری در وردپرس می‌توانیم از تابع get_psots() نیز استفاده کنیم. این تابع به طور پیشفرض، نوشته‌های وردپرس (پست تایپ post) را فراخوانی می‌کند. مگر در پارامترهای ورودی، نوع پست را مشخص کنیم.

این تابع درون خودش از کلاس WP_Query استفاده می‌کند. اما نتایج را به شکل متفاوت‌تری در اختیارمان می‌گذارد و برخی از پارامترها در آن (مثلاً همین post type) مقدار پیشفرض دارند.

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

خروجی این تابع آرایه‌ای از نتایج است. بنابراین برای نمایش آن‌ها از حلقه foreach استفاده می‌کنم. این بار می‌خواهم آخرین نوشته‌های سایت که اخیراً ویرایش شده‌اند را در یک لیست ساده نمایش دهم.

برای این که بررسی کنیم آیا نتیجه ما دارای حداقل یک پست است یا نه، مستقیماً $posts را در if استفاده می‌کنیم. می‌دانید که آرایه خالی معادل false است و وارد بدنه شرط نمی‌شود.

<?php
$args = array(
            'orderby' => 'modified',
            'posts_per_page' => '9'
);

$posts = get_posts( $args );

if( $posts ){

    echo "<ul>";

    foreach( $posts as $post ){
        setup_postdata( $post );
        ?>
        <li><a href="<?php the_permalink() ?>"><?php the_title() ?></a></li>
        <?php
        }
    echo "</ul>";
}
wp_reset_postdata();

?>

از تابع setup_postdata() برای آماده‌سازی داده‌های پست استفاده شده است. این کار مشابه استفاده از the_post() در کلاس کوئری وردپرس است.

اگر مایلید مثال دیگری از کاربرد کوئری وردپرس ببینید، آموزش نمایش پست‌های مرتبط وردپرس را ببینید:

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

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

در این آموزش سعی کردم شما را با استفاده از سیستم کوئری در وردپرس آشنا کنم. حتماً پیشنهاد می‌کنم سری به صفحه مستندات کلاس کوئری بزنید و پارامترهایی که قابل تنظیم هستند را بررسی کنید. شما می‌توانید queryهای بسیار پیچیده‌ای با همین ۲ روشی که یاد گرفته‌اید اجرا کنید.

برای مرور توابع و متدهای اصلی، جدول زیر را یک بار بررسی کنید:

new WP_Query($args)ایجاد کوئری جدید
have_posts()بررسی موجود بودن پست برای نمایش
the_post()آماده کردن دیتای پست برای نمایش
setup_postdata()آماده کرند دیتای پست برای نمایش
wp_reset_postdata()ریست کردن کوئری اجرا شده

امیدوارم از این آموزش استفاده کرده باشید. اگر سؤال یا نکته تکمیل کننده‌ای در کار با کوئری‌های وردپرس دارید، از بخش دیدگاه‌ها با ما و دوستانتان به اشتراک بذارید.