Publié le

Le négative SEO

Le SEO négatif est une pratique qui consiste à enfreindre des règle de la guideline Google afin qu’il pense que vous essayez de manipuler son index. Une fois qu’il pense cela, il met en place des mesures de rétorsion afin de vous faire passer l’envie de le refaire. Malheureusement, dans ce cas vous n’en êtes pas l’instaurateur ou vous ne pouvez pas lutter efficacement.

Les formes possibles d’attaques

Pour nuire à la crédibilité d’un site vis-à-vis des moteurs de recherche, il existe plusieurs pratiques plus ou moins onéreuses et plus ou moins efficaces. Les principales sont : Le contenu copié, un très grand nombre de backlinks, des backlinks non-pertinent, des problèmes serveur, faire croire à du contenu dupliqué sur votre site, demander d’enlever vos bon backlinks ou rediriger des urls.

Mauvais backlinks

C’est de loins l’attaque la plus fréquente. Il s’agit de générer beaucoup et de façon quasi-simultanée un très grand nombre de liens de mauvaise qualité et hors sujet. Le fermes de liens ont parfois été recyclées de cette façon. C’est malheureusement une attaque relativement facile à mettre en oeuvre si vous êtes prêt à dépenser un peu d’argent, efficace dans la durée et très sournois, car il faut parfois beaucoup de temps pour le remarquer. Pour ces raisons, c’est 9 fois sur 10 la pratique utilisée pour vous nuire. Il faut préciser que si cette attaque est très efficace sur de nouveaux sites, elle est très difficile sur des sites bien implantés et considérés comme fiable par google.

Si vous utiliser une adresse https, n’oubliez pas de régulièrement voir la liste de backlinks sur le http. Comme on utilise presque jamais cette version de la search console, il faut parfois beaucoup de temps pour s’en apercevoir.

Supprimer des bons backlinks

Comme les liens sont un facteur très important de positionnement, une attaque facile consiste à contacter en votre nom les sites qui font de bon backlink sur le vôtre afin de leur demander de les enlever. Très simple à mettre en place, cette stratégie peut s’avérer très efficace et peux coûteuse.

Contenu dupliqué

Pour créer du contenu dupliqué sur votre site, il suffit parfois d’ajouter un paramètre à votre URL. Si vous n’avez pas de balises canonical sur la page, elle peut être considérée comme dupliquée..

Redirections

Une redirection globale sur votre site depuis une URL a très mauvaise réputation ou depuis un grand nombre d’url peut également nuire à la réputation et au classement de votre site.

Copier des contenus

Copier le contenu de votre site pour faire croire à google que vous l’avez copié est assez difficile, car il doit être fait très très rapidement et le site qui le fait doit jouir d’une meilleure confiance et d’une indexions plus fréquente que vous que vous.

Ralentir le site

Ralentir les performances du serveur est plus facile, mais moins efficace et plus coûteux dans le temps. Il est aussi très facile à remarquer et entraîne une riposte plus rapide.

Comment détecter du negative SEO

Comme nous l’avons vu plus haut, la méthode la plus souvent utilisé pour nuire en référencement est de générer un nombre très élevé de liens de mauvaise qualité et complètement hors sujet vers votre site. Google pensera donc que vous trichez et vous pénalisera. L’image suivante montre un aperçu de la search console d’en client qui a reçu environ 150 liens depuis des sites chinois sans aucun rapport et de façon simultanée.

Backlinks de mauvaise qualité dans la search console

Conclusion

J’ai récemment dû faire face à une situation semblable sur un sexshop en suisse. Vraisemblablement, le leader du marché semble ne pas apprécier la concurrence et semble avoir été l’instigateur de l’attaque. Pour se relever (péniblement ou lentement), il a été nécessaire de désavouer les liens, d’acquérir de nouveaux backlinks de confiance et faire un passage sur un très grand nombre de pages afin de des-optimiser certaine requête. Même si les rédacteurs n’avaient pas l’intention de spammer certain mots, il est ressorti que la fréquence des termes principaux était trop élevée par rapport au contenu total. Après environ deux mois de travail, le niveau d’avant l’attaque a été à nouveau atteint…

Publié le

Utilisation et impact des données Structurées

Le balisage des données à l’aide des données structurées (Structured datas ou rich snippets) permet à GoogleBingYahoo de mieux interpréter les informations présentes sur les pages et les exploiter plus facilement pour ajouter parfois des extraits enrichis dans leurs résultats de recherche comme des évaluations, des adresses, gamme de prix, images, horaires et bien d’autres choses.

Pourquoi Google encourage-t-il leurs utilisations?

Google apprécie tellement l’utilisation des données structurées qu’il faut en plus de les voir comme un bon moyen d’être mieux visibles dans les serp, les considérer comme un optimisation pour le référencement. Leurs présences pour google sont importante car elle permettent améliorer la présentation des résultats dans leur moteur de recherche en améliorant le taux de clics, en présentant plus d’informations de façon condensé et améliorent la précision de leur algorithme.

L’exemple suivant est une excellant illustration de l’utilisation des données structurée dans leur SERP.

Exemple de résultat Google des données structurée

Balisage de vos données


Google fournit des outils pour vous aider à baliser correctement vos pages ou pour vous aider à créer les squelettes des données que vous allez pouvoir utiliser de façon automatisée.

Outil d’aide au balisage Google

Un des outils à disposition est leur Outil d’aide au balisage. Il permet de créer le squelette parmi une liste assez importante d’attribut. Facile à tester, il donne à la fin de l’opération le bout de code à insérer dans votre page.

Outil d’aide au balisage Google

Balisage dans Google Search Console

Vous pouvez également utiliser un outil présent dans la search console. Il permet soit de baliser une page spécifique soit de baliser toutes les pages du même type. La grande différence avec la façon précédente et que dans ce cas, si vous accepter, les données seront automatiquement transmises à Google. Il est toujours possible de modifier ou d’annuler ce balisage.

Balisage des pages depuis la search console

Microdata, RDFa et JSON-LD

Il est possible de marque vos pages à l’aide de ces trois formats et le site schema.org en donne de nombreux exemples d’implémentation. Si les notations Microdata et RDFa sont incluses dans la présentation, le format JSON-LD permet de séparer les données affichées à l’utilisateur et celles transmises au moteur ce qui a pour très grand avantage d’être entièrement défini au même endroit et en rend l’utilisation plus facile pour les programmeurs.

JSON-LD est le format recommandé par Google

Détection et contrôle du résultat dans la Search Console

Vous pouvez ici voir quelles sont les balises prises en compte par Google et remarquer d’éventuelles erreurs. Il faut tout de même préciser qu’ils vous faudra attendre plusieurs jours pour voir vos nouveaux marquages apparaître dans cette page. Il est donc indispensable de valider vos tags avec leur outil de test

Aperçu des données structurées dans la search console
Publié le

Utilisation de Chrome pour l’analyse seo

Google Chrome est plus qu’un simple navigateur, à l’aide de sa barre d’outils pour développeur (F12), il est un véritable allié pour améliorer la qualité de votre développement et permet de tester si votre site est responsive, de changer les CSS en live et bien d’autres choses.

Affichage des css inutiles

La barre d’outils pour développeur de google chrome est un outils très pratique pour de nombreuses choses et quasi-indispensable pour découvrir les balises css inutiles sur vos pages. L’analyse de cette donnée permettra de réduire la taille de vos fichiers CSS soit en enlevant les balises inutiles soit en vous aidant à diviser vos css et à les personnaliser en fonction du type de page (catégories, produits, espace membre) que vous affichez. 

La taille de la page et le nombre d’information inutile à télécharger en plus de faire varier le temps de téléchargement, font partie des critères de qualité des algorithmes des moteurs de recherche.

Ce n’est évidemment pas un des critères principaux mais lorsque vous commencez à vouloir aller dans le détail, vous devrez en tenir compte.

Pour trouver les css inutiles sur votre page, Cliquez F12, sélectionner l’onglet Audit et lancer l’analyse. Vous aurez ensuite accès à la liste des CSS inutile pour la page courante.

Identifier les balises css inutiles

Définir le protocol HTTP utilisé et aperçu du Waterfall

Chrome permet également d’avoir un aperçu du waterfall de chargement, du temps de chargement de la page et de trouver quel est le protocole utilisé par le serveur. Je profite de l’exemple pour vous montrer les différences entre le chargement d’une page sur un serveur équipé du HTTP2 et le chargement sur un serveur classique munis du protocole HTTP 1.1.

Si la colonne protocole n’est pas visible, ajoutez-là en cliquant sur une en-tête de colonne avec le bouton droite de la souris. Vous pourrez ajouter de nouvelles informations.

L’exemple suivant vous montre donc les avantages de l’utilisation du protocole HTTP2.

Waterfall et détection du protocole HTTP / HTTP2

Contrôle du cache-control des fichiers

Il est fortement recommandé de définir dans le .htaccess des durées de validité et d’expiration d’expiration pour les fichiers afin de limiter les chargement et accélérer la vitesse d’affichage. Vous pouvez contrôler depuis chrome si ces directives sont correctement prise en compte de la façon suivante:

Contrôle des directives d’expiration du cache des fichiers

Dans l’exemple ci-dessus, les directives suivantes ont été ajouté au fichier .htaccess afin de donner des directives de cache aux navigateurs.

<ifmodule mod_expires.c="">

   AddType image/x-icon .ico
   AddType application/font-woff2  .woff2
	
    ExpiresActive on
    ExpiresByType image/jpg "access plus 3 week"
    ExpiresByType image/jpeg "access plus 3 week"
    ExpiresByType image/gif "access plus 3 week"
    ExpiresByType image/png "access plus 3 week"
	ExpiresByType application/font-woff2 "access plus 4 week" 
	ExpiresByType image/x-icon "access plus 4 week"
	ExpiresByType text/css "access 1 week"
	ExpiresByType text/javascript "access 1 week"
	ExpiresByType application/javascript "access 1 week"
	ExpiresByType text/x-javascript "access 1 week"
</ifmodule>

Trouver les ressources non-https d’un site https

Lors du passage d’une site de http à https, il arrive parfois d’oublier des ressources qui n’utilisent pas le transfert sécurisé. L’onglet Sécurity vous permet de trouver quels sont ces éléments afin de passer complètement votre site vers le nouveau protocole.

Identifier les ressources non HTTPS de la page

Tester si votre site est responsive

Google Chrome met à disposition un moyen très efficace, simple et rapide de tester votre site sur toutes les résolutions et vous assurez que vos pages sont bien responsive. Cette fenêtre vous permet soit de changer la résolution à l’aide de la souris ou de choisir de résolution prédéfinies correspondant à certains devices.

Utilisation de Chrome pour tester si le site est responsif

Contrôle des standards AMP

Comme j’en avais parlé précédemment dans mon post sur les pages amp, Chrome permet de tester si votre page respecte les standards des pages amp de la façon suivante:

Valider sa page selon les standards AMP
Publié le

Balises structurentes HTML5

Les balises sémantiques HTML5 permettent de définir clairement la fonction d’une zone de la page autant pour les browsers que pour les développeurs ou les moteurs de recherche. Elles sont utilisées par les « readers » et améliorent donc grandement l’accessibilité du site à un plus grand nombre. Elles amènent également l’avantage de définir des styles précis pour chaque zone sans avoir a ajouter d’attribut class. Html 5 apporte 6 nouvelles balises qui permettent d’affiner la structuration de vos pages

Balise Utilisation
<header> Section d’introduction de la page entière ou d’une section. Il serait préférable de lui donner un titre (h1 -> h6) mais ce n’est pas obligatoire.
Cette balise n’est pas faite pour introduire une nouvelle section
<footer> Section qui représente la fin de la page ou d’un article. Remplace le traditionnel div de fin de page et donne accès à une ne meilleure compréhension de la page. Elle est conçue pour encapsuler par exemple les informations sur l’auteur ou l’éditeur de la page ou article.
Comme le header, elle n’est pas conçue pour clore une section.
<section> Définit une section du document qui parle d’un sujet ou d’une fonctionnalité et qui peut être extraite du document général tout en gardant en sens et restant compréhensible dans son ensemble.
<article> Section de contenu dans la page qui peut être lu de façon indépendante, et même extraite du document pour par exemple un flux rss, sans pénaliser la compréhension générale. Il devrait toujours contenir un titre (Hn)
<nav> Section utile à la navigation. C’est la partie qui contient principalement les liens et idéalement des listes d’éléments.
<aside> Balise qui permet d’encapsuler une information qui n’a pas de rapport direct avec le contenu principal. Défini une section qui n’est pas indispensable à la compréhension générale de la page.
A noter qu’il est inapproprié d’utiliser cette balise pour du contenu que l’on pourrait dire ‘entre-parenthèses’.
Elle est dédiée à du contenu très peu en relation avec la page…

Exemple d’implémentation des balises sémantiques

Exemple de structuration d’une page avec les balises sémantiques HTML5

Publié le

AMP – Mise en place, astuce & impact dans google

Le projet AMP (Accelerated Mobile Pages) de google a été lancé en 2016 afin d’améliorer l’expérience utilisateur en rendant le chargement des pages plus rapide sur les mobiles. C’est une initiative qui va dans la direction Mobile First en rendant les pages plus rapides grâce à des systèmes de cache et en limitant le chargement de fichiers externes et en réduisant la taille du fichier HTML. Dans ce but, ils ont étrangement décidé de ne pas autoriser le chargement du feuille de style externe.

Si votre site est bien conçu et si vous avez des notions de PHP, la mise en place est assez rapide pour les pages classiques. Le problème principal est pour les sites utilisant du javascript.

Entête des fichiers AMP

Pour la mise en place, il suffit déjà de créer vos pages en changeant la balise HTML et les balises header de la sorte selon les exemples présent sur le site du projet amp.

<!doctype html>
<html amp lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
        <title>.....</title>
        <meta name="description" content="......."/>
        <link rel="icon"  type="image/x-icon" href="/img/favicon.ico" />
        <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
        <script async src="https://cdn.ampproject.org/v0.js"></script>

Validation des fichiers AMP

Google fournit avec son navigateur chrome un excellant moyen de contrôler la validitél du code HTML de vos pages HTML AMP. Pour afficher les erreurs il suffit d’ouvrir l’outil pour développeur en cliquant F12, et ajouter development=1 à la fin de votre url. Vous pourrez donc ainsi avoir en temps réel la validation de votre code.

Pour valider le code de votre page AMP, Cliquer F12 pour ouvrir la console du mode développeur, aller dans l’onglet console et ouvrir la page amp en ajouter #development=1 à la fin de votre url

Valider les pages AMP sous Google Chrome

Css dans les pages amp

Parmi les nombreuses balises spécifiques, une des premières que vous aurez besoin est celle qui permet d’inclure un css personnalisé, je vous met ci-dessous la façon de faire et je vous laisse allez voir le site officiel pour la suite:

<head>
...
   <style amp-custom>
      .fright{float:right}
   </style>
</head>

Comment signaler la présence de la page AMP

Une fois la version Accelerated Mobile Pages de votre page crée, il faudra tout de suite la signalée à Google afin qu’il puisse l’indexer dans son moteur. Pour ce faire, vous devez utiliser la balise de la façon suivante:

Balise dans la page AMP

Sur votre page AMP définissez dans la section head l’adresse de la version standard à l’aide de la balise canonical de la façon suivante:

<link rel="canonical" href="http://www.crabcake.ch/blog/seo-amp-page" />

Balise dans la version standard de la page

Dans votre page traditionnelle, vous devez signaler la présence d’une version mobile de votre page afin que les moteurs la trouvent plus facilement. Pour ce faire, définissez dans la section head l’adresse de la version amp à l’aide de la balise canonical de la façon suivante:

<link rel="amphtml" href="http://www.crabcake.ch/blog/seo-amp-page.amp" />

Suivit du référencement de vos pages amps

Google fournit dans la search console la liste des pages accélérées qu’il a détecté. En plus du nombre cette page permet de voir s’il y a des erreurs. Comme souvent, il faut quelque jours avant qu’un résultat soit visible.

Détection dans la search console

Je parle dans un prochain post de l’intégration de formulaires dans les pages amp. Pour voir la marche à suivre allez le lire: Formulaire dans une page amp

Publié le

Formulaire dans une page AMP

Après avoir réaliser un article sur la mise en page de pages amp, je, je vais vous montrer dans cet exemple comment mettre en place un formulaire amp-form dans vos pages. Je donne ici un exemple complet afin de gérer l’affichage et le traitement des données.
Si vous avez un des messages d’erreur ci-dessous, vous trouverez toutes les informations nécessaires pour résoudre vos problèmes.

POST ERROR STATUS 500
The tag ‘amp-form extension .js script’ is missing or incorrect, but required by ‘FORM [method=POST]’
Response must contain the AMP-Access-Control-Allow-Source-Origin header
Form submission failed: Error: Response must contain the AMP-Access-Control-Allow-Source-Origin header??? _reported_

action-xhr requiert un site un https. Vous ne pourrez donc pas mettre en place se formulaire si votre site est en HTTP

Votre route dans le fichier web.php

Route::any('frontend/sendCommentsAmp', ['as'=>'frontend/sendCommentsAmp','uses'=>'Frontend\Posts\CommentsController@sendCommentsAmp']);

Partie html / page amp

Voilà un exemple de code html pour afficher un formulaire. Si vous utiliser Laravel n’oubliez pas le token avec {{ csrf_field() }} sinon vous aurez des erreurs

/*  A include dans le section head*/
<script async custom-element="amp-form" src="https://cdn.ampproject.org/v0/amp-form-0.1.js"></script>
<script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.1.js"></script>
/*  fin de l'inclusion dans head */

<form id='form_review' class='clearboth form_review' method="POST" 
	action-xhr='<?php echo route('frontend/sendCommentsAmp');?>'
	target="_top">
	{{ csrf_field() }} /*  Sinon vous aurez une erreur*/ 
	<input type="hidden" name="idpost" value="22">
	<input type="text" name="name" id="name" value="" required>  
	<label for="txt_comment">Commentaire</label>
	<textarea name='txt_comment' id='txt_comment' rows="6" required> </textarea>                           
	<div submit-success>
		<template type="amp-mustache">
			@{{reponse}} /*  le @ permet d'échapper les { afin de ne pas avoir d'erreur avec blade*/ 
		</template>
	</div>
	<input class="btn btn-primary" type="submit" id='send_comment' value="Send"/>
</form>

Controller

Dans le controller, vous devez retourner les bon header sous peine d’avoir des erreurs.

class CommentsController extends Controller
{
    public function sendCommentsAmp(Request $request)
    {    
        $error_data=false;
        if(is_null($request->idpost) || !is_numeric($request->idpost) || is_null($request->txt_comment)
        || is_null($request->name)  ) {
            $error_data = true;
        }  
        if(!$error_data){
            $check_post = DB::table('mes_posts')->where('id',$request->idpost)->limit(1)->get();  
            if($check_post->count()==0){
                $error_data = true;
            }
        }
        if($error_data){
            $output = ['reponse' => 'Error'];
        }  else {
            /* On fait le traitement voulu*/
            $output = [ 'reponse' => 'Merci votre commentaire est en cours de validation.'];
        }
        header("Access-Control-Allow-Origin: https://cdn.ampproject.org");
        header("AMP-Access-Control-Allow-Source-Origin: https://".$_SERVER["SERVER_NAME"]);
        header("Access-Control-Expose-Headers:AMP-Access-Control-Allow-Source-Origin");
        echo json_encode($output);
        die();
    }
}
Publié le

Exemple de requêtes SQL avancées

Le but ici n’est pas de refaire la documentation de référence mais plutôt de donner d’une part quelques exemples et d’autre part de mettre en avant quelques fonctions bien utiles. 
C’est une librairie de fonctions que j’utilise fréquemment et qu’il me faut souvent copier pour ne pas faire d’erreurs.

Join: lier 2 tables sur un champ

Exemple tout simple d’un requête join qui lie 2 tables en fonction d’un champ.

$favorites = DB::table('favoris')
	->join('annonces', 'annonces.id', '=', 'favoris.idannonce')   
	->select('annonces.genre', 'favoris.*') 
	->where('favoris.iduser','=',$current_user_id)
	->whereNull('bla_bla');
	->whereNotNull('bla_bla_bla')
	->get();

Exemple d’une requête imbriquée

Exemple suivant montre comment créer une requête imbriquée en utilisant une variable pour la condition. La variable doit être passée avec le mot-clé use.

$allads = DB::table('anonnces')
	->join('anonnces_lang', function ($join)  use ($lang)  {
		$join->on('anonnces.id', '=', 'anonnces_lang.idfiche')
		->where('anonnces_lang.lang', $lang);
	})
	->select('anonnces.*', 'anonnces_lang.ville','anonnces_lang.ville_url')
	->orderBy('ville', 'asc')
	->whereNull('date_pause')
	->where('date_fin','>',date("Y-m-d H:i:s") )->get(); 

Champ calculé, raw sql

Exemple d’une requête générée par Laravel qui contient entre autres des champs calculés par le moteur de base de données.

$annonces = DB::table('annonces')
    ->select(DB::raw("annonces.id, annonces.name,
        if(`date_fin`<'".date("Y-m-d H:i:s")."',1,0) as annonce_active,
        if(`date_pause` is null,0,1) as annonce_pause
    "))
    ->where('name','like','a%')
    ->orderBy('created_at', 'asc') 
->get();

Champ calculé pour retourner un count avec un group by

Exemple d’une requête générée par Laravel qui contient entre autres des valeurs count avec un group by

$reviews = DB::table('reviews')
        ->select(DB::raw('count(*) as nb_reviews, idads'))
        ->where('status', 1)
        ->groupBy('idads')
        ->get();

$cronlog = DB::table('cron_log')
        ->select("*",DB::raw(" TIMESTAMPDIFF(SECOND,date_start,date_end) as duration"))
        ->orderBy('status','desc');

Comparer 2 champs dans une table

Dans certains cas, il est utile de comparer 2 champs dans une table. Dans mon cas, j’utilise cela pour ajouter une latence à une action. Ma cron a besoin de comparer le plus vite possible 2 champs. Pour effectuer une telle action, j’utilise la fonction whereRaw de la façon suivante:

$all = DB::table('annonces')->whereRaw('npa!=last_npa')->get();

Incrémenter, décrémenter un champ

Le système de génération de requête fournit également des méthodes pratiques pour incrémenter ou décrémenter un champ du nombre que vous désirez, et même modifier des valeurs en même temps.

//ajoute 1 au champ views
DB::table('annonces')->where('id', $idannonce)->increment('views');
//enlève 3 au champs views
DB::table('annonces')->where('id', $idannonce)->decrement('views',3);
//incrément de 1 le champs vue et ajoute la date du jour dans le champs last_view
DB::table('annonces')->where('id', $idannonce)->increment('views',1,['last_view'=>date('Y-m-d')]);
//il n'est pas possible d’incrémenter 2 champs en même temps. Pour réaliser cela, il faut faire:
DB::table('banner_pub')->where('id', 1)
   ->update([
      'view' => DB::raw('view + 1'),
      'view_day' => DB::raw('view_day + 1')
   ]);

Modifier des données avec la fonction update

//Modifier 1 champ 
DB::table('annonces')->where('id', $idannonce)->update(['ma_var' =>9]);
//Modifier plusieurs champs
DB::table('annonces')->update(['ma_var' => 0,'ma_var2'=>0]);
DB::table('annonces')->where('id', $idannonce)->update(['ma_var' => 0,'ma_var2'=>0]);
//Mettre champ a null
DB::table('annonces')->where('id',$idannonce)->update(['review_date' =>null]);

Utilisation de where, orWhere et whereIn

Les exemples suivants montrent comment utilise where ou orwhere en hiérarchisant les where. C’est compliqué a expliquer mais je pense que l’exemple suivant va vous le faire comprendre. Je montre aussi une utilisation de whereIn.

$yestrerday=date('Y-m-d H:i:s', strtotime("-1 days"));
$annonces = DB::table('annonces')
	->where('date_fin','<',$yestrerday)
	->orWhere('member_premium',1)
        ->limit(10)
	->get(); 

// Faire plusieurs OU sur des champs 
$fiches = DB::table('annonces')
->where('id',$idannonce)  
->where(function ($query) use ($iduser) {
	$query->where('iduser',$iduser)
	->orWhere('idvendeur',$iduser);
})
->get(); 
// Where avec un tableau de valeurs
$log = DB::table('log_fiche')
->whereIn('type_action', ['update', 'delete','reset'])
->get();
Publié le

Allez plus loins avec Laravel

Je regroupe ici les informations utiles qui ne nécessitent pas de créer un article dédié. Vous avez donc une liste non ordonnée de fonctions utiles et de snippets qui vous servirons dans vos développements.

1. Cacher que votre site est réalisé avec Laravel

Il est souvent utile de masquer la technologie qui a été utilisée pour la création d’un site web. Si vous voulez rendre moins facile cette détection sur votre site et cacher la technologie utilisée, un moyen basic et très simple est déjà de changer le nom de la session. 
Les projets Laravel ont comme nom de session laravel_session. Il est donc une bonne pratique de la renommer en modifiant son nom dans le fichier: config\session.php

#'cookie' => 'laravel_session',
'cookie' => 'webp_session',

Et si vous ne l’avez pas encore fait, changer le nom de l’application dans le fichier: config\app.php

#'name' => 'Laravel',
'name' => 'Web-Presence.ch',

2. Paramètre optionnel dans le fichier de routage

Il est possible d’ajouter un paramètre optionnel dans le routage en ajouter ? dans votre paramètre comme vous le montre l’exemple suivant:

Route::any('backend/event/{date?}', ['as'=> 'backend/event','uses'=>'Backend\EventController@index'])->middleware('auth');

Du côté du controller il suffit de déclarer la fonction de la manière suivante:

class EventController extends Controller
{
	public function index(Request $request,$date=null){   

		if(is_null($date)){
			$($ = date("Y-m-d");
		}

3. Cron sous Laravel

Il est très facile de mettre en place des crons sous Laravel, il faut bien évidemment le mettre dans le cron tab de votre serveur en appelant la commande suivante: artisan schedule:run

Ajout de la cron Laravel dans le crontab Ubuntu

Et ensuite ajouter les appels à fonctions dans le fichier app/Console/Kernel.php.

Vous avez de nombreuses façons de choisir à quel moment vos crons doivent être lancées. Je vous donne ci-dessous quelque exemple mais pour plus d’infos, je vous invite à vous référer à la doc officielle

class Kernel extends ConsoleKernel
{
	$schedule->call(function () {
		/* Cron éxécuté chaque heure à la 20ème et la 50ème minute  */
	})->cron('20,50 * * * *');

	$schedule->call(function () {
		/* Cron éxécuté à 9 heure et 13 heure à la 10ème, la 35ème et la 52ème minute  */
	})->cron('10,35,52 9,13 * * *');
	
	$schedule->call(function () {
		/* Cron éxécuté chaque jour à minuit  */
	})->daily();

4. Redirection des URL avec index.php

Les urls avec index.php sont valides et ne génèrent pas d’erreur. Si vous avez des balises canonical et que les chemins de vos ressources sont absolus ce n’est pas trop grave mais comme je n’aime pas cela, je vais générer des redirections depuis le fichier htacces. Le but du script ci-dessous est de rediriger les urls de la façon suivante:

http://www.crabcake.ch/blog/index.php => http://www.crabcake.ch/blog
http://www.crabcake.ch/blog/index.php/laravel-snippet-utile => http://www.crabcake.ch/blog/laravel-snippet-utile

RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index.php/?([^\ \?]*) [NC]
RewriteRule ^ %1/%2 [R=301,L]
Publié le

Gestion des emoji et émoticônes

Il est de plus en plus en vogue et apprécié des visiteurs de pouvoir insérer des émoticônes et emoji. Cela est particulièrement vrai pour les commentaires et évaluations. Comme la plupart des navigateurs gèrent bien l’affichage, il n’y a pas de raison de se priver. Les mettre en place sous Laravel est assez simple et il n’y a pas beaucoup de modifications à faire.

J’ai remarqué l’intérêt des visiteurs en constatant l’erreur suivante dans les logs.

SQLSTATE[HY000]: General error: 1366 Incorrect string value: ‘\xF0\x9F\x98\x8B’ for column ‘review’ at row 1

Après quelques recherches, j’ai constaté que ces caractères spéciaux sont des emoji inséré directement depuis un téléphone portable.

Autoriser l’ajout d’emoji

Pour permettre l’ajout, il faut modifier les champs de la base de données qui contiendront les textes ainsi que le fichier de configurations. Les champs de la base doivent avoir comme collation: utf8mb4_unicode_ci et vous devez modifier le fichier de config de la façon suivante:

//Modifier le fichier : config/database.php
'mysql' => [
'charset' => 'utf8mb4',[
'collation' => 'utf8mb4_unicode_ci',[
],

Refuser et supprimer les émoticones

Si vous désirez les supprimer, la fonction suivante permet d’enlever tous les caractères correspondant et permet d’enregistrer sans erreur.

/**
* find on https://gist.github.com/quantizer/5744907
*/
    public function removeEmoji($text) {

        $clean_text = "";

        // Match Emoticons
        $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
        $clean_text = preg_replace($regexEmoticons, '', $text);

        // Match Miscellaneous Symbols and Pictographs
        $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
        $clean_text = preg_replace($regexSymbols, '', $clean_text);

        // Match Transport And Map Symbols
        $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
        $clean_text = preg_replace($regexTransport, '', $clean_text);

        // Match Miscellaneous Symbols
        $regexMisc = '/[\x{2600}-\x{26FF}]/u';
        $clean_text = preg_replace($regexMisc, '', $clean_text);

        // Match Dingbats
        $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
        $clean_text = preg_replace($regexDingbats, '', $clean_text);

        return $clean_text;
    }
Publié le

Exemples de middlewares pour le routage

Les middlewares sont des fonctions qui permettent de relier des applications. Comme ils sont appelés à des moment bien définis, il permettent d’effectuer des traitements avant la sortie à l’écran comme vous pourrez le voir ici et aussi d’effectuer des tests de sécurité pour limiter des accès comme nous allons le voir ci-dessous.

Laravel permet de limiter l’accès à certaines pages en fonction de fonctions que vous définissez. Il suffit ensuite de le signaler dans le fichier routes/web.php en ajoutant simplement ->middleware(‘auth’); à la fin de votre route. Il est facile et particulièrement utile d’étendre ce principe à des contrôles personnalisé comme vérifier si l’utilisateur est un administrateur. Pour réaliser ce contrôle procédé comme suit:

Création du fichier

Pour créer le squelette du fichier, vous pouvez au choix copier un fichier existant ou utiliser artisan à l’aide de la commande suivante pour créer le fichier CheckAdmin.php:

php artisan make:middleware CheckAdmin

Une fois ce fichier crée (app/Http/Middleware/CheckAdmin.php), effectuez les tests que vous voulez comme limiter l’accès en fonction du type d’utilisateur.

use Closure;
use Auth;//Ajouté
use App\User;//Ajouté
use Session;//Ajouté

class CheckAdmin
{
    public function handle($request, Closure $next)
    {
        if (!Auth::check()) {
            return redirect('home');
        }
        $iduser = Auth::user()->id;//$user = User::find(1);
        $cur_user = User::find($iduser);
        if($cur_user->level<5){
            return redirect('home');
        }
        return $next($request);
    }
}

Pour qu’il soit possible de l’appeler, il faut maintenant modifier le fichier le fichier App\Http\Kernel.php en ajoutant le nouveau middleware dans le bon tableau de la façon suivante:

protected $routeMiddleware = [
	/* ... */
	'checkadmin' => \App\Http\Middleware\CheckAdmin::class,
];

Il suffit ensuite de l’appeler dans le fichier de routage web.php en ajoutant son nom.

Route::any('backend/parameters/edit/{id}', ['uses'=>'Backend\ParametersController@edit'])->where('id', '[0-9]+')->middleware('checkadmin');

Voilà, vous avez maintenant mis en place un système simple et imparable qui bloque l’accès aux pages de votre choix en fonction du niveau de l’utilisateur.