MetalAPI
XAU3 997,89−1,54 %XAG53,936−1,51 %XPT1 554,47−0,83 %XPD1 047,03−0,44 %XCU6,5080+2,29 %WTI103,27+3,82 %BRENT111,70−1,30 %EUR1,120400−0,01 %GBP1,337500−0,01 %JPY0,0063761+0,14 %CHF1,213445−0,25 %TRY0,020125−0,12 %BTC80 654,14−0,15 %ETH2 354,88−0,04 %
Tous les articles
OrPHPWordPressTutoriel

API du cours de l'or en PHP : cURL, Guzzle et shortcode WordPress

Utiliser une API du cours de l'or en PHP avec cURL ou Guzzle, puis un shortcode [gold_price] en cache dans WordPress avec transients et WP-Cron, ou un widget.

Par MetalAPI Team··7 min de lecture

API du cours de l'or en PHP : les bases

Une API du cours de l'or fournit à votre code PHP le prix actuel de l'or en JSON, pour des prix de produits, une ligne de prix dans un thème ou un rapport quotidien. Ce tutoriel couvre PHP pur avec cURL, le client HTTP Guzzle et WordPress, où un shortcode [gold_price] mis en cache et rafraîchi par WP-Cron place le prix dans n'importe quel article ou page. Il utilise MetalAPI, une API REST JSON pour les métaux précieux, les métaux industriels, l'énergie, les devises et les cryptos.

Il vous faut une clé API créée dans le tableau de bord MetalAPI. Les clés commencent par mk_live_, et le plan Free inclut 100 requêtes par mois avec des prix mis à jour quotidiennement, sans carte bancaire. Gardez la clé hors de votre code : dans une variable d'environnement pour PHP pur, ou dans wp-config.php pour WordPress.

Chaque endpoint est une requête GET sous https://metalapi.com/api/v1. Envoyez la clé dans l'en-tête X-API-Key (ou sous la forme Authorization: Bearer) plutôt que dans le paramètre de requête api_key, pour qu'elle n'apparaisse pas dans les journaux d'accès. Voici une réponse de /latest avec les valeurs d'exemple de la documentation :

GET /api/v1/latest?base=USD&currencies=XAU,EUR
{
  "success": true,
  "timestamp": 1792834892,
  "date": "2026-10-24",
  "base": "USD",
  "rates": {
    "XAU": 0.0002501319,
    "USDXAU": 3997.89,
    "EUR": 0.8925,
    "USDEUR": 1.1204
  },
  "rate_limit": { "...": "..." }
}

rates.USDXAU est le prix d'une once troy d'or en dollars ; rates.XAU en est l'inverse, des onces par dollar : ne l'affichez donc jamais comme un prix. rates.USDEUR est le prix d'un euro en dollars, que l'extension WordPress utilise pour la conversion. timestamp est l'heure des données de prix en secondes Unix.

Obtenir le cours de l'or en PHP avec cURL

L'extension cURL est fournie avec presque toutes les installations de PHP. Cette fonction envoie la clé dans un en-tête, fixe des timeouts et transforme les pannes réseau et les erreurs de l'API en exceptions :

gold.php
<?php
// PHP 8+ avec l'extension curl. Exécution : METALAPI_KEY=mk_live_... php gold.php
function metalapi(string $path, array $params = []): array
{
    $ch = curl_init('https://metalapi.com/api/v1/' . $path . '?' . http_build_query($params));
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_HTTPHEADER     => ['X-API-Key: ' . getenv('METALAPI_KEY')],
    ]);
    $body = curl_exec($ch);
    if ($body === false) {
        throw new RuntimeException('Network error: ' . curl_error($ch));
    }
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    $data = json_decode($body, true);
    if (empty($data['success'])) {
        $code = $data['error']['code'] ?? $status;
        $info = $data['error']['info'] ?? "HTTP $status";
        throw new RuntimeException("MetalAPI $code: $info", $code);
    }
    return $data;
}

$data = metalapi('latest', ['base' => 'USD', 'currencies' => 'XAU']);
printf("Gold: %.2f USD per troy oz\n", $data['rates']['USDXAU']);
printf("Time: %s UTC\n", gmdate('Y-m-d H:i', $data['timestamp']));

Avec les valeurs d'exemple, le script affiche Gold: 3997.89 USD per troy oz. Le code de l'exception est le code d'erreur de MetalAPI : réessayez 104 (la limite par minute) après le nombre de secondes indiqué par Retry-After, et 500 ou 503 avec un backoff, mais corrigez la cause des codes comme 102 (clé invalide), 105 (quota mensuel épuisé) ou 106 (endpoint non inclus dans votre plan). Le guide de gestion des erreurs liste tous les codes.

Utiliser Guzzle au lieu de cURL

Dans un projet Composer, Guzzle fait la même chose en moins de lignes. Conservez la barre oblique finale de base_uri et demandez des chemins relatifs comme latest, car Guzzle résout /latest par rapport à la racine du domaine. Désactivez aussi http_errors, pour que les réponses d'erreur renvoient le corps JSON de MetalAPI au lieu de lever une exception :

gold-guzzle.php
<?php
// composer require guzzlehttp/guzzle
require __DIR__ . '/vendor/autoload.php';

$client = new GuzzleHttp\Client([
    'base_uri'    => 'https://metalapi.com/api/v1/',
    'timeout'     => 10,
    'http_errors' => false,
    'headers'     => ['X-API-Key' => (string) getenv('METALAPI_KEY')],
]);

$res  = $client->get('latest', ['query' => ['base' => 'EUR', 'currencies' => 'XAU', 'unit' => 'gram']]);
$data = json_decode((string) $res->getBody(), true);

if (empty($data['success'])) {
    $code = $data['error']['code'] ?? $res->getStatusCode();
    throw new RuntimeException("MetalAPI $code: " . ($data['error']['info'] ?? $res->getReasonPhrase()), $code);
}
printf("Gold: %.2f EUR per gram\n", $data['rates']['EURXAU']);

Les timeouts et les autres pannes réseau lèvent toujours une ConnectException : interceptez-la partout où un échec ne doit pas casser la page.

Le cours de l'or dans WordPress : un shortcode [gold_price] avec cache

Dans WordPress, utilisez plutôt wp_remote_get(), qui fait partie de l'API HTTP intégrée. Deux règles de conception gardent le shortcode rapide et économique :

  • N'appelez pas l'API pendant le rendu d'une page. L'extension conserve les prix dans un transient que WP-Cron rafraîchit en arrière-plan. Les visiteurs ne déclenchent une requête que lorsque le transient est absent, par exemple juste après l'activation.
  • Demandez toutes les devises en un seul appel. Avec la base USD et currencies=XAU,EUR,GBP, la réponse contient le prix en dollars de l'or et de chaque devise, issus du même instantané : l'or en euros vaut donc USDXAU ÷ USDEUR, et les grammes se déduisent des 31,1034768 grammes d'une once troy. Une requête par rafraîchissement couvre toutes les devises et toutes les unités.

Les transients peuvent disparaître avant leur expiration, par exemple lorsqu'un cache d'objets persistant les évince : l'extension conserve donc aussi les derniers prix valides dans une option. Si un rafraîchissement échoue, elle journalise l'erreur et sert cette copie pendant cinq minutes. Ajoutez d'abord la clé dans wp-config.php, au-dessus de la ligne qui invite à arrêter les modifications :

wp-config.php
define( 'METALAPI_KEY', 'mk_live_your_key_here' );

Enregistrez ensuite l'extension sous wp-content/plugins/metalapi-gold-price/metalapi-gold-price.php et activez-la dans Extensions (Plugins) :

metalapi-gold-price.php
<?php
/**
 * Plugin Name:  MetalAPI Gold Price
 * Description:  Shortcode [gold_price], mis en cache dans un transient et rafraîchi par WP-Cron.
 * Requires PHP: 8.0
 */
defined( 'ABSPATH' ) || exit;

const MGP_INTERVAL   = 600;              // secondes. Standard : 600, Lite : 3600, Free : 86400
const MGP_CURRENCIES = [ 'EUR', 'GBP' ]; // en plus de USD, chaque devise utilisée par vos shortcodes
const MGP_GRAMS      = [ 'troy_oz' => 31.1034768, 'gram' => 1, 'kilogram' => 1000 ];

function mgp_refresh(): ?array {
    if ( ! defined( 'METALAPI_KEY' ) ) {
        return null;
    }
    $url  = add_query_arg(
        [ 'base' => 'USD', 'currencies' => implode( ',', [ 'XAU', ...MGP_CURRENCIES ] ) ],
        'https://metalapi.com/api/v1/latest'
    );
    $res  = wp_remote_get( $url, [ 'timeout' => 8, 'headers' => [ 'X-API-Key' => METALAPI_KEY ] ] );
    $data = is_wp_error( $res ) ? null : json_decode( wp_remote_retrieve_body( $res ), true );

    if ( empty( $data['success'] ) ) {
        error_log( 'MetalAPI refresh failed: ' . ( is_wp_error( $res ) ? $res->get_error_message() : wp_remote_retrieve_body( $res ) ) );
        $last = get_option( 'mgp_prices_last' );
        if ( $last ) {
            set_transient( 'mgp_prices', $last, 5 * MINUTE_IN_SECONDS ); // on patiente en gardant les derniers prix valides
        }
        return $last ?: null;
    }

    $per_oz = [ 'USD' => $data['rates']['USDXAU'] ];
    foreach ( MGP_CURRENCIES as $cur ) {
        if ( ! empty( $data['rates'][ "USD$cur" ] ) ) {
            $per_oz[ $cur ] = $data['rates']['USDXAU'] / $data['rates'][ "USD$cur" ];
        }
    }
    $prices = [ 'per_oz' => $per_oz, 'time' => $data['timestamp'] ];
    set_transient( 'mgp_prices', $prices, 2 * MGP_INTERVAL ); // survit à un passage cron en retard
    update_option( 'mgp_prices_last', $prices, false );       // secours si le transient est évincé
    return $prices;
}

function mgp_prices(): ?array {
    return get_transient( 'mgp_prices' ) ?: mgp_refresh();
}

add_shortcode( 'gold_price', function ( $atts ): string {
    $a    = shortcode_atts( [ 'currency' => 'USD', 'unit' => 'troy_oz', 'decimals' => 2 ], $atts, 'gold_price' );
    $cur  = strtoupper( $a['currency'] );
    $unit = strtolower( $a['unit'] );
    $p    = mgp_prices();
    if ( ! $p || ! isset( $p['per_oz'][ $cur ] ) || ! array_key_exists( $unit, MGP_GRAMS ) ) {
        return '';
    }
    $price = $p['per_oz'][ $cur ] / MGP_GRAMS['troy_oz'] * MGP_GRAMS[ $unit ];
    return sprintf(
        '<span class="gold-price">%s %s / %s</span> <small>%s</small>',
        esc_html( number_format_i18n( $price, absint( $a['decimals'] ) ) ),
        esc_html( $cur ),
        esc_html( str_replace( '_', ' ', $unit ) ),
        esc_html( wp_date( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $p['time'] ) )
    );
} );

// WP-Cron : rafraîchissement en arrière-plan une fois par intervalle.
add_filter( 'cron_schedules', function ( array $schedules ): array {
    $schedules['mgp_interval'] = [ 'interval' => MGP_INTERVAL, 'display' => 'MetalAPI refresh' ];
    return $schedules;
} );
add_action( 'mgp_refresh_event', 'mgp_refresh' );

register_activation_hook( __FILE__, function (): void {
    if ( ! wp_next_scheduled( 'mgp_refresh_event' ) ) {
        wp_schedule_event( time(), 'mgp_interval', 'mgp_refresh_event' );
    }
} );
register_deactivation_hook( __FILE__, function (): void {
    wp_clear_scheduled_hook( 'mgp_refresh_event' );
} );

Utilisez-le dans n'importe quel article, page ou bloc Code court (Shortcode) sous la forme [gold_price] ou [gold_price currency="EUR" unit="gram"]. Avec les taux d'exemple, le second affiche 114,72 EUR / gram : 3 997,89 ÷ 1,1204 donne 3 568,27 euros par once troy, et la division par 31,1034768 donne le prix au gramme. Une devise absente de MGP_CURRENCIES n'affiche rien : listez donc toutes les devises utilisées par vos shortcodes.

Rafraîchir le cours de l'or avec WP-Cron

Le hook d'activation planifie le rafraîchissement avec l'intervalle personnalisé enregistré via cron_schedules, et la désactivation le supprime. Réglez MGP_INTERVAL sur l'intervalle de mise à jour de votre plan, ou sur une durée plus longue si le quota l'exige :

PlanMGP_INTERVALRequêtes par mois de 31 joursQuota mensuel
Free (mises à jour quotidiennes)8640031100
Lite (mises à jour toutes les 30 minutes)36007441 000
Standard (mises à jour toutes les 10 minutes)6004 46410 000

WP-Cron n'est pas un vrai planificateur : il exécute les événements échus lorsque quelqu'un visite le site, si bien que sur un site peu fréquenté, un rafraîchissement peut prendre du retard ; la double durée de vie du transient et la copie stockée absorbent ce retard. Pour un horaire exact, ajoutez define( 'DISABLE_WP_CRON', true ); à wp-config.php et exécutez les événements échus depuis le cron du système avec WP-CLI :

crontab
*/10 * * * * cd /var/www/html && wp cron event run --due-now > /dev/null 2>&1

Pensez aussi au cache de pages : un cache de pages complètes stocke la sortie du shortcode avec la page, et les visiteurs voient alors le prix du moment où la page a été mise en cache. Gardez la durée de cache des pages de prix inférieure ou égale à votre intervalle de rafraîchissement.

Quand un widget sans code est le meilleur choix

Le shortcode est le bon outil lorsque le prix doit faire partie de votre HTML ou lorsque PHP a besoin du nombre, par exemple pour recalculer le prix de produits. Si vous voulez seulement afficher des prix, un widget MetalAPI est plus simple :

  • Ni clé API ni PHP. Vous créez le widget dans le tableau de bord et collez son code d'intégration dans un bloc HTML personnalisé (Custom HTML). Les modifications ultérieures des symboles ou de la mise en page ne demandent aucune intervention sur votre site.
  • Pas de quota. Les affichages de pages des widgets ne consomment pas vos requêtes mensuelles, et chaque plan inclut des widgets : 1 sur Free, 3 sur Lite et 10 sur Standard.
  • Compatible avec le cache de pages. Les prix se chargent dans une iframe : une page en cache ne les fige donc jamais.
Code d'intégration du widget
<div id="metalapi-widget-w_abc123"></div>
<script src="https://metalapi.com/js/widget.js" data-widget="w_abc123" async></script>

Si votre hébergeur supprime les balises <script>, utilisez la version iframe du code d'intégration. Ajouter un widget de prix de l'or en direct couvre l'éditeur de widgets, l'intégration dans WordPress et les limites des plans ; la page des widgets présente les mises en page.

Étapes suivantes

Créez un compte gratuit, ajoutez votre clé dans wp-config.php et installez l'extension avec MGP_INTERVAL réglé sur 86400 : un rafraîchissement quotidien utilise 31 des 100 requêtes mensuelles du plan Free. Lorsque vous avez besoin de prix plus frais, réglez l'intervalle sur celui de votre nouveau plan et comparez les plans sur la page des tarifs. Pour les backends Node.js, API du cours de l'or en JavaScript applique les mêmes principes avec Express et Next.js.

Questions fréquentes

Où stocker la clé API dans WordPress ?

Dans wp-config.php, sous forme de constante, ou dans une variable d'environnement lue à cet endroit. Jamais dans les fichiers du thème, qui finissent souvent dans Git, ni dans du JavaScript, que chaque visiteur peut lire. Les requêtes PHP n'envoient pas d'en-tête Origin ni Referer : même une clé restreinte par domaine fonctionne donc depuis le serveur.

Pourquoi le shortcode affiche-t-il le même cours de l'or tout le week-end ?

L'or au comptant ne se négocie pas du vendredi 17:00 au dimanche 17:00, heure de New York : l'API renvoie donc le dernier prix jusqu'à la réouverture des marchés. Sur le plan Free, les prix ne changent en outre qu'une fois par jour.

Combien de requêtes API l'extension va-t-elle consommer ?

Une par rafraîchissement, quel que soit le nombre de visiteurs, de pages ou de shortcodes, car un seul appel renvoie toutes les devises et les unités sont converties localement : environ 4 500 par mois avec un intervalle de 10 minutes.

Puis-je utiliser le cours de l'or dans les prix des produits WooCommerce ?

Oui. Appelez mgp_prices() depuis PHP, par exemple dans un filtre woocommerce_product_get_price, et multipliez le prix au gramme par le poids et le titre du produit. Enregistrez le cours de l'or utilisé avec chaque commande, pour que les factures ne changent pas après coup.

Ai-je besoin de cURL ou de Guzzle dans WordPress ?

Non. wp_remote_get() utilise l'API HTTP de WordPress, qui choisit un transport disponible et respecte les réglages de proxy. Réservez cURL ou Guzzle à PHP pur et aux frameworks comme Laravel ou Symfony.

Essayez avec vos propres données

Créez un compte gratuit et envoyez votre première requête en moins de deux minutes. 100 requêtes par mois, sans carte bancaire.

À lire aussi