Um erro de PHP que aparece em muitos WordPress Plugins que não são atualizados há muito tempo ou são incompatíveis com as versões mais recentes do PHP. PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable.
Em nosso cenário, o erro de PHP ocorreu em um módulo Cross Sell Product Display para 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
Índice analítico
Por que o erro ocorre PHP Warning: sizeof(): Parameter must be an array or an object that implements Countable ?
O problema que gera esse erro do PHP é a função sizeof()
que na versão do PHP 7.2 ou versões posteriores, pode gerar esse erro, caso o parâmetro informado não seja um array ou um objeto que implementa a interface Countable.
Portanto, o erro geralmente aparece após uma atualização da versão do PHP.
Como resolver erros de PHP gerados por sizeof()
?
O método mais simples é substituir a chamada de função sizeof()
com uma chamada de função count()
.
No caso de quem usa versões antigas do módulo Cross Sell Product Display, a solução é simples. As funções da linha de 18 polegadas serão substituídas 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;
}
O código acima em que é sizeof() será substituído por:
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;
}
Esta modificação primeiro verifica se $crosssells
é um array usando a função is_array()
e, caso contrário, retorna false.
No caso de $crosssells
é um array, a função é usada count()
para determinar o número de elementos em array. Se o número de elementos for zero ou $crosssells
é uma string vazia, false é retornado.
Deixe comentários se houver algum esclarecimento ou acréscimo a este tutorial.