Ich debuggen ein Visual Composer-Plugin, das nach dem Update von Wordpress auf 4.5 kaputt ging und ich nicht herausfinden kann, warum es einen TypeError auslöst.
Die Fehlermeldung in der Konsole:
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
Die einzigen Vorkommen von $template
sind im folgenden Code zu finden. Ich verstehe, dass dies nicht sehr viel Kontext ist, aber wie kann ich diesen Fehler beheben?
/**
* 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();
},
Aktualisieren:
Es sieht so aus, als könnte dies ein Problem mit jQuery sein. Wordpress 4.5 enthält jQuery 1.12, durch das ein Fehler behoben wurde, durch den bestimmter Code mit falscher Syntax ausgeführt werden konnte. Ich gehe davon aus, dass der Plugin-Code eine falsche Syntax hatte, aber bis jetzt trotzdem lief.
https://wordpress.org/support/topic/read-this-first-wordpress-45-master-list#post-8271654
Ich konnte das Problem lösen. Es stellte sich heraus, dass ich eine ältere Version von JS Composer verwendet habe. Durch die Aktualisierung auf die neueste Version wurde meine Website beschädigt, sodass ich den Fehler aufgespürt und die html2element
-Funktion auf aktualisiert hat
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()
},
Alles funktioniert wieder gut für mich! Hoffe das hilft anderen.
Ich habe immer noch diese Fehlermeldung erhalten, nachdem ich den Patch in Bens Antwort ausprobiert hatte: Uncught TypeError: Kann die Eigenschaft 'custom' von undefined nicht lesen
Also habe ich das html2element in composer-view.js wie folgt geändert:
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()
},
@Ben Das funktioniert perfekt!
Ursache: Der Administrator hat den korrekten visuellen Editor für js_composer-Plugin nach der Aktualisierung dieser Plugins nicht geladen.
================================================== ===
Error:
Fehler: TypeError: $ template.get ist keine Funktion Quelldatei: WP-Content/plugins/js_composer_salient/assets/js/dist/backend.min.js? Ver = 4.10 Zeile: 4047
================================================== ===
Lösung Gehe zu Datei /wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js um Zeile 4045:
======> Ersetzen Sie den 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()
},
======> Durch diesen Code ersetzen ======================================== =
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()
},
Festgestellt, dass Code nicht an die Funktion html2element übergeben wurde, aber in der aufrufenden Funktion vorhanden war (render).
Der folgende Code hat meine Probleme vollständig behoben. Ich kann die Seite laden, hinzufügen, klonen, entfernen, 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;
},
Ich verwende das Thema Applay (2.1.3, etwas veraltet). Ich habe gerade WP und alle Plugins auf die neueste Version (4.5.2) aktualisiert und bin auch zu diesem Problem gekommen. Ich habe den Fluss dieser Komponente (js_composer) nicht analysiert, nur diese "defekte" Funktion (sie ist nicht wirklich defekt). Mir wurde klar, dass this.template und $ template falsche Objekttypen erhalten (es ist eine weitere Überprüfung neben _.isString(html)
erforderlich). Ich habe es gelöst, indem ich einen try & catch-Block wie folgt hinzugefügt habe:
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();
},
GEÄNDERT
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();
},
Ich verwende das Astra-Thema. Dieses Update funktioniert zu 99,9%. Für einige hält das nur das drehende Rad an, aber wenn die Seite nicht geladen wird, wird der visuelle Komponist nicht mehr geladen.
Ich habe eine kleine Änderung an diesem Code vorgenommen (der inzwischen überall veröffentlicht wird)
Ursprünglicher Astra-Theme-Code hier (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();
},
Der Code, der funktioniert:
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()
},
Der Hauptunterschied befindet sich hier (gegenüber dem ursprünglichen Code)
}); this.$el.attr
Es gibt ein Semikolon anstelle des ursprünglichen Kommas :):
}), this.$el.attr
Cheers Leute :) So
Ich habe diese Modifikation vorgenommen, die auf meinem WP 4.8.1 (PHP7) funktioniert.
in der Datei WP-Content/Plugins/js_composer/assets/js/backend/composer-view.js
sie müssen die render Methode ändern:
diese Zeile ersetzen
this.html2element(_.template($shortcode_template_el.html(), this.model.toJSON()));
von dieser Linie
this.html2element( $shortcode_template_el.html() );
Es scheint, dass die _.template () - Funktion nicht einwandfrei funktioniert und kein gutes Objekt zurückgibt. Geben Sie daher stattdessen den HTML-Code an.
Checkout unter dem Code für $ template.get ist keine Funktion und Uncought TypeError: Eigenschaftsattribute von undefined können nicht gelesen werden. Arbeitete für mich.
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()
}
Nun, ich habe die Lösung auf dieser Site gefunden: https://wordpress.org/support/topic/visual-composer-is-not-working
zuerst: edit html2element: .... in /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()},
zweitens: Wenn Sie jedoch den Frontend-Editor öffnen, haben Sie diese Ausgabe in custom_views.js: 101 und Zeile 467 einer anderen Datei. Ich habe den Namen vergessen, aber ich denke es könnte frontend_editor.js sein.
bearbeiten in:\wp-content\plugins\js_composer\assets\js\frontend_editor \
Falscher Code:
this.$controls = $( _.template( template, data, _.extend( {},
vc.template_options,
{ evaluate: /\{#([\s\S]+?)#}/g } ) ).trim() ).addClass( 'vc_controls' );
Fester Code:
this.$controls = $( _.template( template, data, _.extend( {},
vc.template_options,
{ evaluate: /\{#([\s\S]+?)#}/g } ) )().trim() ).addClass( 'vc_controls' );
drittens: Siehe die schwarze Magie.
Prost.
aktualisieren Sie Ihr Design. Gehen Sie zu Darstellung> Designs und suchen Sie nach einem Update. Dadurch wurde das Problem bei der Aktualisierung automatisch behoben.
Der Fehler tritt auf, wenn Sie ein Update auf WP 4.5 durchführen, um das Nimva-Design auszuführen.