1.Laravel 分页

Laravel数据分页有多种方法。最简单的是使用 查询构造器 或 Eloquent query 的 paginate 方法。paginate 方法根据用户浏览的当前页码,自动设置恰当的偏移量 offset 和限制数 limit。默认情况下,HTTP 请求中的 page 查询参数值被当作当前页的页码。 Laravel 会自动检测该值,并自动将其插入到分页器生成的链接中。

默认分页链接都是 ?page=2 这种动态参数的方式进行分页,我们站在SEO角度,选用了/page/2这种格式。详细看Gitee上的代码,我们在这里贴一下关键代码。

实现这个功能我们需要使用到Laravel的自定义分页功能。

在调用分页器实例的 links 方法时,将视图名称作为第一个参数传递给该方法:

{{ $articles->links('cms::web.default.page') }}

然后贴一下 cms::web.default.page 页面的代码。

<nav id="post-nav">

    @if (($paginator->currentPage()) > 1)
        <a style="float: left;" href="{{cms_page_url($paginator->currentPage() - 1)}}">
            « 上一页
        </a>
    @endif

    @if ($paginator->currentPage() < $paginator->lastPage())
    <a href="{{cms_page_url($paginator->currentPage() + 1)}}">下一页 »</a>
    @endif
</nav>

 这里面使用了函数 cms_page_url (见Modules\Cms\Helper\functions.php)

/*
 * 分页
 */
if (!function_exists('cms_page_url')) {
    function cms_page_url($page, $option = [])
    {
        $path = preg_replace("/page\/[0-9]+/", "", request()->path());
        $url = "/" . trim($path, "/");

        foreach ($option as $key => $value) {
            $url .= "{$key}/$value/";
        }

        $url .= strlen($url) == 1 ? "page/{$page}" : "/page/{$page}";

        return cms_hook_call('cms_hook_page_url', $url);
    }
} 

2.分页标题

链接处理完了,就要处理下分页的标题了。如果不处理分页的标题,分页时标题都是重复的,这样对SEO优化很不友好。我们需要在标题上增加页码,比如 项目动态 - 第2页 - MyCms.

/*
 * 获取页面当前标题
 */
if (!function_exists('cms_the_title')) {
    function cms_the_title()
    {
        $value = '';

        $page = request()->route()->parameter('page');

        if (is_single()) {
            $value = session('single')->title;
        }

        if (is_category()) {
            $value = session('category')->name;
        }

        if (is_tag()) {
            $value = session('tag')->name;
        }

        if (is_home()) {
            $value = session('home')['site_name'];
        }

        if (is_search()) {
            $value = session('search') . ":搜索结果";
        }

        $value .= $page && $page > 1 ? " - 第{$page}页" : '';

        return cms_hook_call('cms_hook_the_title', $value);
    }
}

如果 page 大于1时,直接拼接 - 第{$page}页,简单粗暴,如果开启了SEO插件的朋友。可以在后台进行设置。

{page} 变量会在页码大于1时替换成 " - 第page页"。贴一下SEO插件分类的页面替换规则,其他页面的可以查看(Addons\Seo\Helpers\functions.php)

if (!function_exists('cms_category_seo_rule')) {
    function cms_category_seo_rule($value)
    {

        $page = request()->route()->parameter('page');

        return str_replace(
            ['{name}', '{description}', '{page}'],
            [session('category')->name, session('category')->description, $page && $page > 1 ? " - 第{$page}页" : '' ],
            $value
        );
    }
}

SEO插件