Hôm nay mình sẽ đề cập đến các vấn đề về sitemaps như sau

  • Định nghĩa sitemaps là gì .Tại sao phải dùng sitemap
  • Tạo sitemaps trong yii2

Định nghĩa sitemaps

Sitemap là một tập tin văn bản có chứa tất cả các URL (đường dẫn) của một trang web. Sitemap còn có thể chứa các siêu dữ liệu về mỗi URL có chức năng gửi .Ví dụ như sitemap site mình :http://hbsprogram.com/post-sitemap.xml hoặc http://demo.hbsprogram.com/sitemap

Để site được google hoặc bing index nhanh có 2 cách là

  • Submit link https://www.google.com/webmasters/tools/submit-url-ac
  • Tạo sitemap và gửi cho google qua webmater ở đây https://www.google.com/webmasters/tools/home?hl=vi

Tạo sitemaps trong yii2

Để tạo sitemaps trong yii2 giống như mình sẽ đưa ra bạn cần làm theo các bước sau :

Tạo cơ sở dữ liệu :

--
-- Table structure for table `slug`
--

CREATE TABLE `slug` (
  `id` int(11) NOT NULL,
  `title` varchar(500) NOT NULL,
  `content` varchar(5000) NOT NULL,
  `slug` varchar(500) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `slug`
--
ALTER TABLE `slug`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `slug`
--
ALTER TABLE `slug`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

Tạo 1 bảng lên là slug

Bước 2 : Bạn tạo models để truy cập dữ liệu trong phần common/models :

<?php

namespace common\models;

use Yii;
use yii\behaviors\SluggableBehavior;

/**
 * This is the model class for table "slug".
 *
 * @property integer $id
 * @property string $title
 * @property string $content
 * @property string $slug
 */
class Slug extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'slug';
    }
	public function behaviors()
	{
		return [
    			[
    					'class' => SluggableBehavior::className(),
    					'attribute' => 'title',
    					 'slugAttribute' => 'slug',
    			],
    	];
	}
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['title', 'content', 'slug'], 'required'],
            [['title', 'slug'], 'string', 'max' => 500],
            [['content'], 'string', 'max' => 5000],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'title' => Yii::t('app', 'Title'),
            'content' => Yii::t('app', 'Content'),
            'slug' => Yii::t('app', 'Slug'),
        ];
    }
}

Giờ đến phần quan trọng nhất là controller SitemapControllers trong phần frontend :

<?php
namespace frontend\controllers;
use Yii;
use yii\base\Controller;
use yii\filters\AccessControl;
use common\models\Slug;
use function Symfony\Component\Debug\header;
use yii\helpers\Url;

class SitemapController extends Controller
{
	public function behaviors()
	{
		return [
			'access' =>
				[
						'class' => AccessControl::className(),
						'rules' =>
						[
								
								['actions'=>['index','xml'],
								'roles'=>['?','@'],
								'allow'=> TRUE,],
						]
				]
		];
	}
	public function actionIndex()
	{
		//set content type xml in response
		\Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
		$list = SitemapController::populateSitemap();
		$headers = Yii::$app->response->headers;
		$headers->add('Content-Type', 'text/xml');
		//set the view and render it partial to skip the layout to be rendered as well
		return $this->renderPartial('xmlview', ['list'=>$list]);
	}
	public function populateSitemap()
	{
		// xml slug dữ liệu
		$slug = Slug::find()->all();
		foreach ($slug as $row)
		{
			$list[] =[
					//nếu trang web sử dụng https thì thay true bằng https ;
					'loc' => Url::to(['slug/viewslug','id'=> $row['id'],'slug'=>$row['slug']], true),
					'frequency' =>'weekly',
					'priority' =>'0.8',
			];
		}
		
		$list[]= [
				'loc' =>'/',
				'frequency' =>'weekly',
				'priority' =>'1',
		];
		return $list;
	}
}

Ở đây các bạn chú ý phần thứ 1 là mục behaviors() trong đó rules các bạn để quyền truy cập là @ và ? để mọi người có thể truy cập vào sitemap kể các các robot của các công cụ tìm kiếm

Tiếp theo là phần xét đinh dạng trả về của dữ liệu dạng xml với các câu lệnh

//set content type xml in response
	\Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
	$headers = Yii::$app->response->headers;
	$headers->add('Content-Type', 'text/xml');

Ok vậy là xong phần controller các bạn chú ý nhé

Tiếp theo chúng ta sẽ đến phần views

<?php
use yii\helpers\Html;
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<urlset>
<?php foreach ($list as $row):?>
<url>
<loc><?= Html::encode($row['loc'])?></loc>
<changepreq><?= Html::encode($row['frequency'])?></changepreq>
<priority><?= Html::encode($row['priority'])?></priority>
</url>
<?php endforeach;?>
</urlset>

Vậy là đã xong phần sitemaps .Các bạn có thể đổi link sang dạng sitemap.xml với việc thêm rules ở phần urlManager trong frontend/config/main.php như sau :

'sitemap.xml' =>'sitemap/index'

Ok vậy là đã xong .Bây giờ các bạn có thể tạo ra sitemap cho website mình 1 cách nhanh chóng và tiện ích .

Các bạn có gì không hiểu hãy để lại comment dưới bài viết .Mình rất vui nếu các bạn chia sẻ bài viết này đến với bạn bè mình để chúng ta cùng nhau học tập nhé