Selam arkadaşlar,
Otomatik kategori ve ürün isimlerini seo olarak tanımlayacak modül ihtiyacım vardır.
Ücretli veya ücretsiz fark etmez fakat aradığımız bu alanda en iyisi sayılabilecek bir modül olması
Ayırca bir öneri de; deadcow SEO v2.5 Cevaplarınızı beklemekteyim...
ürünler :
.com/urun-markasi/urun-adi.html
kategoriler:
.com/katergori-adi.html
markalar:
.com/marka-adi.html
sanırım en iyisi derken böyle birşey arıyorsunuz
aşağıdaki kodu calatog/controller/common/ klasorune automatic_seo_url.php ismiyle kaydedip yükleyin
<?php
class ControllerCommonAutomaticSeoUrl extends Controller {
// configuration attributes
var $forceAutoUrl = true; //if set to true, default OC SEO keyword for urls will be ignored
var $manufacturerNameInUrl = true;
var $languageSlugInUrl = true;
var $preventProdDuplicates = false; //if a product is linked to more then one category, only use one category for product details page
var $product_identifier = 'p';
var $category_identifier = 'c';
var $manufacturer_identifier = 'm';
var $info_identifier = 'i';
var $route_identifier = 'r';
var $_sep = '-';
var $_url_ext = '.html'; // .html, .php etc.
// reserved attributes
var $_products;
var $_categories;
var $_tmp_cat_path = array();
var $_manufacturers;
var $_infos;
var $_infoString;
var $_languages;
public function index() {
//change language id: i.e. for sitemap
if(isset($this->request->get['language'])){
$this->_getLanguages();
if(isset($this->_languages[$this->request->get['language']]) && $this->request->get['language'] != $this->config->get('config_language')){
$this->session->data['language'] = $this->request->get['language'];
header('location: '.urldecode($_SERVER['REQUEST_URI']));
}
}
// Add rewrite to url class
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}
// Decode URL
if (isset($this->request->get['_route_'])) {
if($this->languageSlugInUrl && isset($this->request->post['language_code']) && isset($this->request->post['redirect'])){
$this->_getLanguages();
$this->session->data['language'] = $this->request->post['language_code'];
$this->config->set('config_language',$this->request->post['language_code']);
$this->config->set('config_language_id',$this->_languages[$this->request->post['language_code']]['language_id']);
$redirect = ltrim(parse_url($this->request->post['redirect'], PHP_URL_PATH),'/');
$segments = explode('/',$redirect);
$segments['0'] = $this->request->post['language_code'];
$this->request->get['_route_'] = implode('/',$segments);
}
if(substr($this->request->get['_route_'], strlen($this->_url_ext)*-1) == $this->_url_ext)
$this->request->get['_route_'] = substr($this->request->get['_route_'], 0, strlen($this->request->get['_route_']) - strlen($this->_url_ext));
//decode url
$segments = explode('/', $this->request->get['_route_']);
//language slug
if($this->languageSlugInUrl){
$this->_getLanguages();
if(!isset($this->request->post['language_code']) && isset($this->_languages[$segments[0]]) && $segments[0] != $this->config->get('config_language')){
$this->session->data['language'] = $segments[0];
header('location: '.urldecode($_SERVER['REQUEST_URI']));
}
unset($segments[0]);
$segments = array_values($segments);
}
if(!empty($segments)){
$_segments = array_reverse($segments);
$segment = array_reverse(explode($this->_sep, $_segments[0]));
$string = $segment[0];
$string = preg_replace('/[^A-Za-z0-9]/','',$string);
$parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $string);
if(!empty($parts)){
// adjust path
$path = array();
foreach($parts as $k=>$p){
if( ($k % 2) == 0 && $p == $this->category_identifier){
$next = $k+1;
$path[] = $parts[$next];
}
}
$path = implode('_',$path);
// end adjust path
switch($parts[0]){
case $this->product_identifier:
// product page
$this->request->get['route'] = 'product/product';
$this->request->get['product_id'] = (int) $parts[1];
if(isset($parts[2]) && $parts[2] == $this->category_identifier){
$this->request->get['path'] = $path; //$parts[3];
}
break;
case $this->category_identifier:
// category page
$this->request->get['route'] = 'product/category';
$this->request->get['path'] = $path; //$parts[1];
break;
case $this->manufacturer_identifier:
// manufacturer page
$mroute = ( version_compare(VERSION, '1.5.4.0') >= 0 ) ? 'product/manufacturer/info' : 'product/manufacturer/product';
$this->request->get['route'] = $mroute;
$this->request->get['manufacturer_id'] = (int) $parts[1];
break;
case $this->info_identifier:
// information page
$this->request->get['route'] = 'information/information';
$this->request->get['information_id'] = (int) $parts[1];
break;
case $this->route_identifier:
// other route pages
$this->request->get['route'] = implode('/',$segments);
break;
default:
if($this->forceAutoUrl)
$this->request->get['route'] = implode('/',$segments);
else
return $this->index_standard();
break;
}
}else{
if($this->forceAutoUrl)
$this->request->get['route'] = implode('/',$segments);
else
return $this->index_standard();
}
}
if($this->languageSlugInUrl && isset($this->request->post['language_code']) && isset($this->request->post['redirect'])){
$route = '';
if(isset($this->request->get['route'])){
$route = $this->request->get['route'];
unset($this->request->get['route']);
}
unset($this->request->get['_route_']);
$args = http_build_query($this->request->get);
$redirect = $this->url->link($route, $args);
$this->redirect($redirect);
}
if (isset($this->request->get['route'])) {
return $this->forward($this->request->get['route']);
}
}
}
public function rewrite($link){
if(!$this->forceAutoUrl){
$_link = $this->rewrite_standard($link);
if($_link != $link) return $_link;
}
if($this->config->get('config_seo_url')){
$this->_infoString = '';
$url_data = parse_url(str_replace('&', '&', $link));
if(!isset($url_data['query']))return $link;
$url = $urlpre = $urlpost = '';
$data = array();
parse_str($url_data['query'], $data);
if(isset($data['route'])){
switch($data['route']){
case 'product/product':
$this->_get_products();
$pid = (isset($data['product_id'])) ? $data['product_id'] : 0;
unset($data['product_id']);
//$url .= '/'.$this->product_identifier.'/'.$pid;
$this->_infoString .= $this->product_identifier.$pid;
if(isset($this->_products[$pid])){
if(isset($data['path']) && !$this->preventProdDuplicates){
$cats = array_reverse(explode('_', $data['path']));
$catid = $cats[0];
}else{
$catid = $this->_products[$pid]['category_id'];
}
$url .= $this->_traverse_categories($catid);
if($this->manufacturerNameInUrl){
$this->_get_manufacturers();
if(isset($this->_manufacturers[$this->_products[$pid]['manufacturer_id']]))
$url .= $this->_manufacturers[$this->_products[$pid]['manufacturer_id']].'/';
}
$url .= $this->_products[$pid]['name'];
}
if(isset($data['path'])){
unset($data['path']);
}
break;
case 'product/category':
$data['path'] = isset($data['path']) ? $data['path'] : 0;
$ppath = array_reverse(explode('_',$data['path']));
$url .= $this->_traverse_categories($ppath[0]);
unset($data['path']);
break;
case 'product/manufacturer/info':
case 'product/manufacturer/product':
$data['manufacturer_id'] = isset($data['manufacturer_id']) ? $data['manufacturer_id'] : 0;
//$url .= '/'.$this->manufacturer_identifier.'/'.$data['manufacturer_id'];
$this->_infoString .= $this->manufacturer_identifier.$data['manufacturer_id'];
$this->_get_manufacturers();
if(isset($this->_manufacturers[$data['manufacturer_id']]))
$url .= '/'.$this->_manufacturers[$data['manufacturer_id']];
unset($data['manufacturer_id']);
break;
case 'information/information':
$data['information_id'] = isset($data['information_id']) ? $data['information_id'] : 0;
//$url .= '/'.$this->info_identifier.'/'.$data['information_id'];
$this->_infoString .= $this->info_identifier.$data['information_id'];
$this->_get_infos();
if(isset($this->_infos[$data['information_id']]))
$url .= '/'.$this->_infos[$data['information_id']];
unset($data['information_id']);
break;
case 'common/home':
break;
default:
$url .= '/'.$data['route'];
//$url .= '/'.$this->route_identifier.'/'.$data['route'];
//return $link;
break;
}
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value)
$query .= '&' . $key . '=' . $value;
if ($query)
$query = '?' . trim($query, '&');
}
//$url .= $this->_sep.$this->_infoString;
if(!empty($this->_infoString))
$url = '/'.trim($url,'/').$this->_sep.$this->_infoString;
return $url_data['scheme'].'://'.$url_data['host'].(isset($url_data['port']) ? ':'.$url_data['port'] : '').str_replace('/index.php', '', $url_data['path']).( $this->languageSlugInUrl ? '/'.$this->config->get('config_language') : '').rtrim($url,'/').(rtrim($url,'/') == '' ? '' : $this->_url_ext).$query;
}else{
return $link;
}
}else{
return $link;
}
}
private function _get_products(){
if(empty($this->_product)){
$this->_products = array();
$query = $this->db->query("
SELECT p.product_id, pd.name, pc.category_id, p.manufacturer_id FROM " . DB_PREFIX . "product AS p
LEFT JOIN " . DB_PREFIX . "product_description AS pd ON pd.product_id = p.product_id
LEFT JOIN " . DB_PREFIX . "product_to_category AS pc ON pc.product_id = p.product_id
WHERE pd.language_id = ".(int)$this->config->get('config_language_id')." AND p.status = 1");
foreach($query->rows as $prod)
$this->_products[$prod['product_id']] = array(
'name'=>$this->clean_name($prod['name']),
'category_id'=>$prod['category_id'],
'manufacturer_id'=>$prod['manufacturer_id'],
);
}
}
private function _get_categories(){
if(empty($this->_categories)){
$this->_categories = array();
$query = $this->db->query("
SELECT c.category_id, c.parent_id, cd.name FROM " . DB_PREFIX . "category AS c
LEFT JOIN " . DB_PREFIX . "category_description AS cd ON cd.category_id = c.category_id
WHERE cd.category_id = c.category_id AND cd.language_id = ".(int)$this->config->get('config_language_id')." AND c.status = 1");
foreach($query->rows as $cat){
$this->_categories[$cat['category_id']] = array(
'name'=>$this->clean_name($cat['name']),
'parent'=>$cat['parent_id']
);
}
}
}
private function _traverse_categories($catId){
if(!in_array($catId,$this->_tmp_cat_path))
$this->_tmp_cat_path[] = $catId;
$this->_get_categories();
if(isset($this->_categories[$catId])){
if($this->_categories[$catId]['parent'] == 0){
$this->_infoString .= $this->category_identifier.implode($this->category_identifier,array_reverse($this->_tmp_cat_path));
$this->_infoString = rtrim($this->_infoString, $this->category_identifier);
$return = $this->_categories[$catId]['name'].'/';
$this->_tmp_cat_path = array();
}else{
$return = $this->_traverse_categories($this->_categories[$catId]['parent']).$this->_categories[$catId]['name'].'/';
}
}else{
$return = '';
}
return $return;
}
private function _get_manufacturers(){
if(empty($this->_manufacturers)){
$this->_manufacturers = array();
$query = $this->db->query("SELECT manufacturer_id, name FROM " . DB_PREFIX . "manufacturer");
foreach($query->rows as $man)
$this->_manufacturers[$man['manufacturer_id']] = $this->clean_name($man['name']);
}
}
private function _get_infos(){
if(empty($this->_infos)){
$this->_infos = array();
$query = $this->db->query("SELECT i.information_id, id.title FROM " . DB_PREFIX . "information AS i LEFT JOIN " . DB_PREFIX . "information_description AS id ON id.information_id = i.information_id WHERE id.information_id = i.information_id AND id.language_id = ".(int)$this->config->get('config_language_id')." AND i.status = 1");
foreach($query->rows as $infos)
$this->_infos[$infos['information_id']] = $this->clean_name($infos['title']);
}
}
private function _getLanguages(){
if(empty($this->_languages)){
$this->_languages = array();
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "language` WHERE status = '1'");
foreach ($query->rows as $result) {
$this->_languages[$result['code']] = $result;
}
}
}
private function clean_name($name){
$name = htmlspecialchars_decode($name);
$bad_array = array("сква",
"À","à","Á","á","Â","â","Ã","ã","Ä","ä","Å","å","Ā","ā","Ă","ă","Ą","ą","Ǟ","ǟ","Ǻ","ǻ","Α","α",
"Æ", "æ", "Ǽ", "ǽ",
"Ḃ","ḃ","Б","б",
"Ć","ć","Ç","ç","Č","č","Ĉ","ĉ","Ċ","ċ","Ч","ч","Χ","χ",
"Ḑ","ḑ","Ď","ď","Ḋ","ḋ","Đ","đ","Ð","ð","Д","д","Δ","δ",
"DZ", "Dz","dz", "DŽ", "Dž", "dž",
"È","è","É","é","Ě","ě","Ê","ê","Ë","ë","Ē","ē","Ĕ","ĕ","Ę","ę","Ė","ė","Ʒ","ʒ","Ǯ","ǯ","Е","е","Э","э","Ε","ε",
"Ḟ","ḟ","","Ф","ф","Φ","φ",
"fi", "fl",
"Ǵ","ǵ","Ģ","ģ","Ǧ","ǧ","Ĝ","ĝ","Ğ","ğ","Ġ","ġ","Ǥ","ǥ","Г","г","Γ","γ",
"Ĥ","ĥ","Ħ","ħ","Ж","ж","Х","х",
"Ì","ì","Í","í","Î","î","Ĩ","ĩ","Ï","ï","Ī","ī","Ĭ","ĭ","Į","į","İ","ı","И","и","Η","η","Ι","ι",
"IJ", "ij",
"Ĵ","ĵ",
"Ḱ","ḱ","Ķ","ķ","Ǩ","ǩ","К","к","Κ","κ",
"Ĺ","ĺ","Ļ","ļ","Ľ","ľ","Ŀ","ŀ","Ł","ł","Л","л","Λ","λ",
"LJ", "Lj", "lj",
"Ṁ","ṁ","М","м","Μ","μ",
"Ń","ń","Ņ","ņ","Ň","ň","Ñ","ñ","ʼn","Ŋ","ŋ","Н","н","Ν","ν",
"NJ", "Nj", "nj",
"Ò","ò","Ó","ó","Ô","ô","Õ","õ","Ö","ö","Ō","ō","Ŏ","ŏ","Ø","ø","Ő","ő","Ǿ","ǿ","О","о","Ο","ο","Ω","ω",
"", "",
"Ṗ","ṗ","П","п","Π","π",
"Ŕ","ŕ","Ŗ","ŗ","Ř","ř","Р","р","Ρ","ρ","Ψ","ψ",
"Ś","ś","Ş","ş","","","Ŝ","ŝ","Ṡ","ṡ","ſ","ß","С","с","Ш","ш","Щ","щ","Σ","σ","ς",
"Ţ","ţ","Ť","ť","Ṫ","ṫ","Ŧ","ŧ","Þ","þ","Т","т","Ц","ц","Θ","θ","Τ","τ",
"Ù","ù","Ú","ú","Û","û","Ũ","ũ","Ü","ü","Ů","ů","Ū","ū","Ŭ","ŭ","Ų","ų","Ű","ű","У","у",
"В","в","Β","β",
"Ẁ","ẁ","Ẃ","ẃ","Ŵ","ŵ","Ẅ","ẅ",
"Ξ","ξ",
"Ỳ","ỳ","Ý","ý","Ŷ","ŷ","","ÿ","Й","й","Ы","ы","Ю","ю","Я","я","Υ","υ",
"Ź","ź","Ž","ž","Ż","ż","З","з","Ζ","ζ",
"Ь","ь",'Ъ',"ъ","^","&");
$good_array= array("scow",
"A","a","A","a","A","a","A","a","A","a","A","a","A","a","A","a","A","a","A","a","A","a","A","a",
"AE","ae","AE","ae",
"B","b","B","b",
"C","c","C","c","C","c","C","c","C","c","CH","ch","CH","ch",
"D","d","D","d","D","d","D","d","D","d","D","d","D","d",
"DZ","Dz","dz","DZ","Dz","dz",
"E","e","E","e","E","e","E","e","E","e","E","e","E","e","E","e","E","e","E","e","E","e","Ye","ye","E","e","E","e",
"F","f","f","F","f","F","f",
"fi","fl",
"G","g","G","g","G","g","G","g","G","g","G","g","G","g","G","g","G","g",
"H","h","H","h","ZH","zh","H","h",
"I","i","I","i","I","i","I","i","I","i","I","i","I","i","I","i","I","i","I","i","I","i","I","i",
"IJ","ij",
"J","j",
"K","k","K","k","K","k","K","k","K","k",
"L","l","L","l","L","l","L","l","L","l","L","l","L","l",
"LJ","Lj","lj",
"M","m","M","m","M","m",
"N","n","N","n","N","n","N","n","n","N","n","N","n","N","n",
"NJ","Nj","nj",
"O","o","O","o","O","o","O","o","O","o","O","o","O","o","O","o","O","o","O","o","O","o","O","o","O","o",
"OE","oe",
"P","p","P","p","P","p","PS","ps",
"R","r","R","r","R","r","R","r","R","r",
"S","s","S","s","S","s","S","s","S","s","s","ss","S","s","SH","sh","SHCH","shch","S","s","s",
"T","t","T","t","T","t","T","t","T","t","T","t","TS","ts","TH","th","T","t",
"U","u","U","u","U","u","U","u","U","u","U","u","U","u","U","u","U","u","U","u","U","u",
"V","v","V","v",
"W","w","W","w","W","w","W","w",
"X","x",
"Y","y","Y","y","Y","y","Y","y","Y","y","Y","y","YU","yu","YA","ya","Y","y",
"Z","z","Z","z","Z","z","Z","z","Z","z",
"'","'",'"','"',""," and ");
$name = str_replace($bad_array,$good_array,$name);
unset($bad_array);
unset($good_array);
$name = preg_replace("/[^a-zA-Z0-9]/",$this->_sep,$name);
while(strpos($name, str_repeat($this->_sep,2))){
$name = str_replace(str_repeat($this->_sep,2),$this->_sep,$name);
}
return trim($name,$this->_sep);
}
public function index_standard() {
// 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_']);
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];
}
} else {
$this->request->get['route'] = implode('/',$parts);
return $this->forward($this->request->get['route']);
$this->request->get['route'] = 'error/not_found';
}
}
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/product';
} elseif (isset($this->request->get['information_id'])) {
$this->request->get['route'] = 'information/information';
}
if (isset($this->request->get['route'])) {
return $this->forward($this->request->get['route']);
}
}
}
public function rewrite_standard($link) {
if ($this->config->get('config_seo_url')) {
$url_data = parse_url(str_replace('&', '&', $link));
if(!isset($url_data['query']))return $link;
$url = '';
$data = array();
parse_str($url_data['query'], $data);
foreach ($data as $key => $value) {
if (isset($data['route'])) {
if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/product' || $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) {
$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) {
$url .= '/' . $query->row['keyword'];
}
}
unset($data[$key]);
}
}
}
if ($url) {
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value) {
$query .= '&' . $key . '=' . $value;
}
if ($query) {
$query = '?' . trim($query, '&');
}
}
return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;
} else {
return $link;
}
} else {
return $link;
}
}
}
?>root ta bulunan index.php dosyasını açın ve
// SEO URL's
$controller->addPreAction(new Action('common/seo_url'));kodunu
// SEO URL's
//$controller->addPreAction(new Action('common/seo_url'));
$controller->addPreAction(new Action('common/automatic_seo_url'));şeklinde değiştirin