виправляти PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable

Помилка PHP, яка з’являється в багатьох WordPress Plugins які тривалий час не оновлювалися або несумісні з новими версіями PHP. PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable.

У нашому сценарії помилка PHP сталася в модулі Cross Sell Product Display для WooCommerce.

FastCGI sent in stderr: "PHP message: PHP Warning:  sizeof(): Parameter must be an array or an object that implements Countable in /web/path/public_html/wp-content/plugins/cross-sell-product-display-for-woocommerce/templates.php on line 18

Чому виникає помилка PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable ?

Проблема, яка породжує цю помилку PHP, полягає у функції sizeof() який у версії PHP 7.2 або пізніших версіях може генерувати цю помилку, якщо заданий параметр не є одним array або об'єкт, який реалізує інтерфейс Countable.

Тому помилка часто з'являється після оновлення версії PHP.

Як виправити помилки PHP, створені sizeof()?

Найпростіший спосіб - замінити виклик функції sizeof() з викликом функції count().

У випадку тих, хто використовує старі версії модуля Cross Sell Product Display, рішення просте. Функції з лінійки 18 дюймів буде замінено templates.php.

function cdxfreewoocross_get_cross_sell_products($product_id=false){
 
 if($product_id ===false ){
  
  if(!is_product()){return false;}
  
  $product_id = (int)get_the_ID();
  if($product_id=='0'){return false;}
  
 }
 
 $crosssells = get_post_meta( $product_id, '_crosssell_ids',true);
 if ( sizeof($crosssells ) == 0  || $crosssells =='') { return false; }
 
 return $crosssells;
 
}

Наведений вище код, у якому воно є sizeof() буде замінено на:

function cdxfreewoocross_get_cross_sell_products($product_id=false){
 
 if($product_id ===false ){
  
  if(!is_product()){return false;}
  
  $product_id = (int)get_the_ID();
  if($product_id=='0'){return false;}
  
 }
 
 $crosssells = get_post_meta( $product_id, '_crosssell_ids',true);
 if ( !is_array( $crosssells ) || count( $crosssells ) == 0  || $crosssells =='') { return false; }
 
 return $crosssells;
 
}

Ця модифікація спочатку перевіряє, чи $crosssells є array за допомогою функції is_array() і в іншому випадку повертається false.

В випадку $crosssells є array, використовується функція count() визначити кількість елементів в array. Якщо кількість елементів дорівнює нулю або $crosssells є порожнім рядком, повертається false.

Залишайте коментарі, якщо є якісь уточнення або доповнення до цього підручника.

Stealth: Захоплюючись технологіями, я люблю тестувати та писати підручники про операційні системи macOS, Linux, Windows, про WordPress, WooCommerce і налаштувати веб-сервери LEMP (Linux, NGINX, MySQL і PHP). Я пишу далі StealthSettings.com з 2006 року, а через кілька років я почав писати на iHowTo.Tips підручники та новини про пристрої в екосистемі Apple: iPhone, iPad, Apple Годинник, HomePod, iMac, MacBook, AirPods та аксесуари.