0

我正在尝试使用 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

根据这个网站,一个很好的 SEO 友好 URL 的例子是http://www.mysite.com/joomla-seo-tips

现在我的问题是如何使我的 URL 看起来像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
4

2 回答 2

2

当你保存记录时,通过url_title()在标题上运行给它一个 URL slug(这应该是一个唯一的列,确保在保存时检查重复的条目)。

url_title("My page title!")应该返回类似的东西my-page-title,请参阅url 帮助程序。我通常strtolower也使用蛞蝓,看起来 CI 允许上限。

当您查询内容时,通过 获取它slug,例如:

$this->db->where('slug', $this->uri->segment(1))->get('articles'); 

当然,使用slug你的链接而不是 ids。

于 2012-05-11T04:26:33.013 回答
1

您的“文章”表可以包含一个附加字段(“slug”是它的常用名称,因此在您的示例中可能是“article_slug”),它既用作 URL 的一部分,又用作查询的字段。通常,CMS 会将“slug”显示为可编辑字段,但会使用转换后的页面标题的值预先填充它(通常通过将标题小写、将空格转换为破折号并清除任何 URL 不友好字符,如引号)。

于 2012-05-11T04:28:24.733 回答