PAIEMENT SÉCURISÉ LIVRAISON 24/48 H PARRAINAGE REVENDEURS
Nos bureaux seront fermés
du 13/08/2018 au 19/08/2018

Supprimer les caractères accentués de l'url

Nous vous faisons part de notre solution (concernant la suppression des accents dans l'url).

Le but n'est pas de débattre de l'utilité ou pas de ces derniers, mais pour notre part, nous possèdions un site sous OsCommerce qui a migré sous Prestashop 1.5; il était donc hors de question de perdre tout notre référencement en mettant des caractères accentués dans l'url...

Nous avons pour principe, autant que faire se peu, de ne pas modifier le coeur de Prestashop, afin de préserver les évolutions de version. Nous optons donc pour une surcharge des fonctions existantes (override), voilà donc notre solution :

override/classes/Tools.php

	/* Surcharge pour suppressions caractères accentués URL */
	public static function str2url($str) {
		if (_PS_MB_STRING_)
			$str = mb_strtolower($str, 'utf-8');

		// Remove all non-whitelist chars.
		$str = preg_replace(array('/[^a-zA-Z0-9s':/[]-]/', '/[s':/[]-]+/', '/[ ]/', '/[/]/'),
					 array('', ' ', '-', '-'), self::replaceAccentedChars(trim($str)));

		// If it was not possible to lowercase the string with mb_strtolower, we do it after the transformations.
		// This way we lose fewer special chars.
		if (!_PS_MB_STRING_)
			$str = strtolower($str);

		return $str;
	}

	public static function replaceAccentedChars($str) {
		$patterns = array(
			/* Lowercase */
			'/[x{0105}x{00E0}x{00E1}x{00E2}x{00E3}x{00E4}x{00E5}]/u',
			'/[x{00E7}x{010D}x{0107}]/u',
			'/[x{010F}]/u',
			'/[x{00E8}x{00E9}x{00EA}x{00EB}x{011B}x{0119}]/u',
			'/[x{00EC}x{00ED}x{00EE}x{00EF}]/u',
			'/[x{0142}x{013E}x{013A}]/u',
			'/[x{00F1}x{0148}]/u',
			'/[x{00F2}x{00F3}x{00F4}x{00F5}x{00F6}x{00F8}]/u',
			'/[x{0159}x{0155}]/u',
			'/[x{015B}x{0161}]/u',
			'/[x{00DF}]/u',
			'/[x{0165}]/u',
			'/[x{00F9}x{00FA}x{00FB}x{00FC}x{016F}]/u',
			'/[x{00FD}x{00FF}]/u',
			'/[x{017C}x{017A}x{017E}]/u',
			'/[x{00E6}]/u',
			'/[x{0153}]/u',

			/* Uppercase */
			'/[x{0104}x{00C0}x{00C1}x{00C2}x{00C3}x{00C4}x{00C5}]/u',
			'/[x{00C7}x{010C}x{0106}]/u',
			'/[x{010E}]/u',
			'/[x{00C8}x{00C9}x{00CA}x{00CB}x{011A}x{0118}]/u',
			'/[x{0141}x{013D}x{0139}]/u',
			'/[x{00D1}x{0147}]/u',
			'/[x{00D3}]/u',
			'/[x{0158}x{0154}]/u',
			'/[x{015A}x{0160}]/u',
			'/[x{0164}]/u',
			'/[x{00D9}x{00DA}x{00DB}x{00DC}x{016E}]/u',
			'/[x{017B}x{0179}x{017D}]/u',
			'/[x{00C6}]/u',
			'/[x{0152}]/u');

		$replacements = array(
				'a', 'c', 'd', 'e', 'i', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'z', 'ae', 'oe',
				'a', 'c', 'd', 'e', 'i', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'z', 'ae', 'oe'
			);

		return preg_replace($patterns, $replacements, $str);
	}

et ...

La fonction suivante retraitera TOUS les link_rewrite stocké en BDD ; ceci est valable notamment dans le cas, ou vous avez commencé à entrer des données produits, catégories, CMS, etc ...

ATTENTION toutefois, nous ne savons pas comment Google et les autres moteurs de recherche vont réagir à cette suppression de caractères accentués dans les URL si ces dernières ont déjà été référencées !

override/classes/Dispatcher.php

    /* Surcharge pour suppressions caractères accentués URL si présence dans la BDD */
    public function createUrl($route_id, $id_lang = null, array $params = array(), $force_routes = false, $anchor = '')
    {    
        if (!$id_lang)
            $id_lang = Context::getContext()->language->id;
        
        if (!isset($this->routes[$id_lang][$route_id]))
        {
            $query = http_build_query($params, '', '&');
            $index_link = $this->use_routes ? '' : 'index.php';
            return ($route_id == 'index') ? $index_link.(($query) ? '?'.$query : '') : 'index.php?controller='.$route_id.(($query) ? '&'.$query : '').$anchor;
        }
        $route = $this->routes[$id_lang][$route_id];

        // Check required fields
        $query_params = isset($route['params']) ? $route['params'] : array();
        foreach ($route['keywords'] as $key => $data)
        {
            if (!$data['required'])
                continue;

            if (!array_key_exists($key, $params))
                die('Dispatcher::createUrl() miss required parameter "'.$key.'" for route "'.$route_id.'"');
            $query_params[$this->default_routes[$route_id]['keywords'][$key]['param']] = $params[$key];
        }

        // Build an url which match a route
        if ($this->use_routes || $force_routes)
        {
            $url = $route['rule'];
            $add_param = array();
            foreach ($params as $key => $value)
            {
                if (!isset($route['keywords'][$key]))
                {
                    if (!isset($this->default_routes[$route_id]['keywords'][$key]))
                        $add_param[$key] = $value;
                }
                else
                {
                    if ($params[$key])
                        $replace = $route['keywords'][$key]['prepend'].$params[$key].$route['keywords'][$key]['append'];
                    else
                        $replace = '';
                    $url = preg_replace('#{([^{}]+:)?'.$key.'(:[^{}])?}#', $replace, $url);
                }
            }
            $url = preg_replace('#{([^{}]+:)?[a-z0-9_]+?(:[^{}])?}#', '', $url);
            if (count($add_param))
                $url .= '?'.http_build_query($add_param, '', '&');
        }
        // Build a classic url index.php?controller=foo&...
        else
        {
            $add_params = array();
            foreach ($params as $key => $value)
                if (!isset($route['keywords'][$key]) && !isset($this->default_routes[$route_id]['keywords'][$key]))
                    $add_params[$key] = $value;

            if (!empty($route['controller']))
                $query_params['controller'] = $route['controller'];
            $query = http_build_query(array_merge($add_params, $query_params), '', '&');
            if ($this->multilang_activated)
                $query .= (!empty($query) ? '&' : '').'id_lang='.(int)$id_lang;
            $url = 'index.php?'.$query;
            
        }
        $url = Tools::replaceAccentedChars($url);
        return $url.$anchor;
    }

Et voilà, c'est tout ...

Publié le 26/11/2012 dans Astuces Prestashop version 1.5

COMMENTAIRES

Aucun commentaire pour le moment.

Ajouter un commentaire