[Javascript] Plugin di lancio TypeError dopo l'aggiornamento di Wordpress 4.5


Answers

Stavo ancora ricevendo questo errore dopo aver provato la patch nella risposta di Ben: Uncaught TypeError: Impossibile leggere la proprietà 'custom' di undefined

Così ho modificato html2element in composer-view.js come segue:

 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()
    },
Question

Sto eseguendo il debug di un plugin per visual compositore che si è rotto dopo aver aggiornato Wordpress a 4.5 e non riesco a capire perché stia lanciando un errore TypeError.

Il messaggio di errore nella 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

Le uniche occorrenze di $template si trovano nel codice qui sotto. Capisco che questo non è molto contesto da cui partire, ma come posso risolvere questo errore?

/**
 * 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();
},


Aggiornare:

Sembra che questo potrebbe essere un problema con jQuery. Wordpress 4.5 include jQuery 1.12 che risolve un bug che permetteva di eseguire determinati codici con sintassi errata. Suppongo che il codice del plugin debba avere una sintassi errata, ma è comunque rimasto in esecuzione fino ad ora.

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




Sto usando il tema Astra. Questa soluzione funziona al 99,9%. Per alcuni però, si ferma solo la ruota che gira, ma quando la pagina non carica il compositore visivo no.

Ho apportato una leggera modifica a questo codice (che è pubblicato ovunque ormai)

Codice del tema Astra originale qui (compositore-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();
    },

Il codice che funziona:

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 differenza principale si trova qui (rispetto al codice originale)

}); this.$el.attr

C'è un punto e virgola al posto della virgola originale :):

}), this.$el.attr

Gente di applausi :) Quindi




Ho apportato questa modifica che funziona sul mio WP 4.8.1 (PHP7)

nel file wp-content / plugins / js_composer / assets / js / backend / composit-view.js

è necessario modificare il metodo di rendering :

sostituire questa linea

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

da questa linea

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

Sembra che la funzione _.template () non funzioni perfettamente e non restituisca l'oggetto buono, quindi è meglio dare il codice html.




Il checkout sotto il codice per entrambi $ template.get non è una funzione e Uncaught TypeError: Impossibile leggere la proprietà 'attributes' di undefined. Ha funzionato per me

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()
}



Notò che il codice non veniva passato alla funzione html2element, ma esisteva nella funzione chiamandolo (render)

Il seguente codice ha completamente corretto i miei problemi, posso caricare la pagina, aggiungere, clonare, rimuovere, ecc

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;
		},