Фиксирайте 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 Pentru 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.

Оставете коментари, ако има някакви пояснения или допълнения към този урок.

Като пасиониран по технологии, пиша с удоволствие в StealthSettings.com от 2006 г. Имам обширен опит с операционни системи: macOS, Windows и Linux, както и с програмни езици и платформи за блогове (WordPress) и онлайн магазини (WooCommerce, Magento, PrestaShop).

How to » WordPress » Фиксирайте PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable 
Оставете коментар