我正在尝试使用Codeigniter创建内容管理系统。我有一个页面,显示文章标题列表。当任何用户点击任何文章标题时,用户将在单独的页面中查看该文章的详细信息。
我正在使用以下代码显示文章标题列表:
<a href="<?php echo base_url(); ?>article/<?php echo $row['article_id']; ?>">
<?php echo $row['article_title']; ?></a>
当任何用户点击上面的链接时,它会获取article_id并转到以下控制器
控制器:
function index($id){
$this->load->model('mod_articles');
$data['records']=$this->mod_articles->list_articles($id);
$this->load->view('view_article',$data);
}
型号:
function list_articles($id)
{
$this->db->select('*');
$this->db->from('article');
$this->db->where('article_id', $id);
$query = $this->db->get();
return $query->row_array();
}
现在,当我显示结果时,在浏览器的地址栏中,链接看起来像这样 -
localhost/cms/article/1 //<< here localhost/cms/ is my base_url
根据此website,良好的SEO友好网址的示例是http://www.mysite.com/joomla-seo-tips
。
现在我的问题是如何让我的网址看起来像localhost/cms/article/my-article-title
而不是在链接末尾显示文章的ID?
为了实现这一点,我应该查询我的文章标题而不是文章ID,或者有更好的方法来做到这一点?
请分享您的想法。
提前致谢:)
所以,在保存我的内容之前,我应该运行以下代码获取$article_slug
然后保存它吗?
function create_slug($string){
$slug=preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
return $slug;
}
$article_slug= create_slug('My Name '); // as you suggested I will create a new column for this
答案 0 :(得分:2)
保存记录时,通过在标题上运行url_title()
给它一个URL slug(这应该是一个唯一的列,确保在保存时检查重复的条目)。
url_title("My page title!")
应返回my-page-title
之类的内容,请参阅url helper。我通常也会在slugs上运行strtolower
,看起来像CI允许上限。
当您查询内容时,请通过slug
获取内容,例如:
$this->db->where('slug', $this->uri->segment(1))->get('articles');
当然,使用slug
代替ids。
答案 1 :(得分:1)
您的“文章”表可以包含一个附加字段(“slug”是一个流行的名称,因此在您的示例中可能是'article_slug'),它既可以用作URL的一部分,也可以用作要查询的字段。通常,CMS会将'slug'显示为可编辑字段,但会预先填充页面标题的值(通常通过小写标题,将空格转换为破折号并清理任何URL不友好的字符,如引号)。