WooCommerce no trae una integración nativa con el BCV. Lo más sano es separar dos cosas: la tasa de referencia que actualizas periódicamente y la forma en que muestras o guardas el precio en bolívares. Si mezclas ambas en cada request, tu tienda se vuelve frágil.
1. Guarda la API key fuera del tema
Define la key en wp-config.php
o en una variable de entorno del servidor. No la pongas en el tema ni en un plugin que se comparta por Git.
define('MONTOSVE_API_KEY', 'tu_api_key');
2. Sincroniza la tasa una vez por hora
Usa el cron de WordPress para consultar la API y guardar la tasa. No llames a la API desde cada página.
add_action('montosve_sync_rate', function (): void {
$response = wp_remote_get(
'https://api.montosve.com/v1/fx/convert?amount=1&from=USD&to=VES&market=bcv',
[
'headers' => ['X-API-Key' => MONTOSVE_API_KEY],
'timeout' => 10,
],
);
if (is_wp_error($response)) {
return;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
$rate = $body['data']['rate'] ?? null;
if (! is_numeric($rate)) {
return;
}
update_option('montosve_bcv_rate', (float) $rate, false);
update_option('montosve_bcv_rate_updated_at', time(), false);
});
add_action('init', function (): void {
if (! wp_next_scheduled('montosve_sync_rate')) {
wp_schedule_event(time(), 'hourly', 'montosve_sync_rate');
}
});
3. Opción segura: mostrar el equivalente en Bs
Si tu catálogo base está en USD, no cambies el precio guardado. Agrega el equivalente en bolívares al lado del precio original.
add_filter('woocommerce_get_price_html', function (string $price, $product): string {
$rate = (float) get_option('montosve_bcv_rate', 0);
if ($rate <= 0) {
return $price;
}
$usd = (float) $product->get_price();
if ($usd <= 0) {
return $price;
}
$bs = $usd * $rate;
return $price . ' <small class="montosve-bs">≈ Bs. '
. number_format($bs, 2, ',', '.') . '</small>';
}, 10, 2);
Esta opción no toca precios ni impuestos. Es la más segura si tu tienda cobra en USD y solo quieres dar contexto en bolívares.
4. Opción avanzada: actualizar precios guardados
Si tu tienda cobra en Bs y guardas el precio de venta en esa moneda, necesitas una referencia en USD para recalcular. Hazlo en un job programado, con backup y en staging primero.
$rate = (float) get_option('montosve_bcv_rate', 0);
if ($rate > 0) {
$products = wc_get_products([
'limit' => -1,
'status' => 'publish',
'type' => 'simple',
]);
foreach ($products as $product) {
$usd = (float) get_post_meta($product->get_id(), '_montosve_usd_price', true);
if ($usd <= 0) {
continue;
}
$product->set_regular_price((string) round($usd * $rate, 2));
$product->save();
}
}
5. Variaciones y productos variables
Para productos variables, recorre cada variación y actualiza solo las que tengan una referencia en USD:
foreach ($product->get_children() as $variationId) {
$variation = wc_get_product($variationId);
if (! $variation) {
continue;
}
$usd = (float) get_post_meta($variationId, '_montosve_usd_price', true);
if ($usd <= 0) {
continue;
}
$variation->set_regular_price((string) round($usd * $rate, 2));
$variation->save();
}
Checklist
- API key fuera del tema y de Git.
- Tasa sincronizada por cron, no en cada request.
- Timestamp visible y fallback si la API falla.
- Precio base en USD antes de actualizar precios en Bs.
- Probar en staging y hacer backup antes de tocar precios guardados.
Preguntas frecuentes
¿Debo cambiar la moneda de mi tienda a bolívares?
No necesariamente. Si tu catálogo base está en USD, puedes mantenerlo y mostrar el equivalente en Bs. Si tu tienda cobra en Bs, guarda una referencia en USD y actualiza el precio de venta con la tasa.
¿Cada cuánto debo actualizar la tasa?
Para precios de catálogo, una vez por hora suele ser suficiente. Para promociones o checkout en tiempo real, consulta la tasa al momento de la operación y muestra el timestamp.
¿Qué pasa con los productos variables?
Cada variación tiene su propio precio. Recorre las variaciones y actualiza solo las que tengan un precio base en USD; no apliques la tasa dos veces.
¿Qué hago si la API falla?
Mantén la última tasa válida con su timestamp y muestra un aviso si está vieja. No publiques un precio inventado ni un cero.