امروز در این مقاله قصد داریم به ساخت جستجو پیشرفته وردپرس با WP_Query بپردازیم. پس مارا تا پایان این مقاله همراهی کنید.
این مقاله دارای دو بخش است ، در ابتدا مقدمه ای نظری برای گرفتن درخواست های کاربر از طریق URL و سپس توسعه کوئری را خواهم گفت و درقسمت دوم فیلتر جستجو را پیشرفته تر خواهیم کرد.
زمانیکه یک کاربر روی یک لینک کلیک میکند یا یک آدرسی را در آدرس بار مرورگر تایپ میکند وردپرس یک سری عملیات را به خوبی در نمای کوئری که در زیر شرح خواهم داد انجام میدهد :
- وردپرس URL درخواست شده را در مجموعه ای از پارامترها دریافت میکند. (مشخصات جستجو)
- تمام متغیرهای وابسته به کوئری بررسی میشوند.
- مشخصات ارسالی داخل دیتابیس به یک کوئری جستجو داخل خود دیتابیس تبدیل میشود.
- مجموع داده های بازیابی شده داخل متغیری به اسم wp_query$ ذخیره میشوند.
- وردپرس سپس به خطای 404 میپردازد.
- وردپرس هدر های HTTP را برای وبلاگ ارسال میکند.
- متغیر های حلقه اولیه تنظیم میشوند.
- تمپلیت فایل بر اساس سلسله مراتب وردپرس انتخاب میشود. (مثلا فایل search.php)
- وردپرس حلقه را اجرا میکند و نتایج را نشان میدهد.
خب تا اینجا که مراحل و الگوریتم اجرایی وردپرس بیان شد ، در مرحله اول خواهیم گفت که در URL پارامترها چگونه دریافت میشوند.
متغیرهای کوئری : متغیرهای پیش فرض و اختصاصی برای ساخت جستجو پیشرفته
درواقع وردپرس دونوع متغیر را داراست : متغیرهای public و متغیر های private . متغیرهای public را میتوان از طریق آدرس بار url ارسال و دریافت کرد اما متغیرهای pricvate این امکان را ندارد . به بیان دیگر : متغیرهای public همان متغیرهای ارسالی در آدرس بار : مثلا
[php]example.net/?var1=value1&var2=value2[/php]
هستند و متغیرهای private مثل :
[php]query_posts(‘privatevar=myvalue’);[/php]
می باشند.
درواقع به این منظور که وردپرس این اجازه را به ما نمیدهد که از متغیرهای خصوصی خودش مثل categoryin , category not_in , category_end ,…. استفاده کنیم . اما این قابلیت هارا داخل خودش دارد ، اما چگونه میتوانیم از آنها استفاده کنیم ؟
ما به عنوان کاربران و توسعه دهندگان وردپرس میتوانیم از متغیرهای در دسترس (public) استفاده کنیم و بدون استفاده از افزونه یا دست بردن در کدهای اختصاصی خود وردپرس یک یا چند پارامتر را به کوئری اضافه کنیم و نتایج دلخواه را بدست آوریم .
به عنوان مثال در آدرس زیر : از post-type فیلم ها و از تکسونومی genre استفاده کنیم .
[php]mywebsite.com/?post_type=movie&genre=thriller[/php]
ثبت متغیرهای کوئری اختصاصی برای ساخت جستجو پیشرفته
در ابتدا باید متغیرهای کوئری را ثبت کنیم . برای این کار اگر افزونه مینویسید در فایل افزونه یا در فایل function.php قالب باید از کد مشابه زیر استفاده کنید .
[php]
/** * Register custom query vars
*
*
*@link https://codex.wordpress.org/Plugin_API/Filter_Reference/query_vars
*/
function myplugin_register_query_vars( $vars ) {
$vars[] = ‘author’;
$vars[] = ‘editor’;
return $vars;
}
add_filter( ‘query_vars’, ‘myplugin_register_query_vars’ );
[/php]
درواقع در کد بالا ، عملکرد برگشتی آرایه ای از متغیرهایی به عنوان آرگومان ست که وقتی متغیر جدیدی اضافه شد باید همان آرایه را برگرداند.
اکنون میتوانیم متغیرهای جددی را در پارامترهایی قراردهیم که روی جستجو تاثیر میگذارند . این متغیرها در اسکریپت ما به لطف تابع get_query_var() در دسترس خواهند بود.
اکنون وقت آن رسیده که کلاسی را که کوئری های وردپرس مدیریت میشوند را توضیح دهیم .
در مجموع ساخت کوئری که بتواند امنیت را تامین کند و بخوبی و بدون مشکل کار کند مسئله ساده ای نیست که به لطف wp_Query class این دسترسی در وردپرس به ما داده شده.
بازیابی داده ها داخل این حلقه های کوئری به دلیل تعداد زیادی از متدهای نوشته شده در دسترس است است.
[php]
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?><!– code here –>
<?php endwhile; else : ?><!– code here –>
<?php endif; ?></p>
[/php]
کد بالا یک کوئری ساده وردپرس هست که آخرین پست ها را بدون هرگونه فیلتری نمایش میدهد :
حالا اگر بخواهیم این کوئری فیلتر داشته باشه باید مثل کد زیر از آرگومان استفاده کنیم :
[php]
// An array of arguments
$args = array( ‘arg_1’ => ‘val_1’, ‘arg_2’ => ‘val_2’ );
// The Query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) : $the_query->the_post();
// Your code here
endwhile;
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
[/php]
الان در کد بالا داخل $args آرگومان های ارسالی تعریف شده است. طبق داکیومنت های وردپرس زمانیکه از تابع the_post استفاده میکنیم حتما در آخر کوئری باید از wp_reset_postdata هم استفاده کنیم.
همانطور که میدانیدکلاس wp_Query آرایه ای از پارامتر هایی که توسعه دهندگان اجازه دارند برای دریافت نتایج از دیتابیس ارسال کنند، میتواند نگه داری کند.
اولین گروه ، پارامتر ها نویسندگان نوشته ها و برگه ها هستند:
- author
- author_name
- author__in
- author__not_in
به عنوان مثال اگر میخواهید نام شخصی به اسم sara را پیدا کنید . از کد مشابه زیر باید استفاده کنید :
$query = new WP_Query( array( ‘author_name’ => ‘sara’ ) );
دومین گروه شامل دسته بندی ها هستند :
- cat
- category_name
- category__and
- category__in
- category__not_in
به عنوان مثال اگر بخواهیم بر اساس دسته webdesign مقالات را نمایش دهیم :
[php]$query = new WP_Query( array( ‘category_name’ => ‘webdesign’ ) );[/php]
اگر بیشتر از یک دسته بندی بخواهید نمایش دهید کافیست نام درسته را با کاما جدا کنید :
[php]$query = new WP_Query( array( ‘category_name’ => ‘webdesign,webdev’ ) );[/php]
حالا اگر بخواهید فیلتر مطالب به گونه ای باشد که مقاله حتما در هر دو دسته (AND) نمایش داده شود کد مشابه زیر استفاده میشود :
[php]$query = new WP_Query( array( ‘category_name’ => ‘webdesign+webdev’ ) );[/php]
کدهای بالا همچنین میتواند با کدهای زیر جایگزین شوند با استفاده از آیدی های دسته بندی ها:
[php]$query = new WP_Query( array( ‘category__in’ => array( 4, 9 ) ) );
$query = new WP_Query( array( ‘category__and’ => array( 4, 9 ) ) );[/php]
این روش های بالا برای فیلتر کردن نوشته ها و برگه ها ، برچسب ها وجست و جوی کلمات و تکسونومی ها (دسته ها) و پست تایپ ها نیز صدق دارد.
همچنین همانطور که گفته شد چندین پارامتر را میتوان برای فیلتر کردن ارسال کرد : به عنوان مثال
[php]$query = new WP_Query( array( ‘author_name’ => ‘carlo’, ‘category_name’ => ‘webdesign’ ) );[/php]
برای دسترسی و اطلاع از همه آرگیومنت ها از داکیومنت سایت وردپرس استفاده کنید .
متا کوئری های وردپرس برای ساخت جستجو پیشرفته
بر اساس گفته سایت codex وردپرس زمانیکه ما از متا کوئری ها استفاده میکنیم ، درواقع باز هم wp_Query از کلاس WP_Meta_Query استفاده میکند.این کلاس از وردپرس 3.2 ارائه شده ست ، ساخت کد دیتابیس از از کوئری بر اساس کاستوم فیلد ها.
برای ساخت کوئری منطبق بر کاستوم فیلد ، ما فقط به یک یا چند تا از آرگومان های زیر نیاز داریم:
- meta_key
- meta_value
- meta_value_num
- meta_compare
فرض کنید یک کاستوم پست تایپی به نام accommodation وجود دارد. هر accommodation یک کاستوم فیلدی به اسم شهر داره، که هر مکانی داخل این نام ذخیره میشود.با یک متا کوئری ما میتوانیم accommodation هر شهری را از دیتابیس دریافت کنیم ، فقط با ارسال آرگومان های زیر :
[php]
$args = array(
‘post_type’ => ‘accommodation’,
‘meta_key’ => ‘city’,
‘meta_value’ => ‘Freiburg’,
‘meta_compare’ => ‘LIKE’ );
[/php]
آرگومان های متا کوئری :
در این نوع کوئری ، کلاس WP_Meta_Query (و کلاس WP_Query) meta_query هایی را فراهم میکند. این یک آرایه ای از آرایه هایی ست مانند مثال زیر :
[php]$args = array(
‘post_type’ => ‘accommodation’,
‘meta_query’ => array(
array(
‘key’ => ‘city’,
‘value’ => ‘Freiburg’,
‘compare’ => ‘LIKE’,
),
)
);[/php]
المان meta_query یک آرایه دوبعدی است که آیتم های کوئری آن آرگومان های زیر خواهد بود :
همچنین میتوان درون این متاکوئری حتی از دویا چند کوئری دیگر مانند مثال زیر استفاده کرد :
[php]
$args = array(
‘post_type’ => ‘accommodation’,
‘meta_query’ => array(
array( ‘key’ => ‘city’, ‘value’ => ‘Paris’, ‘compare’ => ‘LIKE’ ),
array( ‘key’ => ‘type’, ‘value’ => ‘room’, ‘compare’ => ‘LIKE’ ),
‘relation’ => ‘AND’
)
);
$the_query = new WP_Query( $args );
[/php]
در مثال بالا پارامتر سوم همان رابطه بین دو آرایه قبلی را نمایش میدهد.
فیلتر pre_get_post (هوک اکشن)
[php]
function myplugin_pre_get_posts( $query ) {
// check if the user is requesting an admin page
// or current query is not the main query
if ( is_admin() || ! $query->is_main_query() ){
return;
}
$query->set( ‘author_name’, ‘neda’ );
$query->set( ‘category_name’, ‘webdesign’ );
}
add_action( ‘pre_get_posts’, ‘myplugin_pre_get_posts’, 1 );
[/php]
هوک اکشن بعد از $query برای بازیابی کوئری آمده است. به این منظور که قبل از ارسال اطلاعات به دیتابیس $query مقادیرش تغییر کند.
به عنوان نمونه در مثال بالا مقدار نام نویسنده و نام دسته بندی تغییر داده شده. این اکشن اگر مقداری را برنگرداند مشکلی برای کد ایجاد نمیکند و مقدار پیش فرض خود را استفاده میکند.
این تغییرات روی متغیر query هم در فرانت هم در بک اند وردپرس قابل استفاده میباشد.
ادامه دارد …. تا مقالاتی دیگر با ما باشید (تیم طراحی سایت آواتم)