0

我正在开发基于 CodeIgniter 的自定义博客。目前我已经实现了一些问题 url:

/blog/view/1/my-very-first-post

我不满意我想摆脱 id 和“/view”

这就是我的控制器的样子:

  function index($postId=null)
        {
            $this->view($postId=null);
        }


        function view($postId, $str_slug = '')
        {
                $data['title'] = ucfirst("Blog");
                $data['post'] = $this->posts->get_posts($postId);
                if($postId !== null)
                {
                        $this->load->view('templates/head', $data);
                        $this->load->view('templates/header', $data);
                        $this->load->view('posts/single_view', $data);
                        $this->load->view('templates/footer',$data);         
                } else {
                        $this->load->view('templates/head', $data);
                        $this->load->view('templates/header', $data);
                        $this->load->view('posts/index', $data);
                        $this->load->view('templates/footer',$data);
                }

                $row = $this->db->get_where('posts', array('id' => $postId))->row();

                if ($row and ! $str_slug) {

                    $str_slug = url_title($row->title, 'dash', TRUE);
                    redirect("blog/view/{$postId}/{$str_slug}");

                }               
        }

实现这一目标的最佳方法是什么?

谢谢!!亚当

4

2 回答 2

2

我认为您正在寻找_remap()方法。您可以在此处阅读更多信息:http: //ellislab.com/codeigniter/user-guide/general/controllers.html#remapping

您的代码如下所示。如果您仍然需要它,您仍然需要实现 get_posts_by_slug() 方法。

public function _remap($slug) {
    $data['title'] = ucfirst("Blog");
    $data['post'] = $this->posts->get_posts_by_slug($slug);

    if($slug !== null)
    {
            $this->load->view('templates/head', $data);
            $this->load->view('templates/header', $data);
            $this->load->view('posts/single_view', $data);
            $this->load->view('templates/footer',$data);         
    } else {
            $this->load->view('templates/head', $data);
            $this->load->view('templates/header', $data);
            $this->load->view('posts/index', $data);
            $this->load->view('templates/footer',$data);
    }

    $row = $this->db->get_where('posts', array('slug' => $slug))->row();
}

更新:嘿@AdamLesniak - 将永久链接存储到博客文章或新闻文章通常是一个很好的设计,这样它就不会依赖于标题或任何其他易失性数据结构以便仍然可以访问。

但是对于不同的方法,就个人而言,我真的认为这是一个不错的系统:

http://localhost/blog/my-news-article-title-permalink/3

主要问题是,如果您不将 slug/永久链接存储在某处,那么当有人更改文章标题时,您会感到难过。例如,我的文章名为“Hello World First Blog Post”,可在以下位置访问:

http://localhost/blog/hello-world-first-blog-post

更改为“我做过的第一篇文章”:

http://localhost/blog/first-post-i-ever-made

那么初始 URL 会怎样呢?它不再可访问 - 通过搜索引擎或通过某人的链接进入网站的任何用户现在将不再看到您的评论,而是会得到一个 404 页面,这是您想要避免的。

单独使用永久链接的一个问题是您需要确保它们是唯一的,并且需要为此设置额外的约束。

您可以使用一些技巧,但它们都有自己的陷阱。例如,您可以使用我上面提到的系统,将唯一标识符粘贴在 URL 的末尾:

http://localhost/blog/hello-world/3

如果标题改变了,你并不在乎,因为你没有使用 slug 进行搜索,而是依赖于唯一标识符。

http://localhost/blog/first-post-i-ever-made/3

但是,我看到有人认为这种系统与 URL(统一资源定位器)的想法背道而驰。我刚开始的时候用过它,它被证明是一个灵活的系统;至少尝试一下肯定很好。

BBC 通过保留文章所属的类别和条目的唯一标识符来执行上述操作:

http://www.bbc.co.uk/news/business-24511283

基本上,他们知道一篇文章永远不会改变它的类别,尽管它可能会改变它的标题,所以他们只保留一般主题,即商业和唯一标识符24511283

最后,我建议你做的,因为它是迄今为止最具可扩展性的解决方案是生成以下格式:

http://localhost/blog/permalink/unique-id

上面的格式让你有唯一的标识符,这对于保证奇异性很重要,以及所有搜索引擎友好性的永久链接!现在如果文章的标题发生变化,在页面上向用户显示更新的标题,但不要对永久链接做任何事情,这样你的 URL 就不会改变。

通过在 URL 中使用 ID,您可以确定可以多次使用永久链接,并且您的系统仍然可以正确扩展。

于 2013-10-13T19:46:01.430 回答
1

我写了一个可能有帮助也可能没有帮助的教程:http ://www.rappasoft.com/tutorials/14-seo-friendly-links-with-codeigniter.html

于 2013-10-14T13:46:27.237 回答