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('&', '&', $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('&', '&', 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 = '|<';
public $text_last = '>|';
public $text_next = '>';
public $text_prev = '<';
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
wo ist rewrite Methode, die in diesem Controller sein muss. – mcklayin
Die Rewrite-Methode wurde hinzugefügt, mein Fehler Ich verließ diese Methode. – Baklap4
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