عیب‌یابی در وردپرس

عیب‌یابی کد PHP بخشی از هر پروژه‌ای‌ست، با این وجود وردپرس دارای سیستم‌های عیب‌یابی خاصی است که برای ساده‌سازی فرآیند و استانداردسازی کد در هسته، افزونه‌ها و پوسته‌ها طراحی شده‌اند. این برگه ابزارهای مختلف عیب‌یابی موجود در وردپرس و چگونگی افزایش بهره‌وری در کدنویسی شما، و همچنین افزایش کیفیت کلی و تعامل‌پذیری کدتان را تشریح می‌کند.

برای افراد غیربرنامه‌نویس یا همان کاربران عادی، این گزینه‌ها می‌توانند جهت نمایش اطلاعات دقیق دربارۀ خطاها استفاده شوند.

توجه: قبل از اعمال هرگونه تغییر در وب‌سایت خود، اطمینان حاصل نمایید که از یک محیط نمایشی استفاده، یا یک نسخۀ پشتیبان مناسب از سایت‌تان تهیه کرده‌اید.

نمونه wp-config.php برای عیب‌یابی

کد زیر، با قرار گرفتن در پروندۀ wp-config.php شما، تمامی خطاها، هشدارها و اخطارها را در پرونده‌ای به نام debug.log در پوشۀ wp-content ثبت (یا اصطلاحاً لاگ) خواهد کرد؛ همچنین خطاها را مخفی نموده تا در ساخت برگه اختلالی ایجاد نکنند.

// Enable WP_DEBUG mode
define( 'WP_DEBUG', true );
// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );
// Disable display of errors and warnings
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );
// Use dev versions of core JS and CSS files (only needed if you are modifying these core files)
define( 'SCRIPT_DEBUG', true );

توجه: شما بایستی این کد را قبل از /* That’s all, stop editing! Happy blogging. */ در پروندۀ wp-config.php درج نمایید.

WP_DEBUG

WP_DEBUG یک ثابت PHP (متغیر سراسری دائمی) می‌باشد که می‌تواند برای فعال‌سازی حالت “عیب‌یابی” در سراسر وردپرس استفاده شود. به‌طور پیش‌فرض، مقدار آن false (غیرفعال) در نظر گرفته می‌شود و معمولاً در نسخه‌های توسعه وردپرس، درون پروندۀ wp-config.php روی true (فعال) تنظیم می‌گردد.

// This enables debugging.
define( 'WP_DEBUG', true );
// This disables debugging.  
define( 'WP_DEBUG', false );

توجه: مقادیر true و false در مثال با آپاستروف (‘) احاطه نشده‌اند، زیرا آن‌ها مقادیر گزاره (درست/نادرست) هستند. اگر ثابت‌ها را روی ‘false’ تنظیم کنید، آن‌ها به‌عنوان true تفسیر خواهند شد، چراکه گیومه‌ها آن را به یک رشته تبدیل می‌کنند نه به یک مقدار گزاره (دادۀ منطقی).

استفاده از WP_DEBUG یا سایر ابزارهای عیب‌یابی در سایت‌های فعال توصیه نمی‌شود؛ آن‌ها برای آزمایش محلی و نصب‌های نمایشی در نظر گرفته شده‌اند.

خطاها، هشدارها و اخطارهای PHP

فعال‌سازی WP_DEBUG موجب نمایش تمامی خطاها، اخطارها و هشدارهای PHP خواهد شد. این کار به احتمال زیاد رفتار پیش‌فرض PHP را که تنها خطاهای فاجعه‌بار را نمایش می‌دهد یا در صورت بروز خطا، صفحۀ سفید مرگ را نشان داده، تغییر خواهد داد.

نمایش همۀ اخطارها و هشدارهای PHP اغلب منجر به پیام‌های خطا برای مواردی می‌شوند که به‌نظر خراب نمی‌آیند، اما از استانداردهای اعتبارسنجی دادۀ صحیح در PHP پیروی نمی‌کنند. این هشدارها به‌محض شناسایی کد مربوطه، به‌راحتی قابل رفع هستند و کد حاصل تقریباً همیشه مقاوم‌تر در برابر مشکلات و نگهداری آن آسان‌تر خواهد بود.

عیب‌یابی سفارشی PHP

چنانچه نیاز است که اطلاعات غیرخطا جهت اهداف عیب‌یابی ثبت شوند، PHP تابع error_log را برای این منظور ارائه می‌دهد. با این حال، این روش به‌طور پیش‌فرض خروجی با ساختار مناسبی ارائه نمی‌دهد.

برای رفع این مشکل، می‌توانید تابع دیگری را در سایت خود جهت رسیدگی به ساختاربندی اضافه نمایید، این کار را قادر هستید با ایجاد یک افزونۀ سفارشی یا استفاده از قطعه کدی با یک افزونۀ code snippets انجام دهید. این تابع به‌عنوان یک پوشش‌دهنده (wrapper) برای error_log عمل خواهد کرد و از print_r جهت ساختاربندی صحیح آرایه‌ها و شیء‌ها قبل از ثبت آن‌ها استفاده خواهد کرد.

در ادامه یک نمونه تابع آورده شده است که نیاز به فعال بودن WP_DEBUG دارد.

function write_log( $data ) {
    if ( true === WP_DEBUG ) {
        if ( is_array( $data ) || is_object( $data ) ) {
            error_log( print_r( $data, true ) );
        } else {
            error_log( $data );
        }
    }
}

نمونه‌های استفاده:

write_log( 'DEBUG TEXT' );
write_log( $variable );

توجه: توصیه نمی‌شود کدهای سفارشی مطابق نمونه بالا را در functions.php اضافه نمایید تا از مشکلات مربوط به نگهداری، امنیت، عملکرد، سازگاری و سازمان‌دهی کد جلوگیری شود.

توابع و آرگومان‌های منسوخ‌شده

فعال‌سازی WP_DEBUG همچنین موجب نمایش اخطارهایی دربارۀ توابع و آرگومان‌های منسوخ‌شده در وردپرس می‌شود که در سایت شما در حال استفاده هستند. این‌ها توابع یا آرگومان‌های تابعی هستند که هنوز از کد اصلی حذف نشده‌اند، اما در آیندۀ نزدیک برای حذف برنامه‌ریزی شده‌اند. اخطارهای منسوخ شدن، معمولاً تابع تازه‌ای که باید به‌جای آن‌ها استفاده شود را نشان می‌دهد.

WP_DEBUG_LOG

WP_DEBUG_LOG مکملی برای WP_DEBUG به حساب می‌آید که باعث می‌شود تا سایر خطاها در یک پروندۀ گزارش (لاگ) به نام debug.log نیز ذخیره شوند. این قابلیتی مفید است اگر که می‌خواهید تمامی اخطارها را بعداً بررسی نمایید یا نیاز دارید اخطارهایی که خارج از صفحۀ نمایش (مثلاً در طول درخواست ایجکس یا اجرای wp-cron) تولید شده‌اند را مشاهده نمایید.

توجه داشته باشید که این امکان به شما اجازه می‌دهد تا با استفاده از تابع داخلی error_log() در PHP، در یک پروندۀ لاگ بنویسید، که برای مثال هنگام عیب‌یابی رویدادهای ایجکس می‌تواند مفید باشد.

هنگامی که روی true تنظیم شود، لاگ در debug.log داخل پوشۀ محتوا (معمولاً wp-content/debug.log) در سیستم پروندۀ سایت شما ذخیره می‌شود. به‌عنوان جایگزین، می‌توانید آن را روی یک مسیر پروندۀ معتبر تنظیم کنید تا پرونده در جای دیگری ذخیره گردد.

define( 'WP_DEBUG_LOG', true );

-یا-

define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' );

توجه: برای اینکه WP_DEBUG_LOG کار خود را انجام دهد، WP_DEBUG بایستی فعال (true) باشد. به‌خاطر داشته باشید که می‌توانید WP_DEBUG_DISPLAY را به‌طور مستقل غیرفعال نمایید.

WP_DEBUG_DISPLAY

WP_DEBUG_DISPLAY یکی دیگر از مکمل‌های WP_DEBUG است که کنترل می‌کند آیا پیام‌های عیب‌یابی در داخل HTML برگه‌ها نمایش داده شوند یا خیر. مقدار پیش‌فرض آن true است که خطاها و هشدارها را به‌محض تولید شدن نمایش می‌دهد. تنظیم این گزینه روی false همۀ خطاها را مخفی خواهد کرد. این مورد باید همراه با WP_DEBUG_LOG استفاده شود تا خطاها بتوانند بعداً قابل بررسی باشند.

define( 'WP_DEBUG_DISPLAY', false );

توجه: طبق معمول برای اینکه WP_DEBUG_DISPLAY کار خود را انجام دهد، WP_DEBUG باید فعال (true) باشد. به‌خاطر داشته باشید که می‌توانید WP_DEBUG_LOG را به طور مستقل کنترل نمایید.

SCRIPT_DEBUG

SCRIPT_DEBUG یک ثابت مرتبط است که وردپرس را مجبور می‌کند از نسخه‌های “dev” (توسعه) پرونده‌های CSS و جاوااسکریپت هسته به‌جای نگارش‌های فشرده‌شده (minified) که به طور معمول بارگذاری می‌شوند، استفاده نماید. این برای زمانی مفید است که در حال آزمایش تغییرات در هر یک از پرونده‌های .js یا .css داخلی هستید. مقدار پیش‌فرض آن false است.

define( 'SCRIPT_DEBUG', true );

SAVEQUERIES

تعریف SAVEQUERIES، کوئری‌های پایگاه‌داده را در یک آرایه ذخیره می‌کند که سپس می‌توانند برای کمک به تحلیل آن کوئری‌ها، نمایش داده شوند. هنگامی که این ثابت روی true تنظیم باشد، باعث می‌شود هر کوئری به‌همراه زمان اجرای آن و تابعی که آن را فراخوانی کرده است، ذخیره شود.

define( 'SAVEQUERIES', true );

آرایه در متغیر سراسری $wpdb->queries ذخیره خواهد شد.

توجه: این قابلیت بر عملکرد سایت شما تأثیر خواهد گذاشت، بنابراین مطمئن شوید زمانی که در حال عیب‌یابی نیستید، آن را غیرفعال کنید.

عیب‌یابی افزونه‌ها

افزونه‌های عیب‌یابی زیادی برای وردپرس وجود دارند که اطلاعات بیشتری دربارۀ جزئیات داخلی، چه برای یک مؤلفه خاص و چه به‌طور کلی، نمایش می‌دهند.

برای مثال، نوار عیب‌یابی یک فهرست عیب‌یابی به نوار مدیریت اضافه می‌کند که اطلاعات مفید عیب‌یابی مربوط به کوئری، حافطۀ پنهان (کش) و موارد دیگر را نمایش می‌دهد. هنگامی که WP_DEBUG فعال باشد، این افزونه هشدارهای PHP و اخطارها را نیز ردیابی می‌کند تا یافتن آن‌ها آسان‌تر شود.