> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwairy.co/llms.txt
> Use this file to discover all available pages before exploring further.

# WordPress

> Installez le tracker PHP généré par Qwairy dans WordPress, protégez sa clé et vérifiez les requêtes de crawlers éligibles.

Utilisez le collecteur WordPress lorsque PHP traite les requêtes des pages suivies et qu’aucun connecteur géré de flux de logs n’est sélectionné. Le tracker généré signale les requêtes de pages HTML éligibles via le point d’ingestion HTTP générique.

<Warning>
  Les caches de pages complètes et les CDN peuvent servir une réponse sans exécuter WordPress ni PHP. Ces requêtes ne peuvent pas être observées par cette recette. Utilisez un collecteur edge ou un collecteur de logs géré lorsque le trafic à mesurer contourne PHP.
</Warning>

## Avant de commencer

Il vous faut :

* un accès à **Measure > Analytics des crawlers > Paramètres** pour la marque ;
* PHP 7.4 ou plus récent avec l’extension cURL activée ;
* un accès au répertoire du thème actif et à `functions.php` ;
* un accès HTTPS sortant depuis PHP vers `https://www.qwairy.co` ;
* un mécanisme de secrets côté serveur ou une configuration exclue du gestionnaire de code source.

Les mises à jour du thème peuvent remplacer les fichiers personnalisés. Documentez l’installation ou utilisez votre processus habituel de déploiement d’un thème enfant. N’activez qu’une seule source de livraison Analytics des crawlers pour la marque.

## Créer et protéger la clé

1. Dans les paramètres d’Analytics des crawlers, sélectionnez **WordPress**.
2. Sélectionnez **Créer une clé**.
3. Saisissez un nom descriptif et le fuseau horaire IANA utilisé pour les analytics quotidiennes.
4. Copiez le secret en clair lorsqu’il apparaît. Qwairy n’en affiche ensuite que le préfixe.
5. Conservez-le dans la configuration côté serveur. Ne le commitez pas dans le thème, ne l’exposez pas à JavaScript, ne le placez pas dans une URL et ne l’écrivez pas dans des logs.

WordPress utilise le contrat du fournisseur HTTP générique. Son point de terminaison est `https://www.qwairy.co/api/v1/logs/ingest`.

## Ajouter le tracker généré

Créez `qwairy-tracker.php` dans le répertoire du thème actif avec la recette générée actuelle :

```php theme={null}
<?php
/**
 * Qwairy Crawler Analytics - PHP Tracker
 *
 * WordPress: Add to functions.php:
 *   require_once get_template_directory() . '/qwairy-tracker.php';
 *   qwairy_init('YOUR_API_KEY');
 *
 * Generic PHP: Include at top of index.php:
 *   require_once 'qwairy-tracker.php';
 *   qwairy_init('YOUR_API_KEY');
 */

function qwairy_init($api_key, $options = []) {
    if (empty($api_key)) return;

    $defaults = ['endpoint' => 'https://www.qwairy.co/api/v1/logs/ingest', 'async' => true];
    $options = array_merge($defaults, $options);

    register_shutdown_function(function() use ($api_key, $options) {
        qwairy_send_log($api_key, $options);
    });
}

function qwairy_send_log($api_key, $options) {
    if ($_SERVER['REQUEST_METHOD'] !== 'GET') return;
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    if (!preg_match('/(?:^|[^a-z0-9_-])(?:Claude-SearchBot|MistralAI-Index|OAI-SearchBot|PerplexityBot|ChatGPT-User|Google-GeminiNotebook|Google-NotebookLM|Google-Agent|MistralAI-User|Perplexity-User|Claude-User|Google-CloudVertexBot|ClaudeBot|GPTBot|GrokBot|meta-webindexer|Amzn-User|Meta-ExternalFetcher|AI2Bot|Ai2Bot-Dolma|Amazonbot|Bytespider|CCBot|Meta-ExternalAgent|DuckAssistBot|KimiBot|Kimi-SearchBot|YouBot|Kimi-User|Diffbot|Kangaroo Bot|omgili|omgilibot|PanguBot|Timpibot|Webzio-Extended)(?=$|[^a-z0-9_-])/i', $user_agent)) return;

    $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) ?: '/';
    if (preg_match('/\.(png|jpe?g|gif|svg|webp|ico|mp4|webm|css|js|json|xml|woff2?|ttf|eot|map)$/i', $path)) return;

    $ignore_paths = ['/wp-admin/', '/wp-json/', '/api/', '/admin/'];
    foreach ($ignore_paths as $ignore) {
        if (strpos($path, $ignore) === 0) return;
    }

    $content_type = '';
    foreach (headers_list() as $header) {
        if (stripos($header, 'content-type:') === 0) {
            $content_type = trim(substr($header, 13));
            break;
        }
    }
    if ($content_type && strpos($content_type, 'text/html') === false) return;

    $log = [
        'status_code' => http_response_code() ?: 200,
        'request_method' => $_SERVER['REQUEST_METHOD'],
        'request_path' => $path,
        'hostname' => $_SERVER['HTTP_HOST'] ?? null,
        'user_agent' => $user_agent,
        'timestamp' => gmdate('c'),
    ];

    if (function_exists('curl_init')) {
        $ch = curl_init($options['endpoint']);
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($log),
            CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-API-Key: ' . $api_key],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 5,
        ]);
        curl_exec($ch);
        curl_close($ch);
    }
}
```

Ajoutez l’extrait de configuration à `functions.php` :

```php theme={null}
<?php
require_once get_template_directory() . '/qwairy-tracker.php';
qwairy_init('YOUR_API_KEY');
```

Si `functions.php` commence déjà par `<?php`, ajoutez seulement les deux instructions, sans insérer une seconde balise d’ouverture.

`YOUR_API_KEY` est un espace réservé. Remplacez-le uniquement au moment du déploiement par la valeur côté serveur. Si votre hébergeur expose les secrets à PHP sous forme de variables d’environnement, gardez la valeur hors du code du thème :

```php theme={null}
<?php
require_once get_template_directory() . '/qwairy-tracker.php';

$qwairy_api_key = getenv('QWAIRY_API_KEY');
if (is_string($qwairy_api_key) && $qwairy_api_key !== '') {
    qwairy_init($qwairy_api_key);
}
```

N’initialisez pas le tracker deux fois. Les noms de fonctions générés sont globaux : vérifiez qu’aucun autre plugin ni fichier du thème ne définit `qwairy_init` ou `qwairy_send_log`.

## Vérifier la livraison

Utilisez une page HTML non mise en cache et remplacez le nom d’hôte d’exemple. Le tracker accepte `GET`, pas `HEAD`. Cette requête synthétique crée une observation de crawler dans le jour analytique en cours :

```bash theme={null}
curl --user-agent "Mozilla/5.0 (compatible; GPTBot/1.1)" \
  --output /dev/null \
  --write-out "%{http_code}\n" \
  "https://www.example.com/docs/qwairy-collector-check"
```

1. Vérifiez que la requête renvoie le statut de page attendu.
2. Vérifiez que la requête a bien été traitée par PHP, et non par un CDN ou un cache de pages complètes.
3. Dans Qwairy, attendez que le connecteur passe de l’état en attente à connecté une fois l’événement accepté intégré à un agrégat quotidien.
4. Ouvrez le jour analytique en cours et cherchez `/docs/qwairy-collector-check`.

Si la page se charge mais que le connecteur reste en attente, vérifiez l’extension cURL, l’accès HTTPS sortant, la clé, le nom d’hôte, le User-Agent, l’horodatage récent, le type de contenu et les règles de chemins ignorés.

## Limites et comportement

* Le tracker généré ne signale que les requêtes `GET` avec un User-Agent correspondant.
* Les extensions de fichiers statiques et les chemins commençant par `/wp-admin/`, `/wp-json/`, `/api/` ou `/admin/` sont ignorés.
* Une réponse avec un type de contenu explicite n’est signalée que s’il contient `text/html`.
* La livraison est un appel cURL bloquant pendant l’arrêt de PHP, avec un délai d’expiration de cinq secondes. Le tracker généré n’a pas de file de renvoi et n’examine pas la réponse de Qwairy.
* La route d’intégration accepte une rafale de 120 requêtes d’ingestion par minute. Le tracker généré ne renvoie pas les réponses au-delà de ce rythme.
* Le point de terminaison applique la validation du nom d’hôte, les exclusions de Qwairy, la classification maintenue des crawlers, une fenêtre d’arrivée tardive de 72 heures et les plafonds d’ingestion partagés.
* Les plafonds techniques partagés sont de 10 000 000 événements par intégration et par jour, et de 200 000 000 événements par équipe facturée et par jour.
* Le collecteur observe des requêtes. Il ne prouve ni l’indexation, ni l’entraînement d’un modèle, ni l’utilisation en citation.

## Renouveler ou revenir en arrière

Pour renouveler la clé, créez une clé de remplacement dans Qwairy, mettez à jour la valeur côté serveur, vérifiez une nouvelle observation acceptée, puis supprimez l’ancienne clé.

Pour retirer le tracker :

1. Supprimez l’appel `require_once` et `qwairy_init` de `functions.php`.
2. Déployez et videz les caches WordPress ou de l’hébergeur concernés.
3. Vérifiez que le site fonctionne toujours normalement et qu’aucune nouvelle observation du tracker n’arrive.
4. Supprimez `qwairy-tracker.php` et le secret côté serveur.
5. Révoquez la clé Qwairy correspondante.

Désactiver la livraison crée un trou de couverture dans les analytics. Vérifiez les alertes de continuité de livraison avant de comparer des périodes qui encadrent ce retour en arrière.

## Pages associées

* [Analytics des crawlers](/fr/documentation/measure/crawler-analytics)
* [Collecteur HTTP générique](/fr/documentation/measure/crawler-analytics/connectors/generic-http)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.