Aide - Recherche - Membres - Calendrier
Version complète : Ultimate SEO URL : mettre les ' en - ?
Forum osCommerce-fr > Adapter OsCommerce MS2 > Contributions
DowChao
Bonjour,

Je viens d'installer avec succès la contrib Ultimate SEO URL, mais quelque chose ne me va pas dans la réécriture :

Ma catégorie "Huile d'Argan" se retrouve sous le format "../huile-dargan-c-27.html"

Comment faire pour avoir un tiret entre le d et le a, comme ceci : "/huile-d-argan-c-27.html" ?

De même, comme mes titres de produits sont très longs, pour les rendre plus esthétiques je les mets sur 2 lignes, en faisant le saut de ligne avec <br>. Sauf que ce <br> se retrouve dans l'url :
"../lotion-demaquillante-breclat-beaute-p-51.html"

Est-il possible de l'enlever, ou juste de le caler entre deux tirets ?


Merci pour votre aide.
NoZic
Bonjour,

Selon la version de SEO, un outil est prévu pour la conversion des caractères dans l'admin : "Configuration > SEO URLs > Enter specials caracters conversion" à remplir comme dans l'exemple.

Je dis selon les versions car cette fonctionnalité ne marche pas toujours très bien...
Ryu007 y a paré en changeant la fonction split() de la classe SEO dans "\catalog\includes\classes\seo.class.php" le message est dans ce post très intéressant :
[Ultimate SEO] Categorie dans l'URL, Ajouter les categories dans l'URL
Le sujet qu'il traite est intéressant aussi, tu y viendras, crois moi.

Bon courage

[EDIT] et hop coupage d'herbe sous le pied, shoprun, c'est moi pour une fois biggrin.gif
[EDIT 2] sinon pour ton br qui reste dans l'url, bah la solution est dans la fonction split aussi, un petit str_replace bien pensé devrait te le changer en tirets ou ce que tu veux.... inspire toi de celle de Ryu007 pour ce changement
shoprun
Salut

Pas d'bol, j'ai aucune solution à ton problème ... ça commence mal mrgreen.gif
Mias je te dire franchement ... il vaudrait mieux abandonner cette idée de vouloir mettre des tirets comme séparateur aussi à la place des apostrophes, etc ...


En faite SEO remplace en premier les caractères spéciaux comme les àéèçù... et supprime tout le reste, donc ne conserve que les 26 lettres de l'alphabet. C'est bien mieux ainsi, ça évite les mauvaises surprises.

Ensuite le tiret fait partie prenante des règles de réécriture qu'exploite SEO :
RewriteRule ^(.*)-p-(.*).html$ -> pour une page produit
RewriteRule ^(.*)-c-(.*).html$ -> pour une page catégories
etc ...

Vouloir changer tout ça, pour permettre les tirets c'est surement possible, mais je ne suis pas certain que le coup vaut la chandelle ...
A chaque nouvelle version/mise à jour de SEO va falloir se taper toutes les modifs, rien que ça suffit pour s'en passer.


Après il y a une réflexion à avoir, se poser la question : A quoi sert ces réécriture ?

Bien souvent on se focalise à vouloir obtenir une URL compréhensible, bien faite, lisible comme sur du papier.
Et bien là je dirait que l'on fait erreur, car si on regarde les utilisateurs lambda (les clients en faites), et bien ils en ont rien affaire de cette URL dans la barre d'adresse, mais alors rien du tout ... (ou franchement pas grand monde, pour mettre une réserve)
C'est bien souvent une lobby que l'on fait soit même, car on a un oeil averti sur ce point ...

Les règles d'écriture sont avant tout faites pour les moteurs de recherche (du moins, surtout), et les URLs dynamiques du genre :
ma_page.php?id=machin&truc=bidule causent problèmes.
Ce n'est pas du tout conforme pour stocker ces URLs dans un fichier XML (ou pour en produire), ça plante méchamment.
Créer un siteMap XML bien structuré par exemple.
Créer des flux RSS (XML encore) bien fait, bien construit aussi, etc ...

Après il y a toute une histoire sur l'unicité des pages, duplicate contente, etc ...
shoprun
Citation (NoZic @ 4 Feb 2009, 17:49) *
[EDIT] et hop coupage d'herbe sous le pied, shoprun, c'est moi pour une fois biggrin.gif
Excellent laugh.gif
C'est qu'il m'a littéralement doubler le bougre tongue.gif biggrin.gif
Phocea
Pour le BR remplace les fonctions de la classe seo.class.php avec les suivantes, il me semble qu'il n'y a pas plus à faire:

Pour les ' il y a moyens mais c'est vraiment pas la peine de t'embeter avec ca, aucune valeur ajoutée sur tes mots clefs


Code
    function get_product_name($pID){
        switch(true){
            case ($this->attributes['USE_SEO_CACHE_GLOBAL'] == 'true' && defined('PRODUCT_NAME_' . $pID)):
                $this->performance['CACHE_QUERY_SAVINGS']++;
                $return = constant('PRODUCT_NAME_' . $pID);
                $this->cache['PRODUCTS'][$pID] = $return;
                break;
            case ($this->attributes['USE_SEO_CACHE_GLOBAL'] == 'true' && isset($this->cache['PRODUCTS'][$pID])):
                $this->performance['CACHE_QUERY_SAVINGS']++;
                $return = $this->cache['PRODUCTS'][$pID];
                break;
            default:
                $this->performance['NUMBER_QUERIES']++;
                $sql = "SELECT products_name as pName
                        FROM ".TABLE_PRODUCTS_DESCRIPTION."
                        WHERE products_id='".(int)$pID."'
                        AND language_id='".(int)$this->languages_id."'
                        LIMIT 1";
                $result = $this->DB->FetchArray( $this->DB->Query( $sql ) );
                
                
                $pName = preg_replace( "/\\<.*\\>/U", " ", $result['pName']);
                $pName = $this->strip($pName);
                $this->cache['PRODUCTS'][$pID] = $pName;
                $this->performance['QUERIES']['PRODUCTS'][] = $sql;
                $return = $pName;
                break;                                
        } # end switch        
        return $return;
    } # end function



Code
/**
* Function to generate products cache entries
* @author Bobby Easland
* @version 1.0
*/    
    function generate_products_cache(){
        $this->is_cached($this->cache_file . 'products', $is_cached, $is_expired);      
        if ( !$is_cached || $is_expired ) {
        $sql = "SELECT p.products_id as id, pd.products_name as name
                FROM ".TABLE_PRODUCTS." p
                LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." pd
                ON p.products_id=pd.products_id
                AND pd.language_id='".(int)$this->languages_id."'
                WHERE p.products_status='1'";
        $product_query = $this->DB->Query( $sql );
        $prod_cache = '';
        while ($product = $this->DB->FetchArray($product_query)) {
            $pName = $product['name'];
            $pName = preg_replace( "/\\<.*\\>/U", " ", $pName);
            $pName = $this->strip($pName);
            $define = 'define(\'PRODUCT_NAME_' . $product['id'] . '\', \'' . $pName . '\');';
            $prod_cache .= $define . "\n";
            eval("$define");
        }
        $this->DB->Free($product_query);
        $this->save_cache($this->cache_file . 'products', $prod_cache, 'EVAL', 1 , 1);
        unset($prod_cache);
        } else {
            $this->get_cache($this->cache_file . 'products');        
        }
    } # end function
NoZic
Re,

Ah ouais, ça fonctionne aussi le truc de Phocea, mais je trouvais plus propre de changer la fonction strip(), ce qui reviendra strictement au même en fait, vu qu'elle est reprise dans la mise en cache.
Ca me semblait plus simple de ne rajouter qu'une ligne en fait.
Mais je peux me tromper.
Phocea
Bein honnetement strip je n'y ai jamais touché la conversion des caractères par défaut aillant toujours était suffisante et que je préfére avoir la main sur les lettres qui change.

En plus dans le cas de DowChao c'est un tag HTML qui le gène, mais on pourrait prendre la fonction de Ryu et ajouter la ligne preg_replace( "/\\<.*\\>/U", " ", $result['pName']); dedans (en adaptant). Ca devrait aussi marcher.

Pour l'apostrophe c'est un peu plus compliqué (ca touche au code de nb de lettre minimum)
DowChao
J'ai utilisé le code de Phocea, c'est nickel, plus de br, merci.

Concernant le ', si ça ne vaut pas la peine, ça restera comme ça. Mais je croyais que le but de l'URL rewriting c'était d'optimiser le référencement, et le fait d'avoir des mots clefs corrects dedans, ça doit jouer non ? Car "dargan" n'existe pas, mais "argan" oui. unsure.gif
shoprun
Citation (DowChao)
Mais je croyais que le but de l'URL rewriting c'était d'optimiser le référencement, et le fait d'avoir des mots clefs corrects dedans, ça doit jouer non ? Car "dargan" n'existe pas, mais "argan" oui. unsure.gif
Il ne faut pas confondre la "réécriture" des URLs qui est le but 1er de la contribution SEO_urls et tout ce qui touche les mots clés, etc ... dont la contribution Header_Tags est très connue pour ça, ça n'a pas grand rapport (j'ai tendance à dire : aucun).

Certes, ici ça va aider au référencement, mais le but n'est pas du tout le même.
Comme je te l'ai dis, la réécriture est plus (sinon uniquement) un mécanisme pour résoudre des problèmes purement techniques dû aux URLs produites par osC (et beaucoup d'autres Soft d'ailleurs), des incompatibilités à cause de certaines normes, pour une meilleur "portabilité".
Les fichiers XML ne supportent pas ces types d'urls (par exemple).

Les mots clés c'est une tout autre histoire, c'est directement lié au contenu d'une page Web.
Donc vouloir des tirets à la place des apostrophes dans la barre d'adresse (url) n'apportera rien de plus, n'améliora rien.
Sauf erreur blush.gif

Pour le référencement en ce qui concerne les mots clés et tout l'toutim, il faut se concentrer sur les titres, sous titres, les meta, sur le bon usage des bonnes balises pour le bon contenu, etc, etc ... bref, d'avoir du contenu pertinent (un exercice quelque peu ingrat).
NoZic
Bonsoir,

shoprun+1

Mais sinon pour ton truc avec les simple quote retouche juste la fonction strip() comme j'indiquais.

Bon, je fais le test, ok...

Bon comme je pensais ça fonctionne (et ça aurait fonctionner avec le br qui trainait aussi), le truc c'est que j'obtiens huile-argan au lieu de huile-d-argan (même avec le réglage "Filter Short Words" à 1). mais j'ai beaucoup retoucher SEO donc mon test n'est peut-être pas des plus "convenient" in english.
Mais bon ça fonctionne quand même.

Donc juste rajouter cette ligne :
Code
        $anchor = str_replace('\'', $separator, $anchor);
dans la fonction strip() de seo.class.php juste avant celle-ci (la dernière de la fonction) :
Code
        return $this->short_name($anchor); // return the short filtered name


Sinon juste mettre
Code
'=>-
dans les "specials caracters conversion" devrait fonctionner aussi (avec la fonction strip d'origine, pas celle de Ryu007).

Bon courage

Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2013 Invision Power Services, Inc.