Open
Reported for: WPML Multilingual CMS 4.7.0
Overview of the issue
WPML 4.7 has a compatibility issue with plugins that use PSR/Log 3.0, such as Rollbar. When WPML and Rollbar are both active, running WP-CLI commands (e.g., wp --info
) triggers a fatal error due to method signature mismatches in the DebugFileLogger
class.
PHP Fatal error: Declaration of WPML\\PHP\\Logger\\DebugFileLogger::log($level, $message, array $context = []) must be compatible with Psr\\Log\\AbstractLogger::log($level, Stringable|string $message, array $context = []): void in ...\\wp-content\\plugins\\sitepress-multilingual-cms\\vendor\\wpml\\wpml\\lib\\Php\\Logger\\DebugFileLogger.php on line 8
Workaround
Please, make sure of having a full site backup of your site before proceeding.
- Open …/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/wpml/lib/Php/Logger/DebugFileLogger.php file.
- Replace:
namespace WPML\PHP\Logger; class DebugFileLogger extends \Psr\Log\AbstractLogger { public function log( $level, $message, array $context = array() ) { if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) { return; } $log = date( 'Y-m-d H:i:s' ) . ' [' . $level . '] ' . $message . PHP_EOL; \error_log( $log ); } }
- With:
namespace WPML\PHP\Logger; use Psr\Log\AbstractLogger; use Stringable; class DebugFileLogger extends AbstractLogger { public function log($level, $message, array $context = []): void { if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) { return; } $log = date( 'Y-m-d H:i:s' ) . ' [' . $level . '] ' . (string) $message . PHP_EOL; \error_log( $log ); } }
It seems to me this error is not only limited to WP-CLI. If there already is a fix i would appreciate a patch release since this currently breaks some of our pages.
Hello there,
If you can reproduce this error in a different way, we would appreciate if you can share the steps to reproduce it. In that way we will be able to check if there are other cases that need to be covered. Furthermore, if the workaround here provided doesn’t help, you can start a chat in our support forum.
This worked for me:
namespace WPML\PHP\Logger;
class DebugFileLogger extends \Psr\Log\AbstractLogger {
public function log( $level, $message, array $context = array() ) : void {
if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) {
return;
}
$log = date( 'Y-m-d H:i:s' ) . ' [' . $level . '] ' . $message . PHP_EOL;
\error_log( $log );
}
}
Hi Luc,
Thanks for sharing your workaround! I’ll pass it along to our developers for their feedback.
Hi Again Luc,
Thanks for your comment! We’ve updated the workaround to ensure the syntax is compatible with PHP 7.1 and later.