插件在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代码。