Mise à jour du Plugin TypeError après Wordpress 4.5

je suis en train de déboguer un plugin visual composer qui s'est cassé après que J'ai mis à jour Wordpress à 4.5 et je ne peux pas comprendre pourquoi il lance une erreur de typographie.

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 à partir de 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();
},



mise à jour:

il semble que ce soit un problème avec jQuery. Wordpress 4.5 inclut jQuery 1.12 qui a corrigé un bug qui a permis à certains codes d'être exécutés avec une syntaxe incorrecte. Je suppose que le code du plugin devait avoir une syntaxe incorrecte mais qu'il a quand même fonctionné jusqu'à présent.

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

46
demandé sur spencer.sm 2016-04-13 20:23:08

10 réponses

j'ai pu résoudre le problème. Il s'avère que j'utilisais une version plus ancienne de js composer. La mise à jour vers la version la plus récente a cassé mon site donc j'ai repéré l'erreur et mis à jour la fonction html2element à

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 à nouveau! Espérons que cela aide les autres.

115
répondu Ben 2016-04-15 19:04:18

j'ai encore cette erreur après avoir essayé le patch dans la réponse de Ben: erreur typographique: ne peut pas lire la propriété 'custom' de non défini

donc j'ai modifié le 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()
    },
31
répondu ECC-Dan 2016-07-20 16:24:39

@Ben c'est parfait!

Cause: Admin ne chargeait pas le bon éditeur visuel pour le plugin js_composer après avoir mis à jour ces plugins.

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

erreur:

erreur: TypeError: $ template.obtenez 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 Goto file /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()
    },

======> Remplacer avec 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
répondu Didierh 2016-04-19 15:01:56

j'utilise le thème Applay (2.1.3, un peu dépassé). Je viens de mettre à jour WP et tous les plugins à la version la plus récente (4.5.2) et est venu à cette question aussi. Je n'ai pas analysé le flux de ce composant (js_composer), juste cette fonction "cassée" (elle n'est pas vraiment cassée). J'ai réalisé que ce.template et $ template obtiennent les mauvais types d'objets (il a besoin d'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
répondu Luciano Fantuzzi 2016-06-08 16:00:23

a remarqué que le code n'était pas passé dans la fonction html2element, mais existait dans la fonction l'appelant (render)

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;
		},
4
répondu Amritosh pandey 2016-10-10 12:54:30

j'utilise le thème Astra. Ce correctif fonctionne à 99,9%. Pour certains tho, cela ne fait qu'arrêter le Rouet, mais une fois que la page charge visual composer ne le fait pas.

j'ai fait un léger changement à ce code (qui est affiché partout maintenant)

thème original Astra code here (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()

},

le principal la différence est localisée ici (par rapport au code original)

}); this.$el.attr

il y a un point-virgule à la place de la virgule originale:):

}), this.$el.attr

Cheers gens :)

3
répondu Renegade_Mtl 2016-04-28 21:22:14

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

d'abord: modifier html2element:.... dans /wp-content/plugins/js_composer/assets/js/backend/compositeur-vue.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()},

deuxième: Toutefois, si vous ouvrez l'interface de l'éditeur, vous aurez cette "trim" question sur custom_views.js:101 , et la ligne 467 d'un autre fichier. J'ai oublié le nom, mais je pense que c'est peut-être frontend_editor.js.

éditer 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' );

tiers: Voir la magie noire.

santé.

1
répondu Sebastian Diaz 2016-06-23 05:43:34

Check-Out ci-dessous le code pour les deux $template.get n'est pas une fonction et Uncaught TypeError: ne peut pas lire la propriété 'attributes' de undefined. A 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
répondu Amit Garg 2017-07-18 18:26:37

j'ai fait cette modification qui fonctionne sur mon WP 4.8.1 (PHP7)

dans le fichier wp-content/plugins/js_composer/assets/js/backend/compositeur-vue.js

vous devez modifier le rendre méthode:

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 le _.template() fonction qui ne fonctionne pas parfaitement et ne renvoie pas le bon objet, alors mieux vaut donner le code html à la place.

1
répondu sly63 2017-08-03 22:45:09

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

l'erreur se produit lorsque vous mettez à jour à WP 4.5 pour que j'exécute le thème Nimva. Vous devez mettre à jour à 2.02 de Nimva, ce qui permet des mises à jour automatiques.

0
répondu Robert Spencer 2016-04-15 15:59:18