web-dev-qa-db-fra.com

Plugin renvoyant TypeError après la mise à jour de Wordpress 4.5

Je suis en train de déboguer un plug-in de Visual Composer qui a éclaté après la mise à jour de Wordpress à la version 4.5 et je ne comprends pas pourquoi il génère une erreur TypeError.

Le message d'erreur dans la console:

JQMIGRATE: Migrate is installed, version 1.4.0              load-scripts.php?....
Uncaught TypeError:     $template.get is not a function     composer-view.js?ver=4.1.1.1:73

Les seules occurrences de $template se trouvent dans le code ci-dessous. Je comprends que ce n’est pas beaucoup de contexte, mais comment puis-je résoudre cette erreur?

/**
 * Convert html into correct element
 * @param html
 */
html2element: function(html) {
  var attributes = {},
    $template;
  if (_.isString(html)) {
    this.template = _.template(html);
    $template = $(this.template(this.model.toJSON()).trim());
  } else {
    this.template = html;
    $template = html;
  }
  _.each($template.get(0).attributes, function(attr) { // **errors on this line**
    attributes[attr.name] = attr.value;
  });
  this.$el.attr(attributes).html($template.html());
  this.setContent();
  this.renderContent();
},


Mettre à jour:

Il semble que cela pourrait être un problème avec jQuery. Wordpress 4.5 inclut jQuery 1.12 qui corrige un bogue qui permettait à certains codes d'être exécutés avec une syntaxe incorrecte. Je suppose que le code du plugin doit avoir une syntaxe incorrecte, mais qu'il a néanmoins fonctionné jusqu'à présent.

https://wordpress.org/support/topic/read-this-first-wordpress-45-master-list#post-8271654

47
spencer.sm

J'ai pu résoudre le problème. Il s'avère que j'utilisais une ancienne version de JS Composer. La mise à jour vers la dernière version a endommagé mon site. J'ai donc traqué l'erreur et mis à jour la fonction html2element en 

html2element: function(html) {
            var $template, attributes = {},
                template = html;
            $template = $(template(this.model.toJSON()).trim()), _.each($template.get(0).attributes, function(attr) {
                attributes[attr.name] = attr.value
            }), this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()
        },

Tout fonctionne bien pour moi encore! J'espère que cela aide les autres.

118
Ben

J'obtenais toujours cette erreur après avoir essayé le correctif dans la réponse de Ben: Uncaught TypeError: Impossible de lire la propriété 'custom' of indéfinie

J'ai donc modifié html2element dans composer-view.js comme suit: 

 html2element: function(html) {
        var $template, attributes = {},
            template = html;

        $template = $(template(this.model.toJSON()).trim());
        if($template.get(0))
        {
            _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        })};

        this.$el.attr(attributes).html($template.html()),
        this.setContent(),
        this.renderContent()
    },
33
ECC-Dan

@Ben Cela fonctionne parfaitement!

Cause: L'administrateur n'a pas chargé l'éditeur visuel correct pour le plug-in js_composer après la mise à jour de ces plug-ins.

=============================================== ===

Erreur:

Erreur: TypeError: $ template.get n'est pas une fonction Fichier source: wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js? Ver = 4.10 Ligne: 4047

=============================================== ===

Solution Allez au fichier /wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js autour de la ligne 4045:

======> Remplacez le code ======================================= =============

    html2element: function(html) {
        var $template, attributes = {};
        _.isString(html) ? (this.template = _.template(html), $template = $(this.template(this.model.toJSON(), vc.templateOptions["default"]).trim())) : (this.template = html, $template = html), _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        }), this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()
    },

======> Remplacez par ce code ====================================== =

    html2element: function(html) {
        var $template, attributes = {},
        template = html;
        $template = $(template(this.model.toJSON()).trim()), _.each($template.get(0).attributes, function(attr) {
                attributes[attr.name] = attr.value}), 
                this.$el.attr(attributes).html($template.html()), this.setContent(), 
                this.renderContent()
    },
18
Didierh

Remarqué que le code n'était pas passé dans la fonction html2element, mais existait dans la fonction l'appelant

Le code suivant a complètement corrigé mes problèmes, je peux charger la page, ajouter, cloner, supprimer, etc.

render: function () {
			var $shortcode_template_el = $( '#vc_shortcode-template-' + this.model.get( 'shortcode' ) );
			if ( $shortcode_template_el.is( 'script' ) ) {
				var newHtmlCode =  _.template( $shortcode_template_el.html(),
												this.model.toJSON(),
												vc.templateOptions.default );
				if(!_.isString(newHtmlCode)){
					newHtmlCode = $shortcode_template_el.html();
				}
				this.html2element( newHtmlCode );
			} else {
				var params = this.model.get( 'params' );
				$.ajax( {
					type: 'POST',
					url: window.ajaxurl,
					data: {
						action: 'wpb_get_element_backend_html',
						data_element: this.model.get( 'shortcode' ),
						data_width: _.isUndefined( params.width ) ? '1/1' : params.width,
						_vcnonce: window.vcAdminNonce
					},
					dataType: 'html',
					context: this
				} ).done( function ( html ) {
					this.html2element( html );
				} );
			}
			this.model.view = this;
			this.$controls_buttons = this.$el.find( '.vc_controls > :first' );
			return this;
		},

5
Amritosh pandey

J'utilise le thème Applay (2.1.3, un peu obsolète). Je viens de mettre à jour WP et tous les plugins vers la version la plus récente (4.5.2). Je n'ai pas analysé le flux de ce composant (js_composer), juste cette fonction "cassée" (ce n'est pas vraiment cassé). J'ai réalisé que this.template et $ template obtiennent des types d'objet incorrects (il nécessite une autre validation à part _.isString(html)). Je l'ai résolu en ajoutant un bloc try & catch comme suit:

ORIGINAL

    html2element:function (html) {
        var attributes = {}, 
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
            $template = $(this.template(this.model.toJSON()).trim());
        } else {
            this.template = html;                                                                                                                                            
            $template = html;
        }
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        }); 
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },

MODIFIÉ

    html2element:function (html) {
        var attributes = {}, 
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
        } else {
            try {
                this.template = _.template(html());                                                                                                                          
            } catch (err) {
                this.template = html;
            }   
        }   
        $template = $(this.template(this.model.toJSON()).trim());
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        }); 
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },
4
Luciano Fantuzzi

J'utilise le thème Astra. Ce correctif fonctionne à 99,9%. Pour certains, cela n'arrête que la roue qui tourne, mais pas le compositeur visuel une fois chargé 

J'ai légèrement modifié ce code (qui est maintenant affiché partout) 

Code du thème Astra original ici (composer-view.js)

        html2element:function (html) {
        var attributes = {},
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
            $template = $(this.template(this.model.toJSON()).trim());
        } else {
            this.template = html;
            $template = html;
        }
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        });
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },

Le code qui fonctionne:

html2element: function(html) {
    var $template, 
    attributes = {},
    template = html;
    $template = $(template(this.model.toJSON()).trim()), 
     _.each($template.get(0).attributes, function(attr) {
    attributes[attr.name] = attr.value
}); this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()

},

La principale différence est située ici (par rapport au code d'origine)

}); this.$el.attr

Il y a un point-virgule à la place de la virgule d'origine :):

}), this.$el.attr

Salut les gens :) Alors

3
Renegade_Mtl

J'ai apporté cette modification qui fonctionne sur mon WP 4.8.1 (PHP7)

dans le fichier wp-content/plugins/js_composer/assets/js/backend/composer-view.js

vous devez modifier la méthode render :

remplacer cette ligne

this.html2element(_.template($shortcode_template_el.html(), this.model.toJSON())); 

par cette ligne

this.html2element( $shortcode_template_el.html() );

Il semble que la fonction _.template () ne fonctionne pas parfaitement et ne renvoie pas le bon objet. Il est donc préférable de donner le code HTML à la place.

1
sly63

Le code de paiement ci-dessous pour $ template.get n'est pas une fonction et Uncaught TypeError: Impossible de lire la propriété 'attributs' de non défini. Travaillé pour moi.

html2element: function(html) {
    var $template, attributes = {},
            template = html;

        $template = $(template(this.model.toJSON()).trim());
        if($template.get(0))
        {
            _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        })};

        this.$el.attr(attributes).html($template.html()),
        this.setContent(),
        this.renderContent()
}
1
Amit Garg

Eh bien, j'ai trouvé la solution sur ce site: https://wordpress.org/support/topic/visual-composer-is-not-working

d'abord: edit html2element: .... dans /wp-content/plugins/js_composer/assets/js/backend/composer-view.js 

html2element: function(html) {
        var $template, attributes = {},
            template = html;
        $template = $(template(this.model.toJSON()).trim()), _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        }), this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()},

second: Cependant, si vous ouvrez l'éditeur de frontend, vous aurez ce problème "trim" sur custom_views.js: 101, ainsi que la ligne 467 d'un autre fichier. J'ai oublié le nom, mais je pense que c'est peut-être frontend_editor.js.

modifier dans:\wp-content\plugins\js_composer\assets\js\frontend_editor \

  • frontend_editor.js
  • custom_views.js

Mauvais code:

this.$controls = $( _.template( template, data, _.extend( {},
            vc.template_options,
            { evaluate: /\{#([\s\S]+?)#}/g } ) ).trim() ).addClass( 'vc_controls' );

Code fixe:

this.$controls = $( _.template( template, data, _.extend( {},
            vc.template_options,
            { evaluate: /\{#([\s\S]+?)#}/g } ) )().trim() ).addClass( 'vc_controls' );

troisième: voir la magie noire.

À votre santé.

1
Sebastian Diaz

essayez de mettre à jour votre thème. Allez à Apparence> Thèmes et recherchez une mise à jour. Cela a résolu le problème pour moi automatiquement lors de la mise à jour.

L'erreur se produit lorsque vous mettez à jour la version WP 4.5 pour moi exécutant le thème Nimva . Vous devez mettre à jour à la version 2.02 de Nimva, qui autorise les mises à jour automatiques.

0
Robert Spencer