Skip Navigation

Resolved

Reported for: WPML String Translation 3.1.2

Resolved in: String Translation 3.1.3

Overview of the issue

You may see the following error after updating to WPML String Translation 3.1.2:

1
2
3
4
5
6
7
8
9
[17-Sep-2020 10:51:21 UTC] PHP Fatal error:  Uncaught InvalidArgumentException: item should be a Collection or an array or an object in .../wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Obj.php:94
Stack trace:
#0 [internal function]: WPML\FP\Obj::WPML\FP{closure}(NULL, 'attachment_id', false)
#1 .../wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/functions.php(141): call_user_func_array(Object(Closure), Array)
#2 [internal function]: WPML\FP\Obj::WPML\FP{closure}(NULL, 'attachment_id', false)
#3 .../wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/collect/src/Illuminate/Support/Traits/Macroable.php(56): call_user_func_array(Object(Closure), Array)
#4 .../wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Obj.php(78): WPML\FP\Obj::__callStatic('propOr', Array)
#5 [internal function]: WPML\FP\Obj::WPML\FP{closure}('attachment_id', false)
#6 .../wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/f in /home/add/public_html/wp-content/plugins/sitepress-multilingual-cms/vendor/wpml/fp/core/Obj.php on line 94

Workaround

  • Make a full backup of your site.
  • Open your wpml-string-translation/inc/admin-texts/wpml-admin-texts.class.php file.
  • Look for the line 255
  • Replace:
    1
    2
    3
    4
    5
    6
    private function isAdminText( $key, $name ) {
        return null !== Wrapper::of( $this->getSubKey( $key, $name ) )
                               ->map( [ self::class, 'getKeysParts' ] )
                               ->map( invoke( 'reduce' )->with( flip( Obj::prop() ), $this->getOptionNames() ) )
                               ->get();
    }
  • With:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private function isAdminText($key, $name) {
        try {
            return null !== Wrapper::of($this->getSubKey($key, $name))
                    ->map([self::class, 'getKeysParts'])
                    ->map(invoke('reduce')->with(flip(Obj::prop()), $this->getOptionNames()))
                    ->get();
        } catch (Exception $ex) {
            error_log($ex->getMessage() . ' Option Key ' . $key);
        }
    }