Удаление атрибута type из тегов script и style, добавляемых WordPress

5 дек. 2017 г., 21:05:05
Просмотры: 62.2K
Голосов: 21
Предупреждение: Атрибут type не нужен для JavaScript ресурсов.
    Из строки 10, колонка 146; до строки 10, колонка 176
    feed/" /> <script type="text/javascript">window
   
Предупреждение: Атрибут type для элемента style не нужен и должен быть опущен.
    Из строки 11, колонка 1798; до строки 11, колонка 1820
    </script> <style type="text/css">img.wp
    
Предупреждение: Атрибут type для элемента style не нужен и должен быть опущен.
    Из строки 23, колонка 193; до строки 23, колонка 251
    a='all' /><style id='kirki-styles-global-inline-css' type='text/css'>.envel
    
Предупреждение: Атрибут type не нужен для JavaScript ресурсов.
    Из строки 23, колонка 905; до строки 23, колонка 1010
    }</style> <script async type="text/javascript" src="http://....../wp-content/cache/minify/df983.js"></scri
    
Предупреждение: Атрибут type для элемента style не нужен и должен быть опущен.
    Из строки 70, колонка 126; до строки 70, колонка 167
    70.png" /><style type="text/css" id="wp-custom-css">@media
    
Предупреждение: Атрибут type не нужен для JavaScript ресурсов.
    Из строки 441, колонка 156; до строки 441, колонка 261
    iv></div> <script defer type="text/javascript" src="http://......./wp-content/cache/minify/26938.js"></scri
    
Предупреждение: Атрибут type не нужен для JavaScript ресурсов.
    Из строки 441, колонка 272; до строки 441, колонка 302
    </script> <script type='text/javascript'>/*  */
    
Предупреждение: Атрибут type не нужен для JavaScript ресурсов.
    Из строки 443, колонка 17; до строки 443, колонка 122
    </script> <script defer type="text/javascript" src="http://......../wp-content/cache/minify/6ce07.js"></scri

Эти ошибки являются новым требованием W3C и начали появляться только в последние 3-4 дня.скриншот ошибок валидатора W3C

Мы подключаем скрипты таким образом →

wp_register_script( 'custom-js', get_template_directory_uri() . '/js/custom.js', array( 'jquery' ), '1.1', true );
    wp_enqueue_script( 'custom-js' );

Можем ли мы исправить это через вышеуказанный метод подключения?

Обновление →

это фактические ошибки. В красном прямоугольнике показаны ошибки от W3 Total Cache.скриншот ошибок от W3 Total Cache

5
Комментарии

валидатор W3C редко возвращает страницы WordPress или других популярных CMS без ошибок. С каждым годом ситуация, кажется, становится всё хуже. Валидатор (по моему мнению) следует использовать как инструмент для выявления базовых ошибок (например, забытые теги alt или незакрытые теги), но не стоит рассматривать его как стандарт, как это было раньше.

David Sword David Sword
5 дек. 2017 г. 21:11:30

они добавили это после 2 декабря 2017 года. До этого моя тема была свободна от ошибок и предупреждений. Должен быть способ избавиться от них.

WordCent WordCent
5 дек. 2017 г. 21:16:37

посмотрите на хук script_loader_tag, возможно, вы сможете использовать str_replace() для их удаления.

David Sword David Sword
5 дек. 2017 г. 22:18:27

Стоит отметить, что это всего лишь предупреждения, а не ошибки. Ваш сайт по-прежнему будет валидным.

swissspidy swissspidy
26 янв. 2018 г. 10:45:03

Вы также можете ознакомиться с этим ответом -- https://stackoverflow.com/a/53380692/2611955

Jahirul Islam Mamun Jahirul Islam Mamun
23 сент. 2019 г. 08:24:27
Все ответы на вопрос 12
5
45

WordPress 5.3 представляет значительно более простой способ достичь этого. Регистрируя поддержку HTML5 для script и style в теме, атрибут type="" будет опущен:

add_action(
    'after_setup_theme',
    function() {
        add_theme_support( 'html5', [ 'script', 'style' ] );
    }
);
28 нояб. 2019 г. 16:24:10
Комментарии

Это правильный способ сделать это.

Ankit Chauhan Ankit Chauhan
8 янв. 2020 г. 08:13:20

Отлично! Этот ответ должен быть принятым.

Joe Joe
15 янв. 2020 г. 17:10:03

Не могли бы вы уточнить, куда (в какой файл) нужно поместить указанный выше код?

yaylitzis yaylitzis
21 мая 2020 г. 14:02:44

Он не удаляет тип type из строки с wp-emoji-release.min.js - <script src="https://example.com/wp-includes/js/wp-emoji-release.min.js?ver=5.5.3" type="text/javascript" defer=""></script>. Это связано с https://core.trac.wordpress.org/ticket/51837

kanlukasz kanlukasz
23 нояб. 2020 г. 08:08:06
8
18

Вы можете удалить атрибуты type='*' и их значения из скриптов и стилей, загружаемых через wp_enqueue, используя соответствующие хуки *_loader_tag.

Следующий код сработал у меня:

add_action( 'wp_enqueue_scripts', 'myplugin_enqueue' );

function myplugin_enqueue() {
    // wp_register_script(...
    // wp_enqueue_script(...
}


add_filter('style_loader_tag', 'myplugin_remove_type_attr', 10, 2);
add_filter('script_loader_tag', 'myplugin_remove_type_attr', 10, 2);

function myplugin_remove_type_attr($tag, $handle) {
    return preg_replace( "/type=['\"]text\/(javascript|css)['\"]/", '', $tag );
}
5 дек. 2017 г. 23:37:33
Комментарии

Я пробовал это, но проблема не исправилась. Возможно, нам нужно какое-то дополнительное вмешательство.

WordCent WordCent
5 дек. 2017 г. 23:45:28

Я предполагаю, что некоторые скрипты из плагинов (например, скрипты плагина кеширования с тегом defer) могут не использовать wp_enqueue_script и, следовательно, не будут использовать *_loader_tag. Не могли бы вы подтвердить, что после добавления моего сниппета в исходном коде вашего сайта у custom.js всё ещё остаётся атрибут type='text/javascript'?

David Sword David Sword
5 дек. 2017 г. 23:56:09

Нет. Я удалил плагин w3 total cache. 3 из 8 ошибок исчезли, но 5 остались.

WordCent WordCent
5 дек. 2017 г. 23:59:32

Вы можете отследить источник этих пяти и посмотреть, возможно ли редактировать теги. Я снова предполагаю, что они, вероятно, не используют wp_enqueue. Предлагаю добавить UPDATE в ваш исходный пост, чтобы отразить оставшиеся упрямые 5 ошибок, с кодом и ссылками на плагины — возможно, смогу помочь ещё.

David Sword David Sword
6 дек. 2017 г. 00:14:43

Сэр, обновил ошибки, на этот раз с изображением.

WordCent WordCent
6 дек. 2017 г. 04:31:09

И какой плагин генерирует эти файлы */cache/minify/*.js?

David Sword David Sword
6 дек. 2017 г. 04:38:32

сэр, плагин W3 Total Cache. W3 ввел эти предупреждения после 2 декабря. Вы поместите любой сайт на WP в валидатор и увидите эти предупреждения.

WordCent WordCent
6 дек. 2017 г. 04:50:45

Спасибо, Дэвид, это сработало для большинства моих проблем, но еще остались некоторые. Лучше чем ничего!

Jordan Carter Jordan Carter
22 февр. 2018 г. 06:51:51
Показать остальные 3 комментариев
1

Получил это из плагина soil / roots. В основном справился с задачей.

    add_filter( 'style_loader_tag',  'clean_style_tag'  );
add_filter( 'script_loader_tag', 'clean_script_tag'  );

/**
 * Очистка вывода тегов <link> для таблиц стилей
 */
function clean_style_tag( $input ) {
    preg_match_all( "!<link rel='stylesheet'\s?(id='[^']+')?\s+href='(.*)' type='text/css' media='(.*)' />!", $input, $matches );
    if ( empty( $matches[2] ) ) {
        return $input;
    }
    // Выводим media только если оно имеет значение
    $media = $matches[3][0] !== '' && $matches[3][0] !== 'all' ? ' media="' . $matches[3][0] . '"' : '';

    return '<link rel="stylesheet" href="' . $matches[2][0] . '"' . $media . '>' . "\n";
}

/**
 * Очистка вывода тегов <script>
 */
function clean_script_tag( $input ) {
    $input = str_replace( "type='text/javascript' ", '', $input );

    return str_replace( "'", '"', $input );
}
20 дек. 2017 г. 17:54:21
Комментарии

ты пробовал это

WordCent WordCent
20 дек. 2017 г. 21:58:19
3

Подходы с использованием style_loader_tag и script_loader_tag, описанные выше, должны работать с любым HTML-кодом, генерируемым WordPress, при условии, что тема или плагин используют правильные функции для подключения скриптов и стилей.

Если у вас есть проблемные плагины, которые не сотрудничают (например, Jetpack в некоторых версиях мог быть таким нарушителем), и вы решительно настроены решить эту проблему, несмотря на то, что посетители вашего сайта вряд ли заметят разницу (их браузеры отобразят страницу корректно!), вы можете использовать буферизацию вывода:

add_action('wp_loaded', 'output_buffer_start');
function output_buffer_start() { 
    ob_start("output_callback"); 
}

add_action('shutdown', 'output_buffer_end');
function output_buffer_end() { 
    ob_end_flush(); 
}

function output_callback($buffer) {
    return preg_replace( "%[ ]type=[\'\"]text\/(javascript|css)[\'\"]%", '', $buffer );
}

Предупреждаем: хотя это решение работает, оно не очень эффективно. Функция preg_replace() будет выполняться для всего окончательного HTML-кода, сгенерированного WordPress, перед отправкой в браузер клиента, для каждого запроса.

Буферизация вывода включается в начале (wp_loaded хук), то есть когда WordPress, тема, плагины и т.д. полностью загружены, и отключается в последний момент (shutdown хук), который срабатывает непосредственно перед завершением работы PHP. Регулярное выражение должно обработать весь контент, а его может быть очень много!

Подходы с style_loader_tag и script_loader_tag выполняют замену только для небольших строк (самих тегов), поэтому их влияние на производительность минимально.

Если у вас относительно статичный контент и используется кеширование, это может частично решить проблему производительности.

Ссылки на документацию PHP:

24 мая 2018 г. 05:22:20
Комментарии

Это лучший ответ, который работает правильно и без ошибок. Спасибо, друг.

Ivijan Stefan Stipić Ivijan Stefan Stipić
28 мая 2018 г. 09:24:48

Единственное рабочее решение

Timur Gafforov Timur Gafforov
10 нояб. 2018 г. 08:23:06

Если кому-то интересно, WordPress, похоже, не использует фильтры style_loader_tag или script_loader_tag при добавлении тега <script> для встроенных скриптов. https://developer.wordpress.org/reference/classes/wp_scripts/print_inline_script/

firxworx firxworx
13 нояб. 2018 г. 21:50:45
1

Это очень помогло мне:

add_filter('script_loader_tag', 'clean_script_tag');
  function clean_script_tag($input) {
  $input = str_replace("type='text/javascript' ", '', $input);
  return str_replace("'", '"', $input);
}

Спасибо css-tricks (LeoNovais): https://css-tricks.com/forums/topic/clean-up-script-tags-in-wordpress/#post-246425

31 янв. 2018 г. 09:30:32
Комментарии

Конкретный пост, на который ссылается автор выше, находится здесь: https://css-tricks.com/forums/topic/clean-up-script-tags-in-wordpress/#post-246425 Примечание: скрипт зачеркнут, но выделив текст, его можно прочитать, как указано выше. LeoNovais не предоставляет никаких дополнительных пояснений. Я не знаю, почему CSS Tricks зачеркнул его скрипт.

SherylHohman SherylHohman
13 янв. 2019 г. 21:54:51
0

Согласно коду в script-loader.php, атрибут type опускается, когда добавлена поддержка html5 в теме с аргументами script и style.

Смотрите ссылки ниже:

function yourthemeprefix_theme_supportt() {
    add_theme_support(
        'html5',
        array(
            'script', // Исправление: Атрибут "type" не обязателен для ресурсов JavaScript.
            'style',  // Исправление: Атрибут "type" для элемента "style" не нужен и должен быть опущен.
        )
    );
}
add_action( 'after_setup_theme', 'yourthemeprefix_theme_support' );
16 дек. 2019 г. 12:32:57
0

Развивая решение от @realmag77. Этот код использует плагин Autoptimize для удаления ВСЕХ атрибутов type, но также имеет резервный вариант на случай, если плагин не установлен или не активирован. Резервный вариант работает нормально, но скрипты и таблицы стилей, загружаемые через плагины, не будут отфильтрованы. Я не знаю другого способа их отфильтровать, кроме как через функционал Autoptimize.

/* ==========================================
   Удаление атрибута type у JS/CSS
   (требует плагин Autoptimize и включенную опцию "Оптимизировать HTML")
   но с резервным вариантом на всякий случай
========================================== */

// Если Autoptimize установлен и активирован, удаляем атрибуты type для всего JS/CSS
if ( is_plugin_active( 'autoptimize/autoptimize.php' ) ) {

    add_filter('autoptimize_html_after_minify', function($content) {

        $site_url = home_url();
        $content = str_replace("type='text/javascript'", '', $content);
        $content = str_replace('type="text/javascript"', '', $content);

        $content = str_replace("type='text/css'", '', $content);
        $content = str_replace('type="text/css"', '', $content);

        $content = str_replace($site_url . '/wp-includes/js', '/wp-includes/js', $content);
        $content = str_replace($site_url . '/wp-content/cache/autoptimize', '/wp-content/cache/autoptimize', $content);
        $content = str_replace($site_url . '/wp-content/themes/', '/wp-content/themes/', $content);
        $content = str_replace($site_url . '/wp-content/uploads/', '/wp-content/uploads/', $content);
        $content = str_replace($site_url . '/wp-content/plugins/', '/wp-content/plugins/', $content);

        return $content;

    }, 10, 1);

} else {

    // Резервный вариант для удаления атрибутов type, кроме загружаемых через плагины
    add_filter('style_loader_tag', 'pss_remove_type_attr', 10, 2);
    add_filter('script_loader_tag', 'pss_remove_type_attr', 10, 2);
    function pss_remove_type_attr($tag, $handle) {
        return preg_replace( "/type=['\"]text\/(javascript|css)['\"]/", '', $tag );
    }
}
6 нояб. 2018 г. 21:31:59
1
add_action('wp_loaded', 'prefix_output_buffer_start');
function prefix_output_buffer_start() { 
    ob_start("prefix_output_callback"); // Запускаем буферизацию вывода с callback-функцией
}

add_action('shutdown', 'prefix_output_buffer_end');
function prefix_output_buffer_end() { 
    ob_end_flush(); // Завершаем буферизацию и выводим содержимое
}

function prefix_output_callback($buffer) {
    // Удаляем атрибуты type="text/javascript" и type="text/css" из HTML
    return preg_replace( "%[ ]type=[\'\"]text\/(javascript|css)[\'\"]%", '', $buffer );
}
1 мая 2019 г. 12:42:34
Комментарии

Добро пожаловать на WPSE, Дживан. Это полезно, если вы включаете объяснение в свой ответ о том, почему это решает проблему и как это работает.

butlerblog butlerblog
1 мая 2019 г. 14:28:03
1

Вы можете использовать приведенные ниже функции для удаления атрибутов type из тегов link и script.

Вставьте следующую функцию в functions.php для удаления атрибута type='text/css' из тегов link

/* Удаляет атрибут " 'type=text/css' " из стилей */
function wpse51581_hide_type($src) {
    return str_replace("type='text/css'", '', $src);
}
add_filter('style_loader_tag', 'wpse51581_hide_type');

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

Вставьте следующую функцию в functions.php для удаления атрибута type='text/javascript' из тегов script

// Удаляет атрибут type из тегов script и style
add_filter('script_loader_tag', 'codeless_remove_type_attr', 10, 2);
function codeless_remove_type_attr($tag, $handle) {
    return preg_replace( "/type=['\"]text\/(javascript|css)['\"]/", '', $tag );
}
28 нояб. 2019 г. 14:30:52
Комментарии

ответ правильный, но кто-то всё равно поставил минус

Infoconic Technologies Infoconic Technologies
29 нояб. 2019 г. 23:36:26
0

Ну, потому что я перепробовал кучу других кодов и тех, что упомянуты здесь, но следы text/javascript все равно остаются в файлах ядра WordPress, а также в других плагинах и встроенных javascript-кодах. После тестирования этого кода проблема была полностью решена:

// Удаление предупреждения валидатора w3 касательно "text/javascript"
add_action('wp_loaded', 'prefix_output_buffer_start');
function prefix_output_buffer_start() { 
    ob_start("prefix_output_callback"); 
}
add_action('shutdown', 'prefix_output_buffer_end');
function prefix_output_buffer_end() { 
    ob_end_flush(); 
}
function prefix_output_callback($buffer) {
    return preg_replace( "%[ ]type=[\'\"]text\/(javascript|css)[\'\"]%", '', $buffer );
}

Надеюсь, это кому-то поможет :)

Спасибо

6 дек. 2019 г. 01:13:13
0
-1

Если вы столкнулись с этой проблемой в WP Fastest Cache, вы можете вручную удалить атрибут type в PHP-скрипте плагина. Этот метод должен работать и с другими плагинами, но я не знаю точных файлов, где они добавляют атрибут type. Для WP Fastest Cache вам нужно перейти в папку wp-content/plugins/wp-fastest-cache/inc и открыть файл js-utilities.php, затем найти text/javascript и удалить его вместе с атрибутом. У меня было это предупреждение в W3 Validator, и я исправил его таким способом. Также учтите, что при обновлении плагина это изменение может быть отменено. Чтобы отключить обновления плагина, вы можете отредактировать wpFastestCache и изменить версию плагина на что-то вроде 10.0.8.7.7.

19 мар. 2018 г. 00:07:01
0
-1

Вы можете оптимизировать HTML-код вашего сайта по своему усмотрению в 2 шага:

  • Установите этот плагин: https://wordpress.org/plugins/autoptimize/
  • Включите в настройках плагина опцию 'Optimize HTML Code?'
  • В файле functions.php вашей текущей темы WordPress добавьте следующий код:

    add_filter('autoptimize_html_after_minify', function($content) {

        $site_url = 'https://bulk-editor.com';    
        $content = str_replace("type='text/javascript'", ' ', $content);
        $content = str_replace('type="text/javascript"', ' ', $content);
    
        $content = str_replace("type='text/css'", ' ', $content);
        $content = str_replace('type="text/css"', ' ', $content);
    
        $content = str_replace($site_url . '/wp-includes/js', '/wp-includes/js', $content);
        $content = str_replace($site_url . '/wp-content/cache/autoptimize', '/wp-content/cache/autoptimize', $content);
        $content = str_replace($site_url . '/wp-content/themes/', '/wp-content/themes/', $content);
        $content = str_replace($site_url . '/wp-content/uploads/', '/wp-content/uploads/', $content);
        $content = str_replace($site_url . '/wp-content/plugins/', '/wp-content/plugins/', $content);    
        return $content;    }, 10, 1);
    

    и не забудьте заменить $site_url на ссылку вашего сайта без слеша в конце

10 мая 2018 г. 14:54:39