Asignar un número de versión a la hoja de estilos principal de un tema hijo
En header.php, me gusta asignar un número de versión a la hoja de estilos para que el navegador se vea forzado a actualizarla. Pero cuando trabajo con un tema hijo, su hoja de estilos no se llama explícitamente, sino que WordPress la busca automáticamente. Entonces, ¿cómo o dónde asignar un número de versión a la hoja de estilos del tema hijo?
Creo que la mejor forma de hacer esto es dejar la hoja de estilos del tema hijo (style.css) vacía con solo los comentarios necesarios (como el nombre del tema, descripción, etc., para que WordPress pueda reconocer tu tema) y luego crear otro archivo CSS en tu-carpeta-del-tema/css/main.css
Después, en functions.php puedes tener una nueva "versión" cada vez que cambies tu archivo:
function my_scripts_and_styles(){
$cache_buster = date("YmdHi", filemtime( get_stylesheet_directory() . '/css/main.css'));
wp_enqueue_style( 'main', get_stylesheet_directory_uri() . '/css/main.css', array(), $cache_buster, 'all' );
}
add_action( 'wp_enqueue_scripts', 'my_scripts_and_styles', 1);
La lógica:
Cada vez que guardas el archivo, el tiempo de modificación del archivo cambia. El nuevo tiempo se pasa a la función date para convertir el tiempo (filemtime devuelve un entero que representa el tiempo) a formato de fecha para convertirlo en una cadena con el formato deseado. En nuestro ejemplo, el tiempo se formatea con precisión de minutos. Puedes cambiarlo para rastrear incluso segundos como "YmdHis"
. Después, el nuevo tiempo de modificación del archivo se pasa como nueva versión a wp_enqueue_style
.
Referencia:

Prefiero usar la versión del tema como rompecache. Si usas $cache_buster = wp_get_theme()->get('Version')
obtendrás la versión especificada en el bloque de comentarios en style.css
. Consulta https://codex.wordpress.org/Function_Reference/wp_get_theme como referencia.

Interesante, no conocía la existencia de esta función. Pero nuevamente tienes que cambiar manualmente la versión cada vez que haces un cambio y puede ser frustrante especialmente durante el desarrollo (dados los problemas de caché). Además, estás obligado a codificar en style.css incluso si importas tu archivo main.css allí, lo cual, por cierto, no considero un buen enfoque. Más aún, si programas en SASS puede ser nuevamente difícil de mantener. Finalmente, creo que es más rápido verificar la fecha del archivo que abrir el archivo, leer los primeros comentarios y encontrar la versión (no estoy seguro si wp_get_theme()->get('Version')
funciona de esa manera).

Cierto, pero por el lado positivo obtienes un mejor control sobre tus estilos. Puedes actualizar el CSS incrementalmente y cuando estés satisfecho con el resultado, finalmente puedes incrementar la versión y "lanzarlo".

Lo que necesitas hacer es desregistrar el estilo principal por su handle y luego volver a registrarlo con tu número de versión. En este caso, el handle es style-css
.
Puedes determinar el handle que necesitas usar mirando el enlace de la hoja de estilo renderizada:
<link rel='stylesheet' id='style-css-css' href='http://site-url/wp-content/themes/child-theme/style.css?ver=4.6.1' type='text/css' media='all' />
Aquí el ID es style-css-css
lo que significa que nuestro handle es style-css
Coloca esto en el functions.php de tu child-theme:
function wpse_145141_change_style_version(){
// Primero desregistra la hoja de estilo principal
wp_deregister_style( 'style-css' );
// Luego agrégala nuevamente, usando tu número de versión personalizado
wp_register_style( 'style-css', get_stylesheet_uri(), array(), "VERSION_NUMBER" );
// Finalmente vuelve a encolarla
wp_enqueue_style( 'style-css');
}
add_action( 'wp_enqueue_scripts', 'wpse_145141_change_style_version');

Puedes actualizar la versión en la hoja de estilos del tema hijo directamente...
/*
Theme Name: Twenty Fourteen Child
Theme URI: http://example.com/twenty-fourteen-child/
Description: Tema hijo de Twenty Fourteen
Author: John Doe
Author URI: http://example.com
Template: twentyfourteen
Version: 1.1.2 <---- Actualizar aquí
*/

¿Estás seguro de que esto necesariamente eliminará cualquier hoja de estilo en caché y forzará la carga de la nueva versión, igual que cuando se añade un número de versión en header.php?

Sí, si miras el código fuente de la página verás que la cadena de consulta se actualiza a medida que cambias el número de versión dentro del style.css de tu tema hijo.

Increíble. ¿Inicié una recompensa para esta pregunta? Matt, házmelo saber, si es así, la iniciaré de nuevo y te la otorgaré. ¡Gracias!

Me doy cuenta de que solo puedo iniciar una recompensa de 100 ahora, la opción de 50 desapareció de la lista. 100 es un tercio de mi reputación, es un poco demasiado... ¡Realmente lo siento!

¿Esto todavía funciona? Para mí, cambiar la versión en el style.css del tema hijo no hace diferencia - el query string de style.css en el head sigue mostrando el número de versión de Wordpress (en este caso 4.1.1).

Depende de cómo esté configurado tu tema. Mira más abajo en la página la respuesta de @kraftner. Si tu tema está desregistrando y luego volviendo a registrar el archivo, esto no funcionará.

Volví a revisar y la versión predeterminada ahora se basa en la versión de WP. ¡Así que esta respuesta ya no es válida! (https://github.com/WordPress/WordPress/blob/0fa23c1ac2f46ab79c186f4a295648f990758636/wp-includes/class.wp-styles.php#L32)

La respuesta principal actual depende del tema, ya que requiere que el desarrollador del tema haya convertido el número de versión del tema hijo en una variable y luego lo haya añadido al style.css del hijo al ponerlo en cola. He visto esto en algunos temas, pero no en muchos. Lo siguiente funciona en cualquier tema que registre los estilos del hijo en functions.php - no funcionará con la antigua regla @import, que ya no veo mucho.
En el functions.php del tema hijo, deberías tener algo similar a esto:
// poner en cola la hoja de estilos del tema hijo
function wp_schools_enqueue_scripts() {
wp_register_style( 'childstyle', get_stylesheet_directory_uri() . '/style.css' );
wp_enqueue_style( 'childstyle' );
}
add_action( 'wp_enqueue_scripts', 'wp_schools_enqueue_scripts', 11);
Si lo cambias a lo siguiente, añadirá una marca de tiempo como número de versión cada vez que se guarde el archivo, permitiendo que cada cambio de la hoja de estilos rompa la caché local:
// poner en cola la hoja de estilos del tema hijo
function wp_schools_enqueue_scripts() {
wp_register_style(
'childstyle',
get_stylesheet_directory_uri() . '/style.css',
array(),
filemtime( get_stylesheet_directory() . '/style.css' )
);
wp_enqueue_style( 'childstyle' );
}
add_action( 'wp_enqueue_scripts', 'wp_schools_enqueue_scripts', 11);
Espero que esto ayude a alguien. Yo uso esto en cada sitio que gestiono activamente.

En lugar de usar el style.css predeterminado, normalmente uso wp_enqueue_style en el functions.php del tema hijo o en otro archivo php incluido. Así, todavía tendrías el style.css en el tema hijo con todos los detalles del tema hijo, pero luego puedes tener un archivo css separado en el tema hijo para los estilos reales del tema hijo (yo suelo poner esto en un directorio assets/css dentro del tema hijo). Esto también te permitiría establecer la versión del CSS con el cuarto parámetro. Por ejemplo:
function theme_name_child_scripts() {
wp_enqueue_style( 'style-name', get_stylesheet_directory_uri() . '/assets/css/child-style.css', array(), '1.0.0', 'screen');
}
add_action( 'wp_enqueue_scripts', 'theme_name_child_scripts' );
Puedes agregar una prioridad a la acción si no se carga en el orden correcto o trabajar con el parámetro de dependencia en wp_enqueue_style anterior:
add_action( 'wp_enqueue_scripts', 'theme_name_child_scripts', 20 );

Usa filemtime
para versionar por cambio de archivo. Desregistrar y encolar el estilo.
- Busca en el código fuente (ctrl + U) y encuentra el ID CSS del tema hijo sin "-css". Aquí es voyager-default
<link rel='stylesheet' id='voyager-default-css' href='/wp-content/themes/voyager-child-theme/style.css?1606484598' type='text/css' media='all' />
- Usa este código (fuente) pero reemplaza
'style'
por la cadena encontrada (aquí'voyager-default'
)
functions.php del tema hijo
function add_timestamp_to_childtheme_stylesheet() {
wp_dequeue_style( 'style' );
wp_deregister_style( 'style' );
wp_enqueue_style('style', get_stylesheet_uri().'?'.filemtime(get_stylesheet_directory().'/style.css'), array(), null);
}
add_action( 'wp_print_styles', 'add_timestamp_to_childtheme_stylesheet' );
