插件在WordPress 4.5更新后引发TypeError

我正在debugging一个可视化的composer php插件,当我更新Wordpress到4.5后,我无法弄清楚它为什么会抛出一个TypeError。

控制台中的错误消息:

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 

在下面的代码中只能find$template 。 我明白,这不是很多情况下,但我怎样才能解决这个错误?

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

更新:

看起来这可能是jQuery的一个问题。 WordPress的4.5包括jQuery 1.12修复了一个错误,允许某些代码运行不正确的语法。 我假设插件代码必须有不正确的语法,但直到现在仍然运行。

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

我能够解决这个问题。 原来我使用的是JScomposer php的老版本。 更新到最新版本打破了我的网站,所以我跟踪了错误,并更新了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() }, 

一切都为我工作再好! 希望这可以帮助别人。

在Ben的答案中尝试修补程序后,我仍然遇到这个错误: Uncaught TypeError:无法读取未定义的属性'custom'

所以我修改了composer-view.js中的html2element,如下所示:

  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这工作完美!

原因:在updatethis插件之后,Admin没有为js_composer插件加载正确的可视化编辑器。

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

错误:

错误:TypeError:$ template.get不是函数源文件:wp-content / plugins / js_composer_salient / assets / js / dist / backend.min.js?ver = 4.10 Line:4047

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

解决scheme转到4045行附近的文件/wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js:

======>replace代码======================================== =============

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

======>用这段代码replace======================================= =

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

注意到代码没有被传递到html2element函数中,但是在调用它的函数中存在(render)

下面的代码已经完全纠正了我的问题,我可以加载页面,添加,克隆,删除等

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

我使用的主题Applay(2.1.3,有点过时)。 我刚刚更新WP和所有插件到最新的版本(4.5.2),也来到这个问题。 我没有分析这个组件(js_composer)的stream程,只是这个“破碎”的function(它并没有真的被打破)。 我意识到这个。模板和$模板正在得到错误的对象types(它需要另一个validation旁边_.isString(html) )。 我通过添加try&catch块来解决它,如下所示:

原版的

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

改性

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

我正在使用Astra主题。 此修复程序是99.9%的工作。 对于某些寿命,这只能停止纺车,但一旦页面加载视觉composer php没有。

我对这段代码做了一个小改动(现在到处都是)

这里的原始雅特主题代码(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(); }, 

代码工作:

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

},

主要区别在于这里(与原始代码相比)

 }); this.$el.attr 

有一个分号,而不是原来的逗号:):

 }), this.$el.attr 

干杯人:)所以

那么,我在这个网站find了解决scheme: https : //wordpress.org/support/topic/visual-composer-is-not-working

首先:编辑html2element:….在/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()}, 

第二:然而,如果你打开前端编辑器,你将在custom_views.js:101和另一个文件的第467行上有这个“修剪”问题。 我忘了名字,但我认为它可能是frontend_editor.js。

编辑在:\ wp-content \ plugins \ js_composer \ assets \ js \ frontend_editor \

  • frontend_editor.js
  • custom_views.js

错误代码:

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

固定代码:

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

第三:看到黑魔法。

干杯。

$ template.get的代码如下所示不是一个函数,Uncaught TypeError:不能读取未定义的属性'attributes'。 为我工作。

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

尝试更新你的主题。 转到外观>主题,并检查更新。 这在更新时自动解决了我的问题。

当您更新到WP 4.5为我运行Nimva主题时出现错误。 你必须更新到Nimva的2.02,允许自动更新。

我做了这个修改,在我的WP 4.8.1(PHP7)

在文件wp-content / plugins / js_composer / assets / js / backend / composer-view.js

你必须修改渲染方法:

replace这一行

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

由这条线

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

看来_.template()函数不能正常工作,不会返回好的对象,所以最好给html代码。