Comment tester automatiquement la validité de vos liens d'affiliation avec WordPress ?

Si vous gérez un site monétisé par de l’affiliation, vous savez que les liens que proposent les brokers ou les plateformes d’affiliation ne sont pas valides éternellement pour 2 principales raisons :

  • Le site affilié change d’url ou ferme
  • Le programme d’affiliation sur la plateforme tierce est fermé ou mis en pause

Si vous n’avez que deux ou trois programmes d’affiliation ça peut se gérer manuellement, mais si vous avez comme c’est mon cas sur Sites2rencontre.fr 630 programmes avec 95 régies, ça peut vite devenir un enfer de vérifier chaque lien quotidiennement.

Comment tester automatiquement la validité de vos liens d'affiliation avec WordPress ?

Au final vous risquez un jour ou l’autre de vous rendre compte que l’un de vos produits en affiliation n’est plus correctement redirigé … plusieurs mois après l’incident.

La solution que je vous propose n’est pas parfaite mais elle vous permettra de débroussailler le travail automatiquement.

Principe du script de test des liens d’affiliation

Le principe du script est le suivant :

  • nous allons dans un premier temps tenter de récupérer la cible de notre url affilié pour la comparer à l’url classique du site
  • si les 2 urls sont différentes c’est sans doute que le lien affilié n’est plus valide
  • dans ce cas nous enverrons un mail à l’administrateur pour le tenir informé

Pour ne pas surcharger le serveur nous ne déclencherons ce script que lors de l’affichage d’une page contenant un lien affilié.

Bien évidemment vous êtes libre de stocker ces informations en base de donnée ou sous forme de fichier plat afin de créer un tableau de bord, mais nous n’irons pas jusque là dans ce court tuto.

Le stockage des informations

Partons du principe que vous stockez les informations suivantes sur votre site :

  • direct_url : l’adresse réelle du site cible
  • affilate_url : votre lien d’affiliation

Nous allons créer 2 champs complémentaires pour stocker les résultats de nos tests à venir :

  • test_redirect_date : la date à laquelle le dernier test a été effectué
  • test_redirect_validity : un drapeau permettant de savoir si le dernier test a été concluant

Comparer les racines des domaines

Afin d’éviter des sanctions de Google (qui lutte contre l’affiliation) certaines régies qui font des redirections 301 ou 302 sont allées un cran plus loin en proposant une page de vente affiliée avec un nom de domaine différent de celui du site affilié.

Concrètement cela se traduit ainsi :

  • direct_url = nom-de-domaine.com
  • affilate_url = nomdedomaine.com ou nom-de-domaine.co

Nous allons donc comparer par la suite les racines des 2 liens, soit ici nom-de-domaine

function get_root_name($domain){
        $host_names = explode(".", $domain);
        $bottom_host_name = $host_names[count($host_names)-2];
        return $bottom_host_name;
}

Oui je sais, on aurait pu utiliser la fonction PHP parse_url() plus élégante.

Concrètement : get_root_name(www1.nom-de-domaine.com) renverra nom-de-domaine

Comment retrouver le lien cible ?

Supposons que le site auquel vous êtes affilié soit direct_url = siteaffilie.fr et que la régie d’affiliation par laquelle vous passez soit affilate_url = regie.fr
Vos liens affiliés ont la plupart du temps 2 formes possibles :

  • affilate_url = siteaffilie.fr?aff=votre_ID_affilie
  • affilate_url = regie.fr?aff=votre_ID_affilie&site=siteaffilie

Lorsque le lien est de la forme regie.fr?quelque_chose l’un des 3 mécanismes suivants est utilisé pour rediriger l’utilisateur vers le site cible :

  1. Une redirection 301 ou 302
  2. Une redirection javascript
  3. Une redirection via un contrôle coté serveur sur le site de la régie

A moins d’émuler le JS avec chromium du python et autres joyeusetés, il n’est pas possible de tester simplement le 2ème type de redirection en PHP, et pour le 3ème type j’avoue ne pas savoir non plus comment faire proprement et simplement. Vos idées sur la question son les bienvenues dans les commentaires

Nous allons donc tester uniquement le 1er type de redirection, qui est fort heureusement le plus courant :

function get_redirected_domain($url){
        $furl = false;
        // on récupère les headers
        $headers = get_headers($url);
        // on teste s'il s'agit d'une redirection 301 ou 302
        if(preg_match('/^HTTP\/\d\.\d\s+(301|302)/',$headers[0])) {
                foreach($headers as $value){
                        if(substr(strtolower($value), 0, 9) == "location:") {
                                $furl = trim(substr($value, 9, strlen($value)));
                        }
                }
        }
        // Si on redirige sur le même domaine
    if (  !  strpos($furl,"://",0)) {
                return (get_root_name($url));
        // Sinon
        } else {
                $furl = ($furl) ? $furl : $url;
                $parsed_url = parse_url($furl);
                $domain=$parsed_url['host'];
                return (get_root_name($domain));
        }
}

Tester les liens et envoyer un mail en cas d’erreur

Passons maintenant à la fonction que nous intégrerons sur les pages contenant nos liens affiliés.
Mes sites étant sous WordPress vous devrez adapter le code si vous n’utilisez pas ce CMS.

function test_redirect_validity($affilate_url,$direct_url) {
        $ID = get_the_ID();
        // On rappatrie les paramètres par défaut
        if (!$affilate_url) { $affilate_url = get_post_meta($ID, 'affilate_url', true); }
        if (!$direct_url) { $direct_url = get_post_meta($ID, 'direct_url', true); }
        // On récupère la date du jour
        $today = date('Y-m-d');
        // On recupere la date du dernier test
        $test_redirect_date = get_post_meta($ID, 'test_redirect_date', true);
        if (!$test_redirect_date) { $test_redirect_date = "1970-01-01";}
        // On calcule depuis combien de jour a ete fait le dernier test
        $update_delay = ( strtotime($today) - strtotime($test_redirect_date) )/86400;
        // Si le test a été fait il y a plus de 5 jours on fait un nouveau test
        if ($update_delay > 5) {
                // On met a jour la date de test
                update_post_meta($ID, 'test_redirect_date', date ('Y-m-d'));
                // On récupère la racine de l'url non affiliee
                $direct_url_domain = parse_url($direct_url);
                $direct_url_domain = $direct_url_domain["host"];
                $direct_url_domain = get_root_name($direct_url_domain);
                // On récupère la cible de l'url affiliee
                $affiliate_url_domain = get_redirected_domain($affilate_url);
                // On fait 3 tests de comparaison avec et sans les tirets
                if (
                        ($direct_url_domain != $affiliate_url_domain)
                        && 
                        ($direct_url_domain != str_replace ("-","",$affiliate_url_domain))
                        && 
                        (str_replace("-","",$direct_url_domain) != $affiliate_url_domain)
                )
                {
                        update_post_meta($ID, 'test_redirect_validity', 0);
                        // On envoie le mail d'erreur
                        $to = get_option('admin_email');
                        $subject = "[".get_bloginfo('name')."] Lien affilie a controler : ".get_the_title($ID);
                        $message = "\r\nLien affilie a controler pour ".get_the_title($ID)." : ".get_permalink($ID);
                        $message .= "\r\nModifier le lien : ".get_site_url()."/wp-admin/post.php?post=".$ID."&action=edit";
                        $message .= "\r\n";
                        wp_mail($to, $subject, $message);
                } else {
                        update_post_meta($ID, 'test_redirect_validity', 1);
                }
        }
}

Il ne vous reste plus qu’à insérer la fonction test_redirect_validity() avec les bons paramètres dans votre template single.php ou à la rajouter dans function.php :

add_action('the_content','test_redirect_validity');

Et voilà : dès qu’un test ne fonctionnera pas vous recevrez un mail de rappel.

Le système n’est certes pas parfait mais il m’a déjà fait gagner du temps et surtout de l’argent. Si vous avez des idées pour améliorer ce mécanisme n’hésitez pas à régir dans les commentaires.

Pensez bien aussi à mettre en place des décrochages pour désactiver les mails sur les redirections non détectées.

votes
Noter cet article
S’abonner
Notifier de
guest
Commentaires
Inline Feedbacks
View all comments