Limpiar etiquetas script

27 abr 2012, 17:46:37
Vistas: 1.18K
Votos: 2

Quiero limpiar las etiquetas <script> generadas por WordPress para producir una salida más semántica para HTML5.

Ya puedes hacer esto para etiquetas <style> usando este código adjunto al filtro style_loader_tag:

//limpiar las etiquetas de estilo predeterminadas de 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);

    //solo mostrar media si es print
    $media = $matches[3][0] === 'print' ? ' media="print"' : '';                                                                             
    return '<link rel="stylesheet" href="' . $matches[2][0] . '"' . $media . '>' . "\n";
}

Pero aún no hay un equivalente script_loader_tag en el núcleo. Fue propuesto en el pasado, pero por ahora necesitamos una solución alternativa.

He estado revisando /wp-includes/class.wp-scripts.php en la función function do_item( $handle, $group = false ) alrededor de la línea 79 que contiene la salida del script (específicamente líneas 117-120), pero estoy teniendo problemas para encontrar un filtro apropiado que pueda usarse aquí.

2
Comentarios

¿Qué es exactamente lo que estás intentando hacer aquí? Por tu código, parece que quieres convertir cosas como <link rel="stylesheet" id="1234" href="http://site.url/style.css" type="text/css" media="screen" /> en <link rel="stylesheet" href="http://site.url/style.css" media="screen" />. Es decir... eliminar atributos como "id" y "type". ¿Es esto correcto? Si es así... ¿por qué?

EAMann EAMann
27 abr 2012 18:22:10

Hola @EAMann - sí, quiero limpiar las etiquetas script como se hizo con las etiquetas link - así que el resultado sería <script src="source_url"></script>. Para responder a tu pregunta de "¿por qué?" es para producir una salida más semántica para HTML5 (no los necesitamos, así que es inútil mantenerlos). Ese ticket de error de WP que enlacé expresa la misma opinión que tengo sobre eso (que desafortunadamente aún no está implementado), así que busco una posible solución alternativa. Gracias.

Zach Zach
27 abr 2012 18:46:18
Todas las respuestas a la pregunta 2
2

Si realmente quieres hacer esto, entonces ya debería ser posible.

El global $wp_scripts es una instancia de la clase WP_Scripts, que a su vez es una instancia de la clase WP_Dependencies.

Así que en teoría (no probado), deberías poder hacer algo como esto:

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

Esto es solo un bosquejo aproximado, pero deberías captar la idea.

27 abr 2012 19:20:17
Comentarios

Parece que esto se intentó hace un tiempo https://github.com/retlehs/roots/blob/6492fe93187c79a9a8b0bce9fb006fb2f3aa75cc/inc/roots-scripts.php y recuerdo haber probado esto y encontré algunos problemas - seguiré investigando sobre esto. Gracias.

Zach Zach
27 abr 2012 22:20:26

@Zach Ehm, ¿dónde ves print_html ahí? El código que enlazaste no tiene nada que ver con lo que escribí arriba. Lo que estoy sugiriendo es que interceptes la variable $print_html que contiene la salida, ya que esta es la única posibilidad de alterar algo realmente en lugar de reemplazarlo (y por lo tanto, mantener la compatibilidad con Plugins y Temas). Por cierto: Si lo aprecias, entonces apreciaría recibir un voto positivo.

kaiser kaiser
28 abr 2012 11:47:09
0

No estoy seguro de la compatibilidad con la versión de WP, pero tomado del módulo Soil plugin clean-up.php para Roots. Usa esto en el functions.php de tu tema o similar.

// Limpia las etiquetas de script
function clean_script_tag($input) {
  // Elimina el atributo type='text/javascript'
  $input = str_replace("type='text/javascript' ", '', $input);
  // Reemplaza comillas simples por dobles
  return str_replace("'", '"', $input);
}
// Aplica el filtro a las etiquetas de script cargadas
add_filter('script_loader_tag', 'clean_script_tag');
30 abr 2015 13:28:13