Rimuovere l'attributo type dai tag script e style aggiunti da WordPress
Attenzione: L'attributo type non è necessario per le risorse JavaScript.
Dalla riga 10, colonna 146; alla riga 10, colonna 176
feed/" /> <script type="text/javascript">window
Attenzione: L'attributo type per l'elemento style non è necessario e dovrebbe essere omesso.
Dalla riga 11, colonna 1798; alla riga 11, colonna 1820
</script> <style type="text/css">img.wp
Attenzione: L'attributo type per l'elemento style non è necessario e dovrebbe essere omesso.
Dalla riga 23, colonna 193; alla riga 23, colonna 251
a='all' /><style id='kirki-styles-global-inline-css' type='text/css'>.envel
Attenzione: L'attributo type non è necessario per le risorse JavaScript.
Dalla riga 23, colonna 905; alla riga 23, colonna 1010
}</style> <script async type="text/javascript" src="http://....../wp-content/cache/minify/df983.js"></scri
Attenzione: L'attributo type per l'elemento style non è necessario e dovrebbe essere omesso.
Dalla riga 70, colonna 126; alla riga 70, colonna 167
70.png" /><style type="text/css" id="wp-custom-css">@media
Attenzione: L'attributo type non è necessario per le risorse JavaScript.
Dalla riga 441, colonna 156; alla riga 441, colonna 261
iv></div> <script defer type="text/javascript" src="http://......./wp-content/cache/minify/26938.js"></scri
Attenzione: L'attributo type non è necessario per le risorse JavaScript.
Dalla riga 441, colonna 272; alla riga 441, colonna 302
</script> <script type='text/javascript'>/* */
Attenzione: L'attributo type non è necessario per le risorse JavaScript.
Dalla riga 443, colonna 17; alla riga 443, colonna 122
</script> <script defer type="text/javascript" src="http://......../wp-content/cache/minify/6ce07.js"></scri
Questi errori sono una nuova introduzione da parte del W3C e hanno iniziato a comparire solo negli ultimi 3-4 giorni.
Registriamo gli script in questo modo →
wp_register_script( 'custom-js', get_template_directory_uri() . '/js/custom.js', array( 'jquery' ), '1.1', true );
wp_enqueue_script( 'custom-js' );
Possiamo correggere questo problema dal metodo di enqueuing mostrato sopra?
Aggiornamento →
questi sono gli errori effettivi. Nel box rosso provengono da W3 Total Cache.

WordPress 5.3 introduce un modo considerevolmente più semplice per ottenere questo risultato. Registrando il supporto del tema per HTML 5 per script
e style
, l'attributo type=""
verrà omesso:
add_action(
'after_setup_theme',
function() {
add_theme_support( 'html5', [ 'script', 'style' ] );
}
);

Potresti specificare dove (in quale file) dovrei inserire il codice sopra?


Non rimuove il tipo dalla riga con 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>
. Questo è dovuto a https://core.trac.wordpress.org/ticket/51837

Puoi rimuovere gli attributi type='*'
e i relativi valori dagli script e stili caricati con wp_enqueue
, utilizzando i rispettivi hook *_loader_tag
.
Il seguente codice ha funzionato per me:
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 );
}

Ho provato questo, ma non ha risolto il problema. Forse abbiamo bisogno di qualche manipolazione.

Suppongo che alcuni dei tuoi script dei plugin (come quelli del plugin di cache con il tag defer
) potrebbero non utilizzare wp_enqueue_script
e quindi non userebbero *_loader_tag
. Puoi confermare che, con il mio snippet aggiunto, nel codice sorgente del tuo sito, custom.js
abbia ancora type='text/javascript'
?

No. Ho eliminato il plugin w3 total cache. 3 degli 8 errori sono scomparsi, ma ne rimangono ancora 5.

Puoi individuare l'origine dei cinque e vedere se è possibile modificare i tag. Speculo ancora che probabilmente non usano wp_enqueue
. Suggerisco di aggiungere un AGGIORNAMENTO al tuo post originale per riflettere gli ostinati 5 rimasti, con riferimenti al codice e ai plugin - potrei essere in grado di aiutare ulteriormente.

signore, il plugin W3 Total Cache. W3 ha introdotto questi avvisi dopo il 2 dicembre. Metti qualsiasi sito WP nel validatore e vedrai questi avvisi.

Ho ottenuto questo dal plugin soil / roots. Ha funzionato per la maggior parte.
add_filter( 'style_loader_tag', 'clean_style_tag' );
add_filter( 'script_loader_tag', 'clean_script_tag' );
/**
* Pulizia dell'output dei tag <link> dei fogli di stile
*/
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;
}
// Mostra il media solo se è significativo
$media = $matches[3][0] !== '' && $matches[3][0] !== 'all' ? ' media="' . $matches[3][0] . '"' : '';
return '<link rel="stylesheet" href="' . $matches[2][0] . '"' . $media . '>' . "\n";
}
/**
* Pulizia dell'output dei tag <script>
*/
function clean_script_tag( $input ) {
$input = str_replace( "type='text/javascript' ", '', $input );
return str_replace( "'", '"', $input );
}

Gli approcci style_loader_tag
e script_loader_tag
sopra menzionati sembrano funzionare per qualsiasi markup generato da WordPress, nei casi in cui il tema/plugin utilizza le funzioni di enqueue appropriate.
Se hai plugin problematici che non cooperano (se memoria non mi inganna Jetpack è/stato uno di questi, a meno che una versione più recente non abbia risolto il problema!), e sei determinato a risolvere questa questione nonostante il fatto che i tuoi visitatori difficilmente ne saranno influenzati (il loro browser renderizzerà la pagina senza problemi!), puoi sempre optare per una soluzione radicale usando l'output buffering:
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 );
}
Tieni presente che, sebbene questa sia una soluzione, non è molto efficiente. Dovrai eseguire preg_replace()
sull'intero output "finale" di WordPress prima che venga inviato al browser del client, per ogni richiesta.
L'output buffering viene attivato all'inizio (hook wp_loaded
), cioè proprio quando WordPress + tema + plugin + ecc. sono completamente caricati, e viene disattivato all'ultimo momento (hook shutdown
) che viene eseguito appena prima che PHP termini l'esecuzione. L'espressione regolare deve elaborare tutto, e potrebbero esserci molti contenuti!
Gli approcci style_loader_tag
e script_loader_tag
sopra menzionati eseguono l'espressione regolare solo su una stringa molto piccola (il tag stesso), quindi l'impatto sulle prestazioni è trascurabile.
Suppongo che se avessi contenuti relativamente statici e utilizzassi un layer di caching potresti cercare di mitigare il problema delle prestazioni.
Riferimenti dal manuale PHP:

Questa è la risposta migliore e funziona correttamente senza errori. Grazie mille.

Se qualcuno è curioso, WordPress non sembra utilizzare i filtri style_loader_tag
o script_loader_tag
quando aggiunge un tag <script>
per script inline. https://developer.wordpress.org/reference/classes/wp_scripts/print_inline_script/

Questo mi è stato molto utile:
add_filter('script_loader_tag', 'clean_script_tag');
function clean_script_tag($input) {
$input = str_replace("type='text/javascript' ", '', $input);
return str_replace("'", '"', $input);
}
Grazie a css-tricks (LeoNovais): https://css-tricks.com/forums/topic/clean-up-script-tags-in-wordpress/#post-246425

Il post specifico a cui si riferisce l'OP sopra si trova in realtà qui: https://css-tricks.com/forums/topic/clean-up-script-tags-in-wordpress/#post-246425 Nota: lo script è annerito, ma selezionando il testo è possibile leggerlo, come riportato sopra. LeoNovais non fornisce ulteriori spiegazioni. Non so perché CSS Tricks abbia annerito il suo script.

Secondo il codice in script-loader.php, l'attributo type viene omesso quando il supporto per html5 è aggiunto al tema con gli argomenti script e style.
Vedi i link qui sotto:
- https://build.trac.wordpress.org/browser/tags/5.3/wp-includes/script-loader.php#L2576
- https://build.trac.wordpress.org/browser/tags/5.3/wp-includes/script-loader.php#L2758
function yourthemeprefix_theme_supportt() {
add_theme_support(
'html5',
array(
'script', // Correzione per: L'attributo "type" non è necessario per le risorse JavaScript.
'style', // Correzione per: L'attributo "type" per l'elemento "style" non è necessario e dovrebbe essere omesso.
)
);
}
add_action( 'after_setup_theme', 'yourthemeprefix_theme_support' );

Basandosi su @realmag77. Questo codice sfrutterà il plugin Autoptimize per filtrare TUTTI gli attributi type senza rompere il sito se non è installato e attivato. Il fallback funziona bene ma gli script e i fogli di stile caricati tramite plugin non verranno filtrati. Non conosco altri modi per filtrarli se non utilizzando la parte di Autoptimize.
/* ==========================================
Rimuovi l'attributo type su JS/CSS
(richiede il plugin Autoptimize e l'opzione "Ottimizza HTML" attivata)
ma con un fallback per sicurezza
========================================== */
// Se Autoptimize è installato e attivo, rimuove gli attributi type per tutti i 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 per rimuovere gli attributi type eccetto quelli caricati tramite plugin
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 );
}
}

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

Puoi utilizzare le funzioni qui sotto per rimuovere gli attributi type dai tag link e script.
Incolla la funzione seguente in functions.php per rimuovere il type=text/css dai tag link
/* Rimuove l'attributo " 'type=text/css' " dagli stylesheet */ function wpse51581_hide_type($src) { return str_replace("type='text/css'", '', $src); } add_filter('style_loader_tag', 'wpse51581_hide_type');
===========================================================================
Incolla la funzione seguente in functions.php per rimuovere il type='text/javascript' dai tag script
//* Rimuove il type tag dagli script e 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 ); }

Bene, perché ho provato tonnellate di altri codici e quelli menzionati qui, ci sono ancora tracce di text/javascript
dai file core di WordPress e anche da altri plugin e codici javascript inline. Dopo aver testato questo codice, tutto è stato risolto:
// Rimuove l'avviso del validatore w3 riguardo "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 );
}
Spero possa aiutare qualcuno :)
Grazie

Se stai riscontrando questo problema con WP Fastest Cache, puoi eliminare manualmente l'attributo type nello script PHP del plugin. Questo metodo dovrebbe funzionare anche con altri plugin, ma non conosco i file specifici in cui aggiungono l'attributo type. Per WP Fastest Cache, devi andare nella cartella wp-content/plugins/wp-fastest-cache/inc e aprire il file js-utilities.php, poi cerca text/javascript ed eliminalo insieme all'attributo. Ho risolto così un avviso ricevuto su W3 Validator. Tieni presente che quando aggiornerai il plugin questa modifica potrebbe essere annullata. Per disabilitare gli aggiornamenti del plugin puoi modificare wpFastestCache e cambiare la versione del plugin con qualcosa tipo 10.0.8.7.7

Puoi ottimizzare il codice HTML del tuo sito come preferisci in 2 passaggi:
- Installa questo plugin: https://wordpress.org/plugins/autoptimize/
- Abilita nelle opzioni del plugin 'Ottimizza codice HTML?'
Nel file functions.php del tuo tema WordPress corrente applica il seguente codice:
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);
e non dimenticare di cambiare $site_url con il link del tuo sito senza slash alla fine
