Codeigniter - SEO友好的URL结构(Slug实现)

5
我想在codeigniter框架中开发一个网站,在其中可以通过slug访问任何网页。
例如,就像WordPress和Magento一样,我们可以通过www.sitename.com/category_type/category_detailpage来访问类别页面,而且只需将其slug添加到主URI www.sitename.com/category_detailpage 后面即可直接访问Category_detail。
因此,我的问题是,如果您有任何关于Codeigniter Slug目录的案例研究项目代码,请告诉我如何设计数据库中的slug表架构。
谢谢!
1个回答

13

如何使用slug?

以下示例将进行说明:
网址 - http://www.example.com/products/apple-iphone-5S-16GB-brand-new/

1)假设您拥有一个产品页面,当然,产品页面需要从URL中获取一些数据以了解要显示哪个产品。
2)在此之前,我们使用从URL获取的ID查询数据库。但现在我们将执行相同的操作(查询数据库),只不过是用slug替换id。
3)因此,在您的数据库中添加一个名为slug的额外列。下面是您更新的产品数据库结构(仅供参考)。

Columns                       Values

id (int(11), PK)              1
title (varchar(1000))         Apple iPhone 5S 16GB
slug (varchar(1000))          apple-iphone-5S-16GB-brand-new
price (varchar(15))           48000
thumbnail (varchar(255))      apple-iphone-5S-16GB-brand-new.jpg
description (text)            blah blah
...
...


我以前也在slug上回答过。看看是否有帮助。
如何从CodeIgniter的URL中删除参数


编辑:

为此,您需要进行以下更改 -

1)创建以下2个表格

slug_table:

id (PK)   |    slug    |   category_id (FK)


category_table:

id (PK)   |  title  |  thumbnail  |  description


2) config/routes.php

2)config/routes.php
$route['/(:any)'] = "category/index/$1";


3) 模型/category_model.php(创建新文件)

class Category_model extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
        $this->db = $this->load->database('default',true);
    }

    public function get_slug($slug)
    {
        $query = $this->db->get_where('slug_table', array('slug' => $slug));

        if($query->num_rows() > 0)
            return $query->row();
        return false;
    }

    public function get_category($id)
    {
        $query = $this->db->get_where('category_table', array('id' => $id));

        if($query->num_rows() > 0)
            return $query->row();
        return false;
    }
}


4) 控制器/category.php(创建新文件)

class Category extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('category_model');
    }

    public function index($slug)
    {
        $sl = $this->category_model->get_slug($slug);

        if($sl)
        {
             $data['category'] = $this->category_model->get_category($sl->category_id);
             $this->load->view('category_detail', $data);
        }
        else
        {
             // 404 Page Not Found
        }
    }
}


5) views/category_detail.php(创建新文件)

<label>Category title: <?php echo $category->title; ?></label><br>
</label>Category description: <?php echo $category->description; ?></label>

我不想这样做,我希望像WordPress和Magento框架一样,在一个表中管理所有网页的slug,然后只通过slug访问任何网页,而不需要在URL中显示任何控制器和方法名称。那么我该如何管理它呢? - Sona
我能否将“/products/”替换为类别标题(例如:www.examples.com/foods/sweet-apple.html)?请给我展示一下。 - Ye Htun Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接