2015-10-22 9 views
9

मैं अपने उत्पाद यूआरएल को अपने ओपनकार्ट webshop से फिर से लिखना चाहता हूं। ओपनकार्ट में एक एसईओ कार्यान्वयन है जो वास्तव में बेकार है। मैंने एसईओ कार्यान्वयन को कई श्रेणियों के लिए एक ही कीवर्ड का उपयोग करने में सक्षम होने के लिए अद्यतन किया है: Opencart duplicate URL keywords लेकिन यह केवल श्रेणियों के लिए काम कर रहा है। उत्पादों के लिए मुझे लगता है कि मुझे लगता है कि एक htaccess rewrite नियम की जरूरत है।यूआरएल रिवाइटिंग ओपनकार्ट उत्पाद एसईओ

मूल URL ऐसा दिखाई देगा:

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

मेरा url इस समय इस तरह दिखता है:

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

आप देख सकते हैं श्रेणियों पहले से ही बदल दिया।

और मैं इसे इस तरह रहना चाहता हूँ:

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

तो पृष्ठांकन (एक वर्ग के अंदर) के लिए मैं इस यूआरएल है:

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

मैं पहले से ही इस कर दिया है में:

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

लेकिन मैं इस चाहते हैं होने के लिए

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

मेरे htaccess फ़ाइल इस तरह दिखता है:

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] 

इस तरह मेरे seo_url.php फ़ाइल जो थोड़ा बदल दिया जाता है दिखता है:

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; 
    } 
} 

पेजिनेशन कोड इस तरह है:

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 ''; 
     } 
    } 
} 

संपादित करें:

अपने पृष्ठों की

सभी वहां से http://domain.com/index.php पर पुनः निर्देशित कर रहे हैं यह तय करता है कि क्या निर्देशिका/फ़ाइल मार्ग पैरामीटर से उपयोग करने के लिए। तो route=product/product निर्देशिका उत्पाद के भीतर product.php पर जा रहा है। निर्देशिका उत्पाद में categories.php भी शामिल है जो एक मार्ग की ओर जाता है: route=product/category

स्ट्रिंग से पथ चर एक श्रेणी की आईडी का प्रतिनिधित्व करता है। मेरे उदाहरण में 25In-Stock के लिए खड़ा है। और 25_28In-Stock/Retreaded-Tires आदि

product_id चर उत्पाद के लिए संबंधित आईडी का प्रतिनिधित्व करता है।

पृष्ठ परिवर्तक पृष्ठांकन का प्रतिनिधित्व करता है और किसी श्रेणी के भीतर उत्पादों की सूची में उपयोग किया जाता है। इस सूची में एक चर लंबाई हो सकती है क्योंकि यह गणना करता है कि एक श्रेणी के भीतर कितने उत्पाद हैं और उन्हें 1 पृष्ठ पर कितने दिखाना चाहिए। तो यह इस तरह एक यूआरएल बनाना चाहिए यदि मूल यूआरएल मार्ग route=product/category साथ &page=2 है: http://domain.com/Tire-Retreading/Equalizing/2

+2

जहां रीराइट विधि है, जो इस नियंत्रक में होना चाहिए। – mcklayin

+0

पुनर्लेखन विधि मेरी गलती को जोड़ा गया है, मैंने उस विधि को छोड़ दिया है। – Baklap4

+0

क्या आप इसका अर्थ स्पष्ट कर सकते हैं कि 'क्या अक्सर उपयोग किया जाता है और क्या मुझे उपयोग करना चाहिए?' - ऐसा लगता है कि वाक्य के अंत में एक शब्द गायब है और यह स्पष्ट नहीं है कि आप किस विकल्प के बीच फैसला करने की कोशिश कर रहे हैं। मैं ओपनकार्ट से परिचित नहीं हूं लेकिन मेरे रास्ते को जानता हूं। Htaccess। हालांकि, आपके द्वारा प्रदान किए गए यूआरएल से यह बताने में मुश्किल है कि कौन से हिस्से हैं (आपके सभी कोड के बिना)। आपके वांछित यूआरएल विभिन्न तत्वों में कैसे टूट जाते हैं? (यानी क्या करें: मूल 'बदसूरत' यूआरएल में मार्ग, उत्पाद, पथ, श्रेणी इत्यादि वांछित 'साफ' यूआरएल में अनुवाद करते हैं?) धन्यवाद। – Kay

उत्तर

2

मैं अभी भी जोड़ा स्पष्टीकरण संशय है और यह मेरे लिए लगता है कि आप काफी पता नहीं कैसे यूआरएल को फिर से लिखने का काम करता है, इसलिए मैं कुछ यूआरएल मूल बातें पुनर्लेखन समझाने की कोशिश करेंगे।

क्या आप URL पुनर्लेखन के साथ क्या कर सकते हैं (का अनुवाद 'सुंदर' यूआरएल खंडों (यूआरएल के उपयोगकर्ता के लिए दिखाया गया है) अपने वास्तविक, लंबे, 'गैर-बहुत' यूआरएल के क्षेत्रों में है जो उपयोग चर जो कुछ सामग्री को सेवा करने के लिए)। आपको बस इतना है कि सुंदर क्षेत्रों मैच के लिए नियमित अभिव्यक्ति का उपयोग कर, और फिर अपने php चर के लिए या तो पूर्व निर्धारित मूल्यों या उन का मिलान नहीं हुआ मान देकर।

तो, आप पहले क्या करते हैं पता लगाएं कि आपके सुंदर यूआरएल को कैसे दिखाना चाहिए, और उनके व्यक्तिगत सेगमेंट आपके चर में कैसे अनुवाद करते हैं। (हालांकि आप निश्चित रूप से भी नए चर के किसी भी संख्या, जिनके मूल्यों का उपयोग कर सकते हैं तो बदलने और असाइन कर सकते हैं करने के लिए पहले से ही विद्यमान या पूर्व निर्धारित अपने php स्क्रिप्ट में चर।)

आप इस उदाहरण दिया: http://example.com/Tire-Retreading/Equalizing/2

  • Tire-Retreading (चर route)
  • Equalizing (चर 012:

    यह URL तीन भागों है कि आप चर में अनुवाद करना चाहते से बना प्रतीत हो रहा है)

  • 2 (चर page)

आप हर संभव तरीके अलग-अलग खंडों की वर्तनी जा सकता है, कोई विशेष वर्ण आदि कि अनुमति दी जाती है सहित के आधार पर अपने क्षेत्रों से मेल खाते के लिए अपने रेगुलर एक्सप्रेशन से निर्माण करना होगा एक बार यह हो जाता है, तो आप एक backreference का उपयोग कर अपने चर करने के लिए मिलान मूल्यों पारित कर सकते हैं (या आप अपने चर द्वारा प्रयोग की जाने वाली आपके अपने मान निर्धारित सकता है)।

backreferences उपयोग करके, आप संभवतः इस इस्तेमाल कर सकते हैं:

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

आप अलग-अलग रेगुलर एक्सप्रेशन से (जैसे [A-Za-z-]+) दौर कोष्ठक में खंड मिलान के लिए डाल करने के लिए होगा अपने php के लिए परिणाम आवंटित करने के लिए सक्षम होने के लिए $1 के रूप में, $2 आदि

पर उपयोगकर्ताओं को भी अपने उत्पादों/श्रेणियों या पथों के लिए 'सिंहावलोकन' पृष्ठों को ब्राउज़ या नहीं करने के लिए अनुमति दी जानी चाहिए, तो निर्भर करता है

में चर, आप अपने छोटी संभव 'से फिर से लिखने शुरू करने के लिए हो सकता है सुंदर 'सबसे लंबे समय तक एक के लिए यूआरएल।

उदा।

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] 

डोमेन के लिए पुनर्लेखन ही सभी 'पथ' को फिर से लिखने से पहले चला जाता है।

आपको यह भी पता लगाना होगा कि अंत में स्क्वायर ब्रैकेट में भाग - आपको इसका उपयोग करने की आवश्यकता है, जिसका अर्थ है कि आपको अधिक जानकारी में URL rewriting पर पढ़ना होगा।उपर्युक्त उदाहरण में, उपयोगकर्ता द्वारा उपयोग किए जाने वाले सभी यूआरएल स्लैश के साथ समाप्त नहीं होते हैं (उसी प्रकार यूआरएल पर R स्क्वायर ब्रैकेट में खड़ा होता है) लेकिन एक अतिरिक्त स्लैश के साथ।

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

बनाम

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

तो: तो, http://example.com/blahhttp://example.com/blah/ आदि

जानकारी आपके द्वारा दी गई के आधार पर करने के लिए पुन: निर्देशित करेंगे, आप यूआरएल दो संभावित क्षेत्रों में से एक के साथ शुरू होगा , आपको इन दोनों को अतिरिक्त देखभाल करना होगा, भ्रमित न हों। In-Stock अपनी ही चर में funneled हो जाता है और हमेशा बिल्कुल ऐसे ही लिखा जाता है, तो आप शायद उस के साथ अपना पहला नियम सौदा बनाने के लिए और (सभी पुनर्लेखन नियम कालक्रम के अनुसार निपटाया जाता है केवल बाद में उत्पादों/श्रेणियों मिलान के लिए रेगुलर एक्सप्रेशन से उपयोग करना चाहेंगे, एक के बाद एक)।

मुझे उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे