2015-10-22 8 views
9

Ich möchte meine Produkt URLs von meinem OpenCart Webshop neu schreiben. Opencart selbst hat eine SEO-Implementierung, die wirklich nervt. Ich habe die SEO-Implementierung aktualisiert, um dasselbe Schlüsselwort für mehrere Kategorien verwenden zu können. Siehe: Opencart duplicate URL keywords Aber das funktioniert nur für die Kategorien. Für die Produkte würde ich nur eine htaccess rewrite rule brauchen, denke ich.URL Rewriting OpenCart Produkte SEO

Die ursprüngliche URL sieht wie folgt aus:

http://domain.com/index.php?route=product/product&path=25_28_93&product_id=1759

meine URL wie dies im Moment aussieht:

http://domain.com/In-Stock/Retreaded-Tires/Agricultural?product_id=1759

Wie Sie die Kategorien bereits geändert haben sehen können.

Und ich will es so sein:

http://domain.com/In-Stock/Retreaded-Tires/Agricultural/1759/1050-50R32-Mega-X-Bib

Dann für Paginierung (innerhalb einer Kategorie) habe ich diese url:

http://domain.com/index.php?route=product/category&path=36_70_67&page=2

ich das schon gemacht habe in:

http://domain.com/Tire-Retreading/Equalizing/&page=2

Aber ich würde diese

http://domain.com/Tire-Retreading/Equalizing/2

Meine .htaccess Datei sieht wie folgt sein mag:

Options +FollowSymlinks 
Options -Indexes 
<FilesMatch "(?i)((\.tpl|\.ini|\.log|(?<!robots)\.txt))"> 
Order deny,allow 
Deny from all 
</FilesMatch> 
RewriteEngine On 
RewriteBase/
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L] 
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L] 
RewriteRule ^download/(.*) /index.php?route=error/not_found [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css) 
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] 

Meine seo_url.php-Datei, die ein wenig geändert wie folgt aussieht ist:

public function index() { 
    $this->load->model('catalog/category'); 
    // Add rewrite to url class 
    if ($this->config->get('config_seo_url')) { 
     $this->url->addRewrite($this); 
    } 

    // Decode URL 
    if (isset($this->request->get['_route_'])) { 
     $parts = explode('/', $this->request->get['_route_']); 

     // remove any empty arrays from trailing 
     if (utf8_strlen(end($parts)) == 0) { 
      array_pop($parts); 
     } 

     $categories = array(); 

     for ($i = 0; $i < count($parts); $i++) { 
      $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'"); 

      if ($query->num_rows) { 
       $url = explode('=', $query->row['query']); 

       if ($url[0] == 'product_id') { 
        $this->request->get['product_id'] = $url[1]; 
       } 

       if ($url[0] == 'category_id') { 
        $categories[$i] = $this->model_catalog_category->getCategory($url[1]); 

        if (!isset($this->request->get['path'])) { 
         $this->request->get['path'] = $categories[$i]['category_id']; 
        } else { 
         foreach ($query->rows as $row) { 
          $url = explode('=', $row['query']); 
          $category_id = $url[1]; 

          $category = $this->model_catalog_category->getCategory($category_id); 

          if ($category['parent_id'] == $categories[$i - 1]['category_id']) { 
           $this->request->get['path'] .= '_' . $category['category_id']; 
          } 
         } 
        } 
       } 

       if ($url[0] == 'manufacturer_id') { 
        $this->request->get['manufacturer_id'] = $url[1]; 
       } 

       if ($url[0] == 'information_id') { 
        $this->request->get['information_id'] = $url[1]; 
       } 

       if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { 
        $this->request->get['route'] = $query->row['query']; 
       } 

      } else { 
       $this->request->get['route'] = 'error/not_found'; 

       break; 
      } 
     } 

     if (!isset($this->request->get['route'])) { 
      if (isset($this->request->get['product_id'])) { 
       $this->request->get['route'] = 'product/product'; 
      } elseif (isset($this->request->get['path'])) { 
       $this->request->get['route'] = 'product/category'; 
      } elseif (isset($this->request->get['manufacturer_id'])) { 
       $this->request->get['route'] = 'product/manufacturer/info'; 
      } elseif (isset($this->request->get['information_id'])) { 
       $this->request->get['route'] = 'information/information'; 
      } 
     } 

     if (isset($this->request->get['route'])) { 
      return new Action($this->request->get['route']); 
     } 
    } 
} 

public function rewrite($link) { 
    $url_info = parse_url(str_replace('&amp;', '&', $link)); 

    $url = ''; 

    $data = array(); 

    parse_str($url_info['query'], $data); 

    foreach ($data as $key => $value) { 
     if (isset($data['route'])) { 
      if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) { 
       $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); 

       if ($query->num_rows && $query->row['keyword']) { 
        $url .= '/' . $query->row['keyword']; 

        unset($data[$key]); 
       } 
      } elseif ($key == 'path') { 
       $categories = explode('_', $value); 

       foreach ($categories as $category) { 
        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'"); 

        if ($query->num_rows && $query->row['keyword']) { 
         $url .= '/' . $query->row['keyword']; 
        } else { 
         $url = ''; 

         break; 
        } 
       } 

       unset($data[$key]); 
      } else { 
       $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" .$data['route'] . "'"); 

       if ($query->num_rows && $query->row['keyword']) { 
        $url .= '/' . $query->row['keyword']; 

        unset($data[$key]); 
       } 
      } 
     } 
    } 

    if ($url) { 
     unset($data['route']); 

     $query = ''; 

     if ($data) { 
      foreach ($data as $key => $value) { 
       $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); 
      } 

      if ($query) { 
       $query = '?' . str_replace('&', '&amp;', trim($query, '&')); 
      } 
     } 

     return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query; 
    } else { 
     return $link; 
    } 
} 

Der Paginierungscode lautet wie folgt:

class Pagination { 
    public $total = 0; 
    public $page = 1; 
    public $limit = 20; 
    public $num_links = 8; 
    public $url = ''; 
    public $text_first = '|&lt;'; 
    public $text_last = '&gt;|'; 
    public $text_next = '&gt;'; 
    public $text_prev = '&lt;'; 

    public function render() { 
     $total = $this->total; 

     if ($this->page < 1) { 
      $page = 1; 
     } else { 
      $page = $this->page; 
     } 

     if (!(int)$this->limit) { 
      $limit = 10; 
     } else { 
      $limit = $this->limit; 
     } 

     $num_links = $this->num_links; 
     $num_pages = ceil($total/$limit); 

     $this->url = str_replace('%7Bpage%7D', '{page}', $this->url); 

     $output = '<ul class="pagination">'; 

     if ($page > 1) { 
      $output .= '<li><a href="' . str_replace('{page}', 1, $this->url) . '">' . $this->text_first . '</a></li>'; 
      $output .= '<li><a href="' . str_replace('{page}', $page - 1, $this->url) . '">' . $this->text_prev . '</a></li>'; 
     } 

     if ($num_pages > 1) { 
      if ($num_pages <= $num_links) { 
       $start = 1; 
       $end = $num_pages; 
      } else { 
       $start = $page - floor($num_links/2); 
       $end = $page + floor($num_links/2); 

       if ($start < 1) { 
        $end += abs($start) + 1; 
        $start = 1; 
       } 

       if ($end > $num_pages) { 
        $start -= ($end - $num_pages); 
        $end = $num_pages; 
       } 
      } 

      for ($i = $start; $i <= $end; $i++) { 
       if ($page == $i) { 
        $output .= '<li class="active"><span>' . $i . '</span></li>'; 
       } else { 
        $output .= '<li><a href="' . str_replace('{page}', $i, $this->url) . '">' . $i . '</a></li>'; 
       } 
      } 
     } 

     if ($page < $num_pages) { 
      $output .= '<li><a href="' . str_replace('{page}', $page + 1, $this->url) . '">' . $this->text_next . '</a></li>'; 
      $output .= '<li><a href="' . str_replace('{page}', $num_pages, $this->url) . '">' . $this->text_last . '</a></li>'; 
     } 

     $output .= '</ul>'; 

     if ($num_pages > 1) { 
      return $output; 
     } else { 
      return ''; 
     } 
    } 
} 

EDIT:

Alle meine Seiten sind http://domain.com/index.php umgeleitet Von dort sind es entscheidet, in welchem ​​Verzeichnis/Datei aus dem Routenparameter zu verwenden. So route=product/product ist sagen, gehen Sie auf die product.php innerhalb des Verzeichnisprodukts. Das Verzeichnisprodukt enthält auch categories.php, was zu einer Route führt: route=product/category

Die Path-Variable aus der Zeichenfolge repräsentiert die ID einer Kategorie. In meinem Beispiel steht 25 für In-Stock. Und 25_28 steht für In-Stock/Retreaded-Tires usw.

Die product_id Variable repräsentiert die entsprechende ID für das Produkt.

Die Seitenvariable steht für die Seitennummerierung und wird in der Liste der Produkte innerhalb einer Kategorie verwendet. Diese Liste kann eine variable Länge haben, wenn berechnet wird, wie viele Produkte sich innerhalb einer Kategorie befinden und wie viele Produkte auf einer Seite angezeigt werden sollen. Also, wenn die ursprüngliche URL &page=2 mit der Route route=product/category hat, sollte es eine URL wie diese machen: http://domain.com/Tire-Retreading/Equalizing/2

+2

wo ist rewrite Methode, die in diesem Controller sein muss. – mcklayin

+0

Die Rewrite-Methode wurde hinzugefügt, mein Fehler Ich verließ diese Methode. – Baklap4

+0

Könnten Sie klarstellen, was Sie mit "Was wird häufiger verwendet und sollte ich verwenden?" - Es scheint, dass am Ende des Satzes ein Wort fehlt und es unklar ist, über welche Optionen Sie sich entscheiden wollen. Ich kenne Opencart nicht, kenne mich aber mit .htaccess aus. Aus den von Ihnen angegebenen URLs ist es jedoch schwierig zu sagen, welche Teile welche sind (ohne Ihren gesamten Code zu durchlaufen). Wie gliedern sich Ihre gewünschten URLs in die verschiedenen Elemente? (Z. B. was tun: Route, Produkt, Pfad, Kategorie usw. in den ursprünglichen 'hässlichen' URLs übersetzen in die gewünschten 'sauberen' URLs?) Danke. – Kay

Antwort

2

ich noch die zusätzlichen Erklärungen verwirrend finden und es klingt für mich wie Sie nicht ganz wissen, wie URL Werke Umschreiben, so Ich werde versuchen zu erklären, einige URL Neufassung Grundlagen.

Was Sie mit URL-Rewriting tun können, ist zu ‚pretty‘ URL Segmente übersetzen (von URLs dem Benutzer angezeigt) in Segmente Ihrer tatsächlichen, lang, ‚nicht recht‘ URLs (die Verwendung Variablen, die bestimmten Inhalten dienen sollen). Sie tun dies, indem Sie reguläre Ausdrücke verwenden, um die hübschen Segmente zu vergleichen, und dann Ihren php-Variablen entweder vordefinierte Werte oder diese übereinstimmenden Werte geben.

Also, was Sie zuerst tun ist herauszufinden, wie Ihre schönen URLs aussehen sollte, und wie ihre einzelnen Segmente zu Ihren Variablen übersetzen. (Obwohl Sie können natürlich auch eine beliebige Anzahl von neuen Variablen, deren Werte können Sie dann konvertieren und weisen bereits bestehende oder vordefinierte Variablen in der PHP-Skripte.)

Sie haben diesem Beispiel: http://example.com/Tire-Retreading/Equalizing/2

Diese URL scheint aus drei Teilen gemacht werden, die Sie Variablen übersetzen:

  • Tire-Retreading (Variable route)
  • Equalizing (Variable path)
  • 2 (Variable page)

Sie werden Ihre RegEx bauen für passenden Segmente basierend auf allen möglichen Wegen die einzelnen Segmente müssen geschrieben werden können, einschließlich der Sonderzeichen, die usw. sind erlaubt Anschließend können Sie die übereinstimmenden Werte mithilfe einer Rückreferenz an Ihre Variablen übergeben (oder Sie können eigene Werte definieren, die von Ihren Variablen verwendet werden).

Verwendung von Rückreferenzierungen, könnten Sie möglicherweise verwenden:

RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/([0-9]+)$ index.php?route=$1&path=$2&page=$3 [NC,L] 

Sie werden den einzelnen RegEx für das Segment Anpassung setzen müssen (wie [A-Za-z-]+) in runden Klammern der Lage sein, die Ergebnisse zu Ihrer PHP zuweisen Variablen in Form von $1, $2 usw.

Je nachdem, ob die Benutzer auch durchsuchen ‚Übersicht‘ Seiten für Ihre Produkte/Kategorien oder Pfade oder nicht erlaubt sein sollte, müssen Sie möglicherweise Ihre Umschreiben von der kleinstmöglichen Start " hübsche URL zum längsten.

z.

RewriteRule ^([A-Za-z-]+)$ $1/ [NC,R] 
RewriteRule ^([A-Za-z-]+)/$ index.php?route=$1 [NC,L] 
RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)$ $1/$2/ [NC,R] 
RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/$ index.php?route=$1&path=$2 [NC,L] 
RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/([0-9]+)$ $1/$2/$3/ [NC,R] 
RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/([0-9]+)/$ index.php?route=$1&path=$2&page=$3 [NC,L] 

Das Umschreiben für die Domäne selbst geht vor dem "Pfad" umschreiben.

Sie müssen auch herausfinden, welche Flags - das Teil in eckigen Klammern am Ende - müssen Sie verwenden, was bedeutet, dass Sie mehr auf URL rewriting lesen müssen.Im obigen Beispiel werden alle URLs, die der Benutzer eingibt, die nicht mit einem Schrägstrich enden, automatisch umgeleitet (das ist der Name R in eckigen Klammern) für dieselbe URL, aber mit einem zusätzlichen Schrägstrich. Also, http://example.com/blah-http://example.com/blah/ usw. auf der Info

Basierend Ihnen zur Verfügung gestellten umleiten würde, müssen Sie URLs beginnend mit einem von zwei möglichen Segmente:

http://example.com/In-Stock/... 

gegen

http://example.com/Product-or-Category/.... 

So , Sie müssen besonders vorsichtig sein, diese beiden werden nicht verwirrt. Wenn In-Stock in eine eigene Variable geschleust wird und immer genau so geschrieben wird, möchten Sie wahrscheinlich Ihre ersten Regeln damit umgehen und die RegEx verwenden, um die Produkte/Kategorien erst später zu finden (alle Umschreibungsregeln werden chronologisch behandelt, einer nach dem anderen).

Ich hoffe, dass hilft.