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


15
Warning: The type attribute is unnecessary for JavaScript resources.
    From line 10, column 146; to line 10, column 176
    feed/" /> <script type="text/javascript">window

 Warning: The type attribute for the style element is not needed and should be omitted.
    From line 11, column 1798; to line 11, column 1820
    </script> <style type="text/css">img.wp

Warning: The type attribute for the style element is not needed and should be omitted.
    From line 23, column 193; to line 23, column 251
    a='all' /><style id='kirki-styles-global-inline-css' type='text/css'>.envel

Warning: The type attribute is unnecessary for JavaScript resources.
    From line 23, column 905; to line 23, column 1010
    }</style> <script async type="text/javascript" src="http://....../wp-content/cache/minify/df983.js"></scri

Warning: The type attribute for the style element is not needed and should be omitted.
    From line 70, column 126; to line 70, column 167
    70.png" /><style type="text/css" id="wp-custom-css">@media

Warning: The type attribute is unnecessary for JavaScript resources.
    From line 441, column 156; to line 441, column 261
    iv></div> <script defer type="text/javascript" src="http://......./wp-content/cache/minify/26938.js"></scri

Warning: The type attribute is unnecessary for JavaScript resources.
    From line 441, column 272; to line 441, column 302
    </script> <script type='text/javascript'>/*  */

Warning: The type attribute is unnecessary for JavaScript resources.
    From line 443, column 17; to line 443, column 122
    </script> <script defer type="text/javascript" src="http://......../wp-content/cache/minify/6ce07.js"></scri

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

Мы ставим сценарии в очередь, как это →

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

Можем ли мы это как-то исправить из описанного выше метода постановки в очередь?

Обновление →

это реальные ошибки. В красном поле идут из общего кеша W3.введите описание изображения здесь


5
валидатор W3C редко возвращается как безошибочный для сайтов Wordpress или любых популярных cms. кажется, с каждым годом становится все хуже и хуже. Валидатор (imho) следует использовать в качестве инструментов для выявления некоторых основных ошибок (например, забыть altтеги или забыть закрыть тег), но его не следует рассматривать как стандарт, как это было раньше.
Дэвид Меч

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

1
Посмотрите на script_loader_tagкрючок, вы можете сделать, str_replace()чтобы удалить их.
Дэвид Меч

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

Вы также можете проверить следующий ответ - stackoverflow.com/a/53380692/2611955
Джахирул Ислам Мамун

Ответы:


16

Вы можете удалить type='*'атрибуты и значения изwp_enqueue 'ed скриптов и стилей, используя соответствующие *_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 );
}

Я попробовал это, но это не решило проблему. Может быть, нам нужны некоторые манипуляции.
WP Intermediate

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

Нет. Я удалил плагин общего кэша w3. Ошибка 3/8 исчезла, но 5 все еще осталось.
WP Intermediate

Ну, вы можете отследить источник пяти и посмотреть, возможно ли редактировать теги. Я снова размышляю, что они, вероятно, не используют wp_enqueue. Я предлагаю добавить ОБНОВЛЕНИЕ к вашему исходному сообщению, чтобы отразить упрямые 5 левых, с ссылками на код и плагин - возможно, может помочь еще немного.
Дэвид Меч

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

12

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

add_action(
    'after_setup_theme',
    function() {
        add_theme_support( 'html5', [ 'script', 'style' ] );
    }
);

Это сработало, спасибо.
Майкл Роджерс

1
это правильный способ сделать это.
Анкит Чаухан

2
Хороший! Это должен быть принятый ответ.
Джо

3

Получил это от плагина почвы / корней. сделал работу по большей части.

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

/**
 * Clean up output of stylesheet <link> tags
 */
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;
    }
    // Only display media if it is meaningful
    $media = $matches[3][0] !== '' && $matches[3][0] !== 'all' ? ' media="' . $matches[3][0] . '"' : '';

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

/**
 * Clean up output of <script> tags
 */
function clean_script_tag( $input ) {
    $input = str_replace( "type='text/javascript' ", '', $input );

    return str_replace( "'", '"', $input );
}


3

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

Если у вас есть нарушающие работу плагины, которые не взаимодействуют (IIRC 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()весь «окончательный» вывод Wordpress до того, как он будет отправлен в браузер клиента для каждого запроса.

Выходная буферизация включается при запуске ( wp_loadedловушка), то есть сразу после полной загрузки wp + theme + plugins + и т. Д., И отключается в последний момент ( shutdownловушка), которая срабатывает непосредственно перед тем, как PHP завершает выполнение. Регулярное выражение должно работать через все , и это может быть много контента!

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

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

Справочные руководства по php:


Это лучший ответ и работает только без ошибок. Спасибо чувак.
Ивиян Стефан Стипич

Единственное рабочее решение
Тимур Гаффоров

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

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-трюкам (LeoNovais): https://css-tricks.com/forums/topic/clean-up-script-tags-in-wordpress/#post-246425


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

1

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

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

function yourthemeprefix_theme_supportt() {
    add_theme_support(
        'html5',
        array(
            'script', // Fix for: The "type" attribute is unnecessary for JavaScript resources.
            'style',  // Fix for: The "type" attribute for the "style" element is not needed and should be omitted.
        )
    );
}
add_action( 'after_setup_theme', 'yourthemeprefix_theme_support' );

0

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

/* ==========================================
   Remove type attribute on JS/CSS
   (requires Autoptimize plugin and Optimize HTML checked)
   but with fallback just in case
========================================== */

// If Autoptimize is installed and activated, remove type attributes for all 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 {

    // Fallback to remove type attributes except for those loaded through plugins
    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 );
    }
}

0
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 );
}

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

0

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

// Remove w3 validator regarding "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 );
}

Надеюсь, что это может помочь некоторым :)

Спасибо


-1

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


-1

Вы можете оптимизировать HTML-код своего сайта в два этапа:

  • Установите этот плагин: https://wordpress.org/plugins/autoptimize/
  • Включить в плагине параметры «Оптимизировать HTML-код?»
  • В functions.php вашей текущей темы WordPress примените следующий код:

    add_filter ('autoptimize_html_after_minify', функция ($ 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 ссылкой на ваш сайт без косой черты в конце


-1

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

Вставьте приведенную ниже функцию в 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

// * Удалить тег типа из скрипта и стиля
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);
}

ответ правильный, но все же кто-то проголосовал отрицательно
Infoconic
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.