疑難排解 PHP 錯誤
如何找到 PHP 錯誤
若要在 WordPress 網站上找到 PHP 錯誤(包括影響 WooCommerce 的錯誤),可以檢查錯誤記錄、啟用 WordPress 除錯功能,或查看 WooCommerce 內建的狀態記錄。以下是存取各方法的方式:
- 檢查錯誤記錄:網站託管帳號通常包含錯誤記錄,會記錄所有 PHP 問題。透過託管控制面板的「logs」或「error logs」區段存取這些記錄。
- 啟用除錯功能:啟用 WordPress 內建的除錯功能,直接在網站上顯示錯誤。這不僅會開啟除錯功能,還會在網站上顯示錯誤,並將錯誤記錄到
/wp-content/目錄中的debug.log檔案。請記得在正式網站上停用此功能以保護敏感資訊。 - WooCommerce 狀態記錄:WooCommerce 也維護自己的記錄,對疑難排解商店特定問題非常有用。可在 WP 管理後台前往WooCommerce > 狀態 > 記錄查看這些記錄。
使用這些工具可以有效追蹤和解決 PHP 錯誤,確保網站和商店高效運作。
PHP 錯誤類型
在 PHP 中有多種錯誤類型。了解這些錯誤類型有助於更有效地疑難排解問題。
以下是可能遇到的主要 PHP 錯誤類型:
- 解析錯誤(Parse errors):當程式碼中有語法錯誤時發生。此錯誤會停止腳本執行。常見原因包括缺少分號、括號或其他語法規則。
- 致命錯誤(Fatal errors):這些錯誤是嚴重的,會停止腳本執行。當 PHP 理解要求但無法執行任務時發生,例如呼叫不存在的函數或類別。
- 警告錯誤(Warning errors):不會停止腳本執行,只是提醒有問題發生。例如引入不存在的檔案。儘管有警告,PHP 仍會繼續執行腳本。
- 通知錯誤(Notice errors):輕微的錯誤或提醒,建議改進程式碼,但不一定影響腳本執行。例如存取未定義的變數或陣列索引。
- 已棄用錯誤(Deprecated errors):當使用已過時且未來版本的 PHP 可能不再支援的程式碼時發出。這是提醒更新程式碼至新標準。
- 可恢復錯誤(Recoverable errors):當致命錯誤被可捕捉的例外攔截時發生。PHP 允許使用自訂錯誤處理器優雅地處理這些錯誤並繼續執行腳本。
解析錯誤
例如,在編輯 WooCommerce 商店的佈景主題檔案或自訂外掛時,可能會發生 PHP 解析錯誤。
假設想要新增自訂 PHP 程式碼來修改 WooCommerce 網站顯示商品價格的方式。可能會在佈景主題的 functions.php 檔案中新增以下函數:
function modify_product_price_display() {
echo 'New price: ' . wc_get_price_to_display( $product;
}
在上述程式碼片段中,函數 wc_get_price_to_display 結尾缺少右括號。
正確的程式碼應為:
function modify_product_price_display() {
echo 'New price: ' . wc_get_price_to_display( $product );
}
第一個片段中缺少的括號會導致解析錯誤;PHP 在執行腳本前需要正確的語法。
此錯誤通常會停止腳本執行,並可能導致網站無法完全載入。可能會顯示錯誤訊息,指向 functions.php 檔案中有問題的行。這有助於識別和修正語法錯誤。
致命錯誤
許多因素都可能導致致命錯誤,包括佈景主題、外掛和擴充功能、伺服器設定等。
例如,在 WooCommerce 中當嘗試使用未定義的函數時可能會發生致命錯誤。假設嘗試新增一個在特定條件下套用特殊折扣的函數,在佈景主題的 functions.php 檔案中新增以下程式碼:
function apply_special_discount() {
if ( is_user_logged_in() ) {
add_discount_to_cart(10); // Assume this is meant to add a 10% discount
}
}
add_action('woocommerce_before_cart', 'apply_special_discount');
在此程式碼中,如果函數 add_discount_to_cart() 未在佈景主題、擴充功能或外掛,或 WooCommerce 核心檔案中定義,PHP 在嘗試執行時會拋出致命錯誤。錯誤訊息通常會指出該函數未定義,導致腳本停止執行。
這會導致整個頁面無法載入,因為錯誤中斷了 WooCommerce 所依賴的 WordPress 正常執行週期。
以下是此情境中致命錯誤的範例:
Fatal error: Uncaught Error: Call to undefined function add_discount_to_cart() in /path/to/your/site/wp-content/themes/your-theme/functions.php:5
Stack trace:
#0 /path/to/your/site/wp-includes/class-wp-hook.php(307): apply_special_discount('')
#1 /path/to/your/site/wp-includes/class-wp-hook.php(331): WP_Hook->apply_filters(NULL, Array)
#2 /path/to/your/site/wp-includes/plugin.php(474): WP_Hook->do_action(Array)
#3 /path/to/your/site/wp-content/plugins/woocommerce/includes/class-wc-cart.php(138): do_action('woocommerce_bef...')
#4 /path/to/your/site/wp-content/plugins/woocommerce/includes/class-wc-cart.php(112): WC_Cart->calculate_totals()
#5 /path/to/your/site/wp-content/plugins/woocommerce/includes/class-wc-cart-session.php(53): WC_Cart->init()
#6 /path/to/your/site/wp-content/plugins/woocommerce/includes/class-woocommerce.php(597): WC_Cart_Session->get_cart_from_session()
#7 /path/to/your/site/wp-includes/class-wp-hook.php(307): WooCommerce->init('')
#8 {main} thrown in /path/to/your/site/wp-content/themes/your-theme/functions.php on line 5
若要解決此類錯誤,需要確保程式碼使用正確定義的函數。
警告錯誤
在使用 WooCommerce 時,PHP 警告錯誤的範例可能涉及檔案引入。假設透過 PHP 腳本新增額外功能來自訂 WooCommerce 網站。決定在佈景主題的 functions.php 檔案中引入一個包含這些功能特定設定的設定檔:
include 'config/settings.php';
如果檔案 config/settings.php 不存在於指定目錄中,或路徑不正確,PHP 將產生警告錯誤。此錯誤會通知找不到該檔案。儘管如此,腳本仍會繼續執行 functions.php 檔案中的其餘程式碼。
警告訊息會類似這樣:
Warning: include(config/settings.php): failed to open stream: No such file or directory in /path/to/your/theme/functions.php on line 10
Warning: include(): Failed opening 'config/settings.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /path/to/your/theme/functions.php on line 10
此錯誤不會完全停止頁面載入,但如果設定檔包含的設定對這些功能至關重要,缺少的設定檔可能會導致其他功能無法正常運作。透過修正檔案路徑或確保檔案存在於指定位置來解決此警告,即可解決問題。
通知錯誤
在使用 WooCommerce 時,當嘗試使用未定義的變數時,可能會發生 PHP 通知錯誤。
假設正在編寫一個函數,根據 WooCommerce 中的商品是否特價來調整價格顯示。在佈景主題的 functions.php 檔案中新增以下程式碼:
function show_discount_notice() {
global $product;
if ($product->is_on_sale()) {
echo 'Sale Price: ' . $sale_price;
}
}
add_action('woocommerce_after_shop_loop_item_title', 'show_discount_notice');
在此片段中,如果變數 $sale_price 在輸出前尚未定義或初始化,PHP 將觸發通知錯誤。此通知通常會顯示類似這樣的訊息:
Notice: Undefined variable: sale_price in /path/to/your/theme/functions.php on line 4
雖然通知不會停止腳本執行,但它指出程式碼嘗試使用未設定的變數。這可能導致網站上出現不正確或意外的輸出。在這種情況下,初始化 $sale_price 或確保它從商品資料中正確衍生,就能修正問題並消除通知。
已棄用錯誤
當網站使用過時的函數或功能時,PHP 會發生已棄用錯誤。
例如,在佈景主題的 functions.php 檔案中使用過時的 WooCommerce hook 或 filter 函數(例如用於列出商品分類的 woocommerce_get_product_terms),該函數已被較新的函數取代:
function list_product_categories() {
$terms = woocommerce_get_product_terms($product->id, 'product_cat');
foreach ($terms as $term) {
echo $term->name . ', ';
}
}
add_action('woocommerce_after_shop_loop_item', 'list_product_categories');
使用這個已棄用的函數時,PHP 不會停止執行腳本。而是會記錄一個已棄用警告,可能會類似這樣:
Deprecated: woocommerce_get_product_terms is deprecated since version 3.0! Use wc_get_product_terms instead.
此錯誤是提醒更新程式碼以符合當前最佳做法或 WooCommerce 中可用的較新函數。使用建議的 wc_get_product_terms 函數將能解決此已棄用錯誤,並確保與未來版本的 WooCommerce 和 WordPress 更好的相容性。
可恢復錯誤
當自訂錯誤處理機制可以捕捉和處理錯誤時,就會發生可恢復錯誤。
假設正在自訂 WooCommerce 函數來處理金流。在金流處理函數中不小心將參數的型別提示設定錯誤:
function process_payment(int $amount, array $order_details) {
// Process payment logic here
echo "Processing payment of $" . $amount . " for order #" . $order_details['order_id'];
}
try {
// Simulating a call to process_payment with incorrect type for $order_details
process_payment(100, "This should be an array");
} catch (TypeError $e) {
echo "Error: " . $e->getMessage();
}
在此程式碼片段中,process_payment 函數需要 $amount 為整數,$order_details 為陣列。如果為 $order_details 傳遞字串而非陣列,將觸發 TypeError。因為此錯誤發生在 try 區塊內,並由對應的 catch 區塊捕捉處理 TypeError,所以它成為可恢復錯誤:
此錯誤處理的輸出可能類似這樣:
Error: Argument 2 passed to process_payment() must be of the type array, string given
此類型的錯誤是可恢復的,因為即使錯誤發生後腳本仍會繼續執行。這允許優雅地處理錯誤,而不會破壞整個應用程式的功能。
PHP 錯誤層級
PHP 有不同層級的錯誤,幫助程式設計師了解程式碼中發生了什麼問題。以下是這些錯誤層級的簡化說明:
- 致命錯誤(E_ERROR):嚴重問題,會立即停止程式執行。
- 警告(E_WARNING):不會停止程式執行的問題,但指出可能需要修正的錯誤。
- 解析錯誤(E_PARSE):當 PHP 因程式碼撰寫錯誤而完全無法理解時發生。
- 通知(E_NOTICE):輕微問題,暗示程式碼可能無法如預期運作,但程式仍可執行。
- 核心錯誤(E_CORE_ERROR):類似致命錯誤,但發生在 PHP 啟動時,而非程式執行期間。
- 核心警告(E_CORE_WARNING):類似警告,發生在 PHP 啟動時。
- 編譯錯誤(E_COMPILE_ERROR):當 PHP 在執行前準備程式碼時發現的嚴重問題。
- 編譯警告(E_COMPILE_WARNING):在準備執行程式碼期間發現的警告。
- 使用者錯誤(E_USER_ERROR):程式設計師在程式碼中刻意建立的錯誤,用於處理特殊情況。
- 使用者警告(E_USER_WARNING):程式設計師在程式碼中刻意建立的警告。
- 使用者通知(E_USER_NOTICE):程式設計師新增的通知,用於幫助識別較不嚴重的問題。
- 嚴格通知(E_STRICT):關於如何改進程式碼並提高與未來版本 PHP 相容性的建議。
- 可恢復錯誤(E_RECOVERABLE_ERROR):可在程式內捕捉和管理的嚴重問題。
- 已棄用警告(E_DEPRECATED):關於將被移除且不應再使用的過時 PHP 部分的警告。
- 使用者已棄用警告(E_USER_DEPRECATED):程式設計師在程式碼中新增的關於過時做法的警告。
- 所有錯誤(E_ALL):代表所有類型的錯誤和警告。
這些層級幫助開發人員決定如何回應——是需要立即修正程式碼、檢查潛在問題,還是更新以使用較新的程式設計實踐。