escrito a * mano (WordPress.WP.EnqueuedResources.NonEnqueuedScript), y así se conservan el * `id` y lo que WordPress ponga en versiones futuras. * * `substr_replace` y no `preg_replace`: en el reemplazo de una regex, un `$1` o una * barra dentro de la clave se interpretarían. * * Los atributos para plugins de caché piden que no toquen este script: * data-cfasync="false" → Cloudflare Rocket Loader * data-no-optimize="1" → LiteSpeed Cache * nowprocket → WP Rocket * ⚠️ Pendiente de comprobar en sitios reales (fase 4 del plan): si un optimizador se * come `data-api-key`, el chat no aparece y no hay ningún error que mirar. * * @param string $tag * @param string $handle * @param string $src * @return string */ public static function script_tag( $tag, $handle, $src ) { if ( self::HANDLE !== $handle ) { return $tag; } $position = strpos( $tag, ' src=' ); // Sin `src` (otro plugin rehízo la etiqueta) no hay dónde ponerlos: se devuelve // tal cual. Inventar una etiqueta aparte duplicaría el widget. if ( false === $position ) { return $tag; } $attributes = sprintf( ' data-api-key="%s" data-cfasync="false" data-no-optimize="1" nowprocket', esc_attr( (string) Doxi_Settings::get( 'api_key' ) ) ); return substr_replace( $tag, $attributes, $position, 0 ); } /** * Vacía la caché de páginas de los plugins más comunes. Sin esto, al conectar el * chat no aparece en las páginas ya cacheadas (y al desconectar sigue saliendo), * que es exactamente el «no funciona» que queremos evitar. * * Cada llamada va protegida: si ese plugin no está, no pasa nada. * ⚠️ Pendiente de comprobar en sitios reales (fase 4 del plan). */ public static function purge_page_cache() { if ( function_exists( 'rocket_clean_domain' ) ) { rocket_clean_domain(); } if ( function_exists( 'w3tc_flush_all' ) ) { w3tc_flush_all(); } if ( function_exists( 'wp_cache_clear_cache' ) ) { wp_cache_clear_cache(); } // Es el hook documentado de LiteSpeed Cache para vaciarlo todo: el nombre es // suyo, no nuestro, y por eso no lleva nuestro prefijo. do_action( 'litespeed_purge_all' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound } }