php - Opencart 搜索引擎优化网址问题
问题描述
我一直在研究 SEO URL 和 opencart。我使用了一个扩展(SEO Keyword Lite)来管理 SEO URL 和 opencart 2.3.0.2。问题是当我为任何产品或类别添加最多 1 个分段的 http://baseurl/product-name
SEO URL 时,它工作正常,但是当我添加最多 2 个分段的 SEO URL 时,http://baseurl/product/product-name
它显示错误“找不到请求的页面!”
我的 SEO 网址文件:
class ControllerStartupSeoUrl extends Controller {
public function index() {
// 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);
}
foreach ($parts as $part) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");
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') {
if (!isset($this->request->get['path'])) {
$this->request->get['path'] = $url[1];
} else {
$this->request->get['path'] .= '_' . $url[1];
}
}
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';
}
}
}
}
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]);
}
}
}
if ($url) {
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value) {
$query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((is_array($value) ? http_build_query($value) : (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;
}
}
}
我在每一步都尝试了print_r()并尝试了我的解决方案,但它显示未找到相同的请求。我的理解是 seo url 正在相应地命中,但它无法找到与 url 相关的资源,并且显示“未找到请求”。我是打开购物车的新手,如果有人指导我完成此操作,我将不胜感激。谢谢。
解决方案
我找到了设置 SEO URL 的答案,只需在重写函数中添加一些代码:
public function rewrite($link) {
$url_info = parse_url(str_replace('&', '&', $link));
$url = '';
$data = array();
parse_str($url_info['query'], $data);
if ($data['route'] == 'common/home'){
$url .= '/';
}
if ($data['route'] == 'information/contact'){
$url .= '/contact';
}
if ($data['route'] == 'account/return/add'){
$url .= '/returnadd';
}
if ($data['route'] == 'information/sitemap'){
$url .= '/sitemap';
}
if ($data['route'] == 'product/manufacturer'){
$url .= '/manufacturer';
}
if ($data['route'] == 'account/voucher'){
$url .= '/voucher';
}
if ($data['route'] == 'affiliate/login'){
$url .= '/affiliatelogin';
}
if ($data['route'] == 'product/special'){
$url .= '/special';
}
if ($data['route'] == 'product/product'){
$url .= '/product';
}
if ($data['route'] == 'product/category'){
$url .= '/category';
}
if ($data['route'] == 'account/login'){
$url .= '/login';
}
if ($data['route'] == 'checkout/cart'){
$url .= '/cart';
}
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]);
}
}
}
if ($url) {
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value) {
$query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((is_array($value) ? http_build_query($value) : (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;
}
}
最重要的是在oc_url_alias中提及这些关键字,例如:
query= product/category keyword=category
我希望这对许多面临 seo url 问题的人有所帮助。
谢谢。
推荐阅读
- java - Java Stream - 合并两个流
- java - 超过256个参数的数据类,kotlin?
- ios - 在 iOS swift 中迁移 firebase 后,我们是否需要删除结构?
- flutter-web - 使用 ListView 构建我自己的抽屉发生 tileWidth !=leadingSize.width
- java - 使用 GridData 对齐 + 填充标签中的 SWT 问题
- node.js - 如何将图像存储在节点后端?
- ios - ios Swift 商品未添加到购物车
- c - uint8_t 数组返回在所有情况下都会导致错误(**、*、&,什么都没有)
- r - html_nodes 返回一个空列表
- java - 如何对 Socket 和 OutputStreamWriter 执行 JUnit 测试