
به اشتراک بگذارید

به اشتراک بگذارید
آموزش وردپرس | بلاگ وبداده
حل مشکل کار نکردن jQuery در قالب وردپرس
$ در حالی که وردپرس jQuery را در حالت no-conflict لود میکند.$(document).ready به فرم no-conflict یعنی jQuery(document).ready(function($){ ... }) تغییر دهید و مطمئن شوید jQuery بهدرستی enqueue شده است؛ بقیهٔ موارد به تداخل افزونه یا افزونهٔ سرعت برمیگردد.jQuery صدا زده شود، نه با لقب کوتاه $ (این همان حالت no-conflict است تا با کتابخانههای دیگر قاطی نشود). حالا اگر یک قالب یا افزونه بدون توجه به این قانون، مترجم را با لقب کوتاه صدا بزند یا مترجم دومی استخدام کند، سوءتفاهم پیش میآید و کدها اجرا نمیشوند.$(document).ready استفاده کنید؛ چون میانبر $ در سطح سراسری تعریف نشده و همین موضوع منشأ بخش بزرگی از خطاهای «$ is not a function» است.
F12 یا Ctrl+Shift+I ابزار توسعهدهندهٔ مرورگر را باز کنید و به سربرگ Console بروید. پیام خطا معمولاً دقیقاً میگوید مشکل کجاست: «jQuery is not defined» یعنی خودِ کتابخانه لود نشده، «$ is not a function» یعنی مشکل از no-conflict و میانبر $ است، و خطای 404 روی فایل jquery یعنی مسیر بارگذاری اشکال دارد. بررسی همزمان فایل ارور لاگ سایت هم کمک میکند ریشهٔ خطاهای سمت سرور را پیدا کنید.$(document).ready از فرم زیر استفاده کنید:wp_enqueue_script بارگذاری کنید و jQuery را بهعنوان وابستگی اعلام کنید تا وردپرس تضمین کند jQuery همیشه اول لود میشود. این کد را در فایل functions.php قالب فرزند قرار دهید:jquery.js (یا jquery.min.js و jquery-core) را به فهرست استثناهای defer/async اضافه کنید. سپس کش را کامل پاک کنید و دوباره تست بگیرید.
| پیام خطا در کنسول | علت اصلی | راهحل پیشنهادی |
|---|---|---|
| jQuery is not defined | اسکریپت قبل از jQuery لود شده | با wp_enqueue_script و وابستگی jquery بارگذاری کنید |
| $ is not a function | استفاده از $ بدون رعایت no-conflict | کد را به فرم jQuery(function($){…}) ببرید |
| Uncaught TypeError روی توابع قدیمی | قالب/افزونه سازگار با jQuery 1.x | قالب و افزونه را آپدیت یا Migrate Helper را فعال کنید |
| فایل jquery با خطای 404 | مسیر یا CDN اشتباه/تداخل نسخه | نسخهٔ دستی را حذف و از jQuery هسته استفاده کنید |
| کدها فقط با افزونهٔ کش خراب میشوند | defer/async روی jquery | jquery.js را از defer/async مستثنا و کش را پاک کنید |
چون وردپرس jQuery را در حالت no-conflict لود میکند تا با کتابخانههای جاوااسکریپت دیگر تداخل نکند. در این حالت میانبر $ در سطح سراسری تعریف نمیشود. راهحل این است که از فرم jQuery(document).ready(function($){ … }) استفاده کنید یا کل کد را داخل یک IIFE بپیچید و jQuery را بهعنوان $ به آن پاس دهید.
یعنی اسکریپتی که به jQuery وابسته است، قبل از لودشدن خودِ کتابخانهٔ jQuery اجرا شده است. رایجترین راهحل، بارگذاری اسکریپت با تابع wp_enqueue_script و اعلام jquery بهعنوان وابستگی است تا وردپرس ترتیب درست را تضمین کند.
از وردپرس 5.6 نسخهٔ jQuery به 3.5.1 ارتقا یافت و برخی توابع قدیمی حذف شدند. اگر قالب یا افزونهٔ قدیمی دارید، اول آن را بهروزرسانی کنید. اگر فعلاً امکانپذیر نیست، افزونهٔ رسمی و موقتی Enable jQuery Migrate Helper را نصب کنید تا سازگاری برگردد.
افزونهها را یکییکی غیرفعال کنید و هر بار سایت را تست کنید؛ وقتی مشکل برطرف شد، افزونهٔ آخر مقصر است. برای قالب هم موقتاً یک قالب پیشفرض وردپرس را فعال کنید. اگر با قالب پیشفرض مشکل نبود، ریشه در قالب شماست.
بله، یک خطای نگارشی کوچک میتواند کل سایت را با خطای 500 از کار بیندازد. برای همین همیشه قبل از ویرایش بکاپ کامل بگیرید، کد را در قالب فرزند قرار دهید و اگر با کدنویسی راحت نیستید از افزونهٔ Code Snippets استفاده کنید تا در صورت خطا بتوانید سریع غیرفعالش کنید.
چون بعضی افزونههای سرعت به همهٔ اسکریپتها defer یا async میدهند و باعث میشوند jQuery دیرتر از اسکریپتهای وابسته لود شود. راهحل این است که فایل jquery.js را در تنظیمات افزونه از defer/async مستثنا کنید و بعد کش را کامل پاک کنید.
به احتمال زیاد کش قدیمی نمایش داده میشود. همهٔ لایههای کش شامل افزونهٔ کش، کش مرورگر و CDN را پاک کنید و صفحه را در حالت ناشناس باز کنید. اگر باز هم خطا بود، کنسول را دوباره بخوانید؛ ممکن است خطای دومی وجود داشته باشد.
بله، بارگذاری همزمان دو نسخهٔ jQuery تقریباً همیشه به تداخل و کار نکردن اسکریپتها منجر میشود. بهترین کار این است که از همان نسخهٔ همراه هستهٔ وردپرس استفاده کنید و نسخهٔ دستی یا CDN اضافی را که قالب/افزونه لود میکند حذف کنید.