Curățarea tag-urilor script

27 apr. 2012, 17:46:37
Vizualizări: 1.18K
Voturi: 2

Vreau să curăț tag-urile <script> generate de WordPress pentru a obține un output mai semantic pentru HTML5.

Acest lucru poate fi făcut deja pentru tag-urile <style> folosind acest cod atașat la filtrul style_loader_tag:

//curăță tag-urile default de stil WordPress
add_filter('style_loader_tag', 'clean_style_tag');

function clean_style_tag($input) {
    preg_match_all("!<link rel='stylesheet'\s?(id='[^']+')?\s+href='(.*)' type='text/css' media='(.*)' />!", $input, $matches);

    //afișează media doar dacă este print
    $media = $matches[3][0] === 'print' ? ' media="print"' : '';                                                                             
    return '<link rel="stylesheet" href="' . $matches[2][0] . '"' . $media . '>' . "\n";
}

Dar nu există încă un echivalent script_loader_tag în nucleu. Această funcționalitate a fost propusă în trecut, dar deocamdată avem nevoie de o soluție alternativă.

Am început să investighez în /wp-includes/class.wp-scripts.php la function do_item( $handle, $group = false ) în jurul liniei 79 care conține output-ul pentru script (mai exact liniile 117-120), dar am dificultăți în a găsi un filtru potrivit care ar putea fi utilizat aici.

2
Comentarii

Ce anume încerci să faci aici? Din codul tău, se pare că vrei să transformi lucruri precum <link rel="stylesheet" id="1234" href="http://site.url/style.css" type="text/css" media="screen" /> în <link rel="stylesheet" href="http://site.url/style.css" media="screen" />. Deci... să elimini atributele precum "id" și "type". Este corect? Dacă da... de ce?

EAMann EAMann
27 apr. 2012 18:22:10

Salut @EAMann - da, vreau să curăț etichetele script așa cum s-a făcut pentru etichetele link - astfel încât rezultatul să fie <script src="source_url"></script>. Pentru a răspunde la întrebarea ta "de ce?", este pentru a produce un output mai semantic pentru HTML5 (nu avem nevoie de acele atribute, așa că sunt inutile de păstrat). Acel ticket de bug WP pe care l-am menționat exprimă aceeași opinie pe care o am și eu despre asta (care din păcate nu este încă implementată), așa că caut o soluție temporară posibilă. Mulțumesc.

Zach Zach
27 apr. 2012 18:46:18
Toate răspunsurile la întrebare 2
2

Dacă chiar vrei să faci asta, atunci ar trebui să fie deja posibil.

global $wp_scripts este o instanță a clasei WP_Scripts, care la rândul ei este o instanță a clasei WP_Dependencies.

Deci, teoretic (netestat), ar trebui să poți face ceva de genul:

function alter_script_tags()
{
    echo '<pre>';
        print $GLOBALS['wp_scripts']->print_html;
    echo '</pre>';
}
add_action( 'wp_enqueue_scripts', 'alter_script_tags', 999999 );

Acesta este doar un schiță aproximativă, dar ar trebui să înțelegi ideea.

27 apr. 2012 19:20:17
Comentarii

Se pare că aceasta a fost încercată acum ceva timp https://github.com/retlehs/roots/blob/6492fe93187c79a9a8b0bce9fb006fb2f3aa75cc/inc/roots-scripts.php și îmi amintesc că am testat această soluție și am întâmpinat câteva probleme - voi continua să cercetez acest subiect. Mulțumesc.

Zach Zach
27 apr. 2012 22:20:26

@Zach Ehm, unde vezi print_html acolo? Codul la care ai dat link nu are nicio legătură cu ceea ce am scris mai sus. Ceea ce sugerez este să interceptați variabila $print_html care conține output-ul, deoarece aceasta este singura posibilitate de a modifica ceva cu adevărat, în loc să o înlocuiți (și astfel să rămâneți compatibil cu pluginuri și teme). Apropo: Dacă apreciați, aș aprecia să primiți un vot pozitiv.

kaiser kaiser
28 apr. 2012 11:47:09
0

Nu sunteți sigur de compatibilitatea cu versiunea WP, dar este preluat din modulul Soil plugin clean-up.php pentru Roots. Folosiți în functions.php al temei sau similar.

function clean_script_tag($input) {
  $input = str_replace("type='text/javascript' ", '', $input);
  return str_replace("'", '"', $input);
}
add_filter('script_loader_tag', 'clean_script_tag');
30 apr. 2015 13:28:13