تابع wp_doing_ajax در وردپرس
تابع wp_doing_ajax() در هستهٔ وردپرس یکی از ابزارهای ساده و کاربردی برای تشخیص این است که درخواست جاری یک فراخوانی AJAX از طریق فایل admin-ajax.php است یا نه. این تابع به توسعهدهندگان کمک میکند تا در زمانهای مناسب، بار پردازشی، ارسال خروجی یا احراز هویت را متفاوت انجام دهند و از اجرای غیرضروری کد در پسزمینه جلوگیری کنند.
چرا باید از wp_doing_ajax() استفاده کنیم؟
- پیشگیری از اجرای عملیات سنگین در پاسخ به درخواستهای AJAX که نباید اجرا شود.
- امنیت بهتر: محدود کردن دسترسی و چک کردن nonce فقط برای درخواستهای AJAX.
- بهینهسازی بارگذاری: جلوگیری از enqueue کردن اسکریپتها یا کوئریهای سنگین هنگام پردازش AJAX.
- تفکیک رفتار بین درخواستهای عادی صفحه و درخواستهای AJAX.
نحوهٔ استفاده پایه
if ( wp_doing_ajax() ) {
// منطق مخصوص درخواست AJAX
// مثلاً خروجی JSON یا پایان پردازش
}این قطعه کد ساده بررسی میکند که آیا در جریان اجرای اسکریپت، وردپرس در حالت AJAX است یا خیر. اگر true برگشت داده شود، میتوان منطق مخصوص AJAX را اجرا کرد.
مثال: جلوگیری از بارگذاری اسکریپت در درخواستهای AJAX
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_scripts' );
function mytheme_enqueue_scripts() {
// اگر درخواستی از نوع AJAX باشد، از enqueue کردن فایلهای جلویی صرفنظر میکنیم
if ( wp_doing_ajax() ) {
return;
}
wp_enqueue_script( 'mytheme-main', get_template_directory_uri() . '/js/main.js', array('jquery'), '1.0', true );
}توضیح: این مثال نشان میدهد که چگونه میتوان از enqueue شدن فایل جاوااسکریپت در فرایندهای AJAX جلوگیری کرد تا منابع غیرضروری بارگذاری نشوند و پاسخ AJAX سریعتر باشد.
مثال: نوشتن یک callback برای AJAX با بررسی wp_doing_ajax()
add_action( 'wp_ajax_my_action', 'my_action_callback' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
function my_action_callback() {
// تضمین اینکه فقط در حالت AJAX اجرا میشود
if ( ! wp_doing_ajax() ) {
wp_die( 'Invalid request' );
}
// بررسی nonce برای امنیت
check_ajax_referer( 'my_nonce_action', 'security' );
// پردازش دادهها
$result = array( 'message' => 'Success', 'time' => current_time( 'mysql' ) );
wp_send_json_success( $result );
}توضیح: در این مثال ابتدا با wp_doing_ajax() مطمئن میشویم که callback فقط برای درخواستهای AJAX اجرا میشود. سپس با check_ajax_referer امنیت را افزایش داده و در پایان با wp_send_json_success خروجی JSON مناسب میفرستیم که هدرهای لازم را هم اضافه میکند و سپس اسکریپت را خاتمه میدهد.
تفاوت با REST API و محدودیتها
نکتهٔ مهم این است که wp_doing_ajax() صرفاً برای تشخیص درخواستهای ارسالشده به admin-ajax.php طراحی شده است. به عبارت دیگر اگر از REST API (مسیرهای /wp-json) یا endpointهای سفارشی استفاده میکنید، این تابع مقدار true برنمیگرداند. برای تشخیص درخواست REST باید از ابزارها یا هوکهای مخصوص REST استفاده کنید.
| نوع درخواست | wp_doing_ajax() |
|---|---|
| admin-ajax.php (کلاسیک) | true |
| REST API (/wp-json) | false (استفاده نکنید) |
بهترین شیوهها و نکات پیشرفته
- چک کردن nonce: همیشه برای عملیات حساس ورودی کاربر، از check_ajax_referer استفاده کنید.
- تفکیک front-end و back-end: در hookهای عمومی مثل init یا template_redirect، اگر کد وابسته به نمایش صفحه است، ابتدا بررسی کنید wp_doing_ajax() بازگشت ندهد.
- خوانایی و نگهداری: بهتر است منطق مربوط به AJAX را در فایل یا کلاس جداگانه نگه دارید تا مدیریت آن ساده شود.
- پرفورمنس: اگر پلاگین شما کوئریهای پرهزینه اجرا میکند، در ابتدا با wp_doing_ajax() از اجرای آنها در AJAX جلوگیری کنید و در صورت نیاز فقط دادههای سبکتر بازگردانید.
نمونهٔ بهینهسازی: جلوگیری از کوئری سنگین در AJAX
add_action( 'init', 'my_plugin_init' );
function my_plugin_init() {
// اگر درخواست AJAX است، از اجرای کوئریهای سنگین جلوگیری میکنیم
if ( wp_doing_ajax() ) {
return;
}
// کوئری سنگین یا عملیات زمانبر
my_plugin_prepare_heavy_data();
}توضیح: در این مثال، در hook عمومی init ابتدا بررسی میکنیم که آیا در حالت AJAX هستیم یا خیر. اگر AJAX باشد، تابع باز میگردد و عملیات سنگین اجرا نمیشود؛ بدین ترتیب پاسخهای AJAX سریعتر و مصرف منابع کمتر خواهد شد.
مثال امنیتی: ترکیب wp_doing_ajax() با قابلیتها (capabilities)
add_action( 'wp_ajax_admin_only_action', 'admin_only_action_callback' );
function admin_only_action_callback() {
if ( ! wp_doing_ajax() ) {
wp_die( 'Bad request' );
}
// فقط کاربران با capability مناسب اجازه اجرا دارند
if ( ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( array( 'message' => 'Unauthorized' ), 403 );
}
// ادامه پردازش برای کاربران مدیر
wp_send_json_success( array( 'message' => 'Done' ) );
}توضیح: این نمونه نشان میدهد که چگونه میتوان با ترکیب wp_doing_ajax() و current_user_can از اجرای عملیات حساس توسط کاربران غیرمجاز جلوگیری کرد و پاسخهای مناسب JSON بازگرداند.
خلاصه و جمعبندی
wp_doing_ajax() یک ابزار ساده اما مهم برای تشخیص حالت AJAX در وردپرس است که به شما کمک میکند تا رفتار کد، امنیت و کارایی را در پاسخ به درخواستهای admin-ajax.php مدیریت کنید. توجه داشته باشید که این تابع برای REST API کاربرد ندارد و در صورت استفاده از REST، باید رویکردهای دیگری به کار بگیرید. با رعایت نکات امنیتی مانند check_ajax_referer و بررسی capability، میتوانید رابطهای AJAX مطمئن و بهینه ایجاد کنید.
آیا این مطلب برای شما مفید بود ؟




