¿Restringir un complemento para cargar solo su CSS y JS en páginas seleccionadas?

9

Me gustaría hacer que un complemento restrinja su carga de hojas de estilo CSS y archivos JS de JavaScript solo a aquellas páginas para las que son necesarias.

Un ejemplo para mi pregunta es el complemento Formulario de contacto 7 que he usado para crear un formulario en una página de mi sitio (la página " contactarme "). Sin embargo, agrega las siguientes líneas a CADA página / publicación en el sitio web:

<link rel='stylesheet' id='contact-form-7-css'  href='http://www.r-statistics.com/wp-content/plugins/contact-form-7/styles.css?ver=2.3.1' type='text/css' media='all' /> 

<script type='text/javascript' src='http://www.r-statistics.com/wp-content/plugins/contact-form-7/scripts.js?ver=2.3.1'></script> 

Esto me hace sospechar que este complemento está afectando el tiempo de carga de mi sitio, para una extensión que me interesa en una sola página del sitio.

Por lo tanto, mi pregunta es ¿cómo puedo eliminar estas líneas adicionales de todas las páginas, excepto la página "Contáctame" pero sin desactivar el complemento?

Tal Galili
fuente

Respuestas:

9

Los estilos y los scripts siempre están configurados por las funciones wp_enqueue_script()y wp_enqueue_style(), que deben estar vinculadas a un gancho de acción particular para que funcionen. Eché un vistazo dentro del Formulario de contacto 7, y parece que está usando etiquetas de acción wpcf7_enqueue_scriptsy wpcf7_enqueue_stylespara agregarlas a los ganchos wp_print_scriptsy wp_print_styles.

Entonces, lo que debe hacer es desenganchar los scripts y los estilos de cada página, excepto su página de contacto. La wp_headacción se dispara antes que el script y las acciones de estilo, por lo que deberá agregar algo como esto al archivo functions.php de su tema:

function remove_wpcf7_extras() {
    remove_action('wp_print_scripts', 'wpcf7_enqueue_scripts');
    remove_action('wp_print_styles', 'wpcf7_enqueue_styles');
}

if( ! is_page('contact me') ) {
    add_action('wp_head', 'remove_wpcf7_extras');
}

La función is_page () regresará truecuando esté en la página de contacto (suponiendo que el nombre sea "contácteme") ... también puede usar el slug de página y la ID de página para el filtro. En todas las demás páginas, el if()condicional agregará la función de eliminación de secuencia de comandos / estilo a la wp_headacción, que se activa justo antes de las acciones wp_print_scriptsy wp_print_styles.

Esto debería eliminar el código adicional de sus páginas, y no tendrá que desactivar el complemento ni editar ningún archivo principal. Las funciones y el código que he enumerado anteriormente tampoco harán que su tema se rompa si elimina el Formulario de contacto 7 en el futuro, ya sea ... así que no tiene que preocuparse por la compatibilidad de actualizaciones futuras.

EAMann
fuente
Hola EAMann Gran solución, ¡gracias! ¿Crees que este método podría incluirse en un complemento que verifica qué ganchos se usan y luego permite que alguien los desactive según la ubicación de la página?
Tal Galili
Desafortunadamente, hay muchos ganchos que se usan dinámicamente en WordPress. Por lo tanto, no puede detectar de manera confiable qué ganchos se están utilizando ... pero probablemente podría atrapar la mayoría de ellos de esta manera.
EAMann
Frio. me acabas de dar una idea para una nueva pregunta: wordpress.stackexchange.com/questions/698/…
Tal Galili
Para que lo sepas, también me has dado la idea de comenzar a desarrollar este complemento :-)
EAMann
3
@EAMann y @Tal Galili: en realidad puedes capturar todos los ganchos, incluso los dinámicos que usan el allgancho, ver wordpress.stackexchange.com/questions/307
MikeSchinkel