¿Mejor manera de sobrescribir el CSS de un plugin?
Actualmente, uso la especificidad CSS para sobrescribir los estilos de los plugins. Prefiero esto para editar el plugin ya que causa menos dolores de cabeza cuando se actualiza.
Sería bueno si mi hoja de estilos se cargara después de los plugins, así solo tendría que ser igual de específico, no más. Esto haría que mis hojas de estilo sean mucho más limpias.
Como sugieres, el enfoque más elegante es cuando tus anulaciones de CSS se cargan después del CSS inyectado por los plugins. Esto es bastante fácil de lograr - solo necesitas asegurarte de que tu header.php
llame a wp_head()
antes de que haga referencia a tu hoja de estilos:
<head>
<!-- todo el preámbulo habitual va aquí -->
<?php wp_head(); ?>
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" />
</head>

Existen varias formas en que los plugins pueden manejar CSS.
- Mejor caso: el plugin encola el CSS y proporciona una opción para desactivarlo (desactívalo, copia el código CSS en tu hoja de estilos y listo);
- Buen caso: el plugin engancha una función que encola el estilo (desengancha la función, engancha la tuya con modificaciones si es necesario);
- Caso habitual: el plugin encola el CSS directamente. Consulta ¿Cómo desencolar un script? (se aplica también a estilos). Versión corta: habrá una función dequeue en futuras versiones de WP, por ahora se puede solucionar con
wp_deregister_*
- Mal caso: el plugin imprime el CSS entre un montón de otras cosas. Caso por caso...
En general, en mi opinión, es mejor y más fácil desactivar hojas de estilo separadas e incorporarlas en las tuyas para minimizar problemas y mejorar el rendimiento (menos archivos que cargar).

Otra forma bastante elegante es utilizar la especificidad de CSS.
Así que si el CSS del plugin dice:
div.product div.images img {
......
}
tú defines en tu CSS:
body div.product div.images img {
......
}
También puedes ver la respuesta de Michael Rader para una pregunta similar.

Guardo una copia del CSS del plugin "not willing" en la carpeta del tema y lo importo al CSS del tema añadiendo
@import url('nombre-del-plugin-css.css');
a este (reemplazando, por supuesto, el nombre del .css por el que estoy inyectando). Luego modifico la copia del CSS en la carpeta del tema y la guardo en el servidor como hago con los demás archivos. Ah, sí, a veces puede ser necesario "clavar" los IDs o clases alteradas asignándoles un "!important".
No sé si esto es lo más moderno, pero no hace daño y funciona perfectamente.

Terminé usando !important para mi CSS personalizado y eso anuló los estilos del plugin con el que estaba teniendo problemas. El desarrollador del plugin estaba usando !important en todo el CSS del plugin y por eso no podía sobrescribirlo sin usar !important.
body {
font-family: "Open Sans", Arial, sans-serif !important;
font-weight: 300 !important;
}

Para sobrescribir el CSS de un plugin que ya estaba usando especificidad y !important, utilicé el ID para sobrescribir las clases. Esto ayudó a limpiar un poco mi código. Por supuesto, tampoco es una solución perfecta ya que solo funciona cuando hay IDs asignados a los elementos además de clases.
También podrías usar selectores de atributos en teoría. Sin embargo, aún no he puesto esa teoría a prueba.

Para sobrescribir el CSS de un plugin que ya estaba utilizando especificidad y !important, usé el ID para sobrescribir las clases. Esto ayudó a limpiar un poco mi código. Por supuesto, tampoco es una solución perfecta ya que solo funciona cuando hay IDs asignados a los elementos además de las clases.
En teoría, también podrías usar selectores de atributos. Sin embargo, todavía no he puesto esa teoría a prueba.
