با کوئری در وردپرس میتوانیم انواع پست تایپهای سایت را فراخوانی کرده و نمایش دهیم. در آموزش یاد میگیرید با 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() | ریست کردن کوئری اجرا شده |
امیدوارم از این آموزش استفاده کرده باشید. اگر سؤال یا نکته تکمیل کنندهای در کار با کوئریهای وردپرس دارید، از بخش دیدگاهها با ما و دوستانتان به اشتراک بذارید.
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
کارتون عالیه یه دنیا ممنون
خوشحالیم که براتون مفید بوده دوست من
سلام خسته نباشید.
من کوئری رو زدم چطور اونو نمایش بدم؟ مثلا واسه ارزونتر ین قیمت چطور تو آرشیو محصولات نشونش بدم؟
سلام
باید نتایج کوئری رو بهکمک یک حلقه نمایش بدید. یه نمونهی سادهاش در همین آموزش با while پیادهسازی شده. نمونه دیگهاش رو هم در لینک اواخر آموزش مربوط به نمایش پستهای مرتبط میتونید ببینید.
با این حلقه شما html رو ایجاد میکنید. قاعدتاً لازمه برای ظاهر دلخواهتون، کدهای cssـش رو هم در استایل قالبتون بنویسید.
سلام، مقاله خیلی خوبی بود
من یک سایت فروشگاهی دارم و بخش بلاگش رو در یک سابفولدر /blog/ راه اندازی کردم. ولی مشکل میدونی چیه، من میخوام مقالات رو با کوئری زدم در صفحه اصلی بیارم ولی نمیشه، چون دیتابیسش جداست و سایت در سابفولدر جداگانه بالا آوردم.
برای این که بتوانم مقالات رو در صفحه اصلی بیارم چکار کنم و چطوری کوئری بزنم.
سلام
بستگی به نیاز و محدودیتها داره. یه راهحلش اینه که اگه REST API روی وردپرس بلاگ فعاله، ازش در بخش فروشگاهی استفاده کنی و پستهای آخر (یا مورد نظر) رو بگیرین
یه راهحل دیگه هم اینه به صورت زیر، یه شیء جدید wpdb بسازید و به دیتابیس وردپرس بلاگ وصل بشید و کوئری مدنظر رو اجرا کنید.
یه راه حل جامعتر هم اینه که مستقیم کوئری select رو روی دیتابیس بزنید و کاری به wpdb نداشته باشید!
سلام خسته نباشید ممنون بابت راهنماییتون، ولی میشه یک نمونه کامل اجرا شده رو برام بزارید ببنوم چطوری هست.
اون راه کار دوم که شیء جدید wpdb رو اگر بشه نمونه آخرین مقالات منتشر شده در بلاگ رو بگیره و در صفحه اصلی نمایش بده. ممنون میشم.
اگر هم هزینه میخوام بهم بگید واریز میکنم.
کافیه یه دستور select روی جداول مورد نیاز بزنید. توی این مثال من فقط اطلاعات (id، عنوان، تاریخ و نامک) ۴ تا پست آخر رو میگیرم:
آرایه
$posts
حاوی چهار نوشتهی منتشرشدهی اخیر هست.یادتون نره که اطلاعات دیتابیس رو توی خط اول جایگزین کنید.
برای اشنایی بیشتر با wpdb میتونید آموزش دیتابیس wpdb وردپرس رو ببینید.
سلام وقت بخیر
من دامنه سایت رو عوص کردم و الان سایت برای نمایش محصولاتم به مشکل خورده.چطور می تونم یه کوئری بنویسم که تمامی لینک های قبلی به دامین جدیدم ارجا بشه؟
سلام
برای چنین موردی بهتره ارجاع ندید و کلاً آدرس قبلی رو از توی دیتابیس عوض کنید. متناسب با دیتابیستون، میتونید با دستور UPDATE در MySQL (مثلاً مستقیماً از phpmyadmin) آدرسهای قبلی رو به جدید درون محتوا تغییر بدید.
البته اگه تنظیماتتون هم نیاز باشه باید همین کار رو برای جدولش انجام بدید.
سلام وقتتون بخیر
الان من از این کد استفاده کردم فقط پست تایپ تغییر دادم مشکلی هست وقتی آیدی دسته بندی را در کد میزرام چیزی نشون نمیده ولی وقتی آیدی را بر می دارم همه محصولات را نمایش میده کد به این صورت استفاده کردم
الان در این کد یک دسته بندی دارم با آیدی 37 که سه تا محصول داره
سلام
از ووکامرس استفاده میکنید؟
ووکامرس برای دستهبندی محصولات از taxonomy به نام product_cat استفاده میکنه و عادیه که محصولی در catها پیدا نکنه! اگر میخواید محصولات یک دستهبندی رو نمایش بدید، از slug اون دستهبندی به جای laptop مشابه زیر استفاده کنید:
بله ممنونم درست و محصولات را نمایش داد.
یه مورد دیگه اینکه اگر بخواهم نام تمام دسته بندی ها و تصویر های شاخصشون را در ووکامرس نمایش بدهیم چطور باید آنها را فراخوانی کنیم؟ ممنون میشم راهنمایی کنید.
برای گرفتن دستهبندیها پیشنهاد میکنم مشابه کد زیر فراخوانیشون کنید:
حالا با این دستورها در یک حلقه ساختار نمایششون رو ایجاد کنید. موفق باشید.
مرسی ازتون
لطفا اموزشهای وردپرس رو ادامه بدین
سلام
ممنون برای پیشنهادتون. حتماً. در حال برنامهریزی برای انتشار آموزشهای مشابه هستیم.