it-swarm.com.ru

Плагин выбрасывает TypeError после WordPress 4.5 обновления

Я отлаживаю визуальный плагин composer, который сломался после того, как я обновил 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

Единственные вхождения $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

50
spencer.sm

Я был в состоянии решить проблему. Оказывается, я использовал более старую версию JS composer. Обновление до последней версии сломало мой сайт, поэтому я отследил ошибку и обновил функцию 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()
        },

Все снова работает хорошо для меня! Надеюсь, что это помогает другим.

118
Ben

Я все еще получал эту ошибку после попытки исправления в ответе Бена: Uncaught TypeError: Невозможно прочитать свойство 'custom' из неопределенного

Поэтому я изменил html2element в composer-view.js следующим образом: 

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

@ Бен Это прекрасно работает!

Причина: Администратор не загружал правильный визуальный редактор для плагина js_composer после обновления этого плагина.

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

Ошибка:

Ошибка: ошибка типа: $ template.get не является функцией Исходный файл: wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js? Ver = 4.10 Строка: 4047

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

Решение Перейти к файлу /wp-content/plugins/js_composer_salient/assets/js/dist/backend.min.js около строки 4045:

======> Заменить код ======================================== =============

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

======> Замените этим кодом ====================================== знак равно

    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
Didierh

Заметил, что код не передается в функцию 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;
		},

5
Amritosh pandey

Я использую тему Applay (2.1.3, немного устарела). Я только что обновил WP и все плагины до последней версии (4.5.2) и также пришел к этой проблеме. Я не анализировал поток этого компонента (js_composer), только эту «сломанную» функцию (она не сломана). Я понял, что this.template и $ template получают неправильные типы объектов (кроме _.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();
    },
4
Luciano Fantuzzi

Я использую тему Astra. Это исправление работает на 99,9%. Для некоторых это только останавливает вращающееся колесо, но как только страница загружается, визуальный композитор - нет. 

Я внес небольшое изменение в этот код (который уже опубликован везде) 

Оригинальный код темы Astra здесь (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

Ура ребята :) так

3
Renegade_Mtl

Я сделал эту модификацию, которая работает на моем WP 4.8.1 (PHP7)

в файле wp-content/plugins/js_composer/assets/js/backend/composer-view.js

вы должны изменить метод render :

заменить эту строку

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

по этой линии

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

Кажется, функция _.template () не работает идеально и не возвращает хороший объект, поэтому лучше вместо этого дать HTML-код.

1
sly63

Описанный ниже код для $ template.get не является функцией и Uncaught TypeError: Невозможно прочитать свойство 'attribute' из undefined. Работал на меня.

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
Amit Garg

Ну, я нашел решение на этом сайте: 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()},

второе: однако, если вы откроете редактор внешнего интерфейса, у вас возникнет эта проблема «trim» в 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' );

третье: увидеть черную магию.

Приветствия.

1
Sebastian Diaz

попробуйте обновить вашу тему. Перейдите на Внешний вид> Темы и проверьте наличие обновлений. Это решило проблему для меня автоматически после обновления.

Ошибка возникает, когда вы обновляете до WP 4.5 для меня работающую тему Nimva . Вы должны обновить до 2.02 Nimva, что позволяет автоматически обновлять.

0
Robert Spencer