фиксированный 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.

Оставляйте комментарии, если есть какие-то уточнения или дополнения к этому туториалу.

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

КАК » WordPress » фиксированный PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable 
Оставьте комментарий