1. 程式人生 > >【Share Code | 每天一點PHP】如何建立一個簡單的PHP CMS以及生成SEO友好的URL

【Share Code | 每天一點PHP】如何建立一個簡單的PHP CMS以及生成SEO友好的URL

簡單的PHP CMS教程

SEO(Search Engine Opeimization, 搜尋引擎優化)對每個網站都是非常重要的。如果你不優化你的站點,搜尋引擎就不會找到你的網站。因此就沒有人訪問網站。
本教程只解釋SEO的一個方面,讓網頁有一個友好的URL。很多年前我們知道phpNuke和Joomla,但是他們都有一個相同的問題,那就是他們的網頁連結看上去都很醜:"index.php?id=653&page_type=blog&lang=en"。這些連結看上去都差不多,非常不容易輸入。像Google這樣的搜尋引擎也不喜歡這種型別的URL。

如今,新一代CMS出來了,有些是使用CodeIgniter框架製作,有些使用Moodle或者Drupal。但是這些CMS還是存在類似的SEO問題。Wordpress很快在這之後出來了。

這些CMS的一個缺陷就是,它們是為了一般用途的站點而製作的。例如,Wordpress最初是一個部落格系統,現在提供外掛來製作任何型別的網站。但對於這樣的系統,你需要大量的類,程式碼,外掛和維護。

另一件事是,您無法在獲取原始碼的情況下為客戶銷售GPL許可程式碼。 他們最終會聽到你讓他們為開源軟體付費,他們可能不喜歡這樣。

鑑於此,可能最好的解決方案是製作自己的CMS,輕量級。 您可以按照自己的意願許可它,在編寫它時就會非常清楚,並且擁有自定義資料庫結構。

我們將面臨的問題是"index.php?id=653&page_type=blog&lang=en"問題。因此,讓我們看看如何製作一個CMS具有SEO友好的URL。

PHP SEO友好URL連結

SEO友好連結必須有頁面標題,它們需要是可讀的,他們必須擺脫index.php。例如“how-to-make-seo-friendly-links”或“make-a-class-for-php-classes-site”,如你所見,其中沒有index.php,沒有任何檔案最終的名稱擴充套件,它是非常可讀的,你可以從連結獲得標題。非常重要的一點是,必須動態生成這些連結。

那麼讓我們回到“index.php?id=653&page_type=blog&lang=en”,當我們解決它時,我們有“index.php”,它是CMS中處理所有請求的最主要PHP檔案。

我們有文章的“id”引數,我們有一個“type”引數,本例中它的值是“blog”,但它可以是任何東西,product,article或blog。最後我們有一個“lang”引數,它適用於具有多種語言的網站,在本教程中,我將跳過“lang”引數。我們需要在“how-to-make-seo-friendly-links”連結中模仿相同的功能,所以我們這樣做:

  1. 將所有URL請求重定向到一個位置進行處理。
  2. 檢查連結表並獲取我們需要的資料,id和type。
  3. 根據元素型別,我們呼叫合適的外掛來處理和顯示資料。

將所有請求用一個指令碼處理

如果我們希望所有URL都由一個指令碼處理,或者說由ndex.php檔案處理,我們需要配置.htaccess檔案。 我們需要在我們的Web伺服器上安裝Apache,它通過.htaccess檔案提供配置控制。.htaccess檔案必須使用RewriteEngine指令啟用URL重寫模組。然後只需新增規則即可將所有請求轉至index.php。

RewriteEngine On
RewriteBase /cms/

RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteRule ^(.*)$ index.php?pid=$1 [QSA,L]

仔細設定這些指令很重要。在上面的示例中,我將所有流量重定向到index.php,除非有人直接訪問PHP或HTML檔案,或者請求路徑位於資料夾中的影象,CSS或JS。

使用[NC]標誌會使RewriteRule以不區分大小寫的方式匹配。 也就是說,它不關心字母在匹配的URI中是以大寫形式還是小寫形式出現。

開始編寫index.php

現在我們將所有請求都由index.php處理,這裡我們需要進行一般檢查:誰來到這裡以及他需要什麼。 index.php就像一個流量管理器。 我們需要捕獲即將到來的連結並使用我們之前生成的所有連結查詢MySQL資料庫中的特殊表,我們獲取與連結URL關聯的頁面的id和type。 讓我們先看看錶結構:

CREATE TABLE IF NOT EXISTS `members` (
  `memberID` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`memberID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `members` (`memberID`, `username`, `password`) VALUES
(1, 'admin', '$1$8I4.v32.$bV9MWNrNAFA1bdD/JS/FW1');
// Username - admin , Password - demo

下面讓我們看看PHP程式碼:

<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_USER_NOTICE);
define('pageclassconst', TRUE);
include_once 'admin/pages/pageClass.php';
$pageClass=new pagesClass();
$pageList=$pageClass->listPages();
$pid=$_GET[pid];
if($pid==""){
    $pageDetails=$pageClass->particularPageSlug($pageList[0]['URL']);
}
else
{
    $pageDetails=$pageClass->particularPageSlug($pid);
    if($pageDetails[id]==""){
        header("location:404.php");
    }
}
?>

如您所見,首先我們得到了請求URL中的“$pid”。然後我們使用語句查詢資料庫以獲取元素的type和id。如果該元素不存在,我們會將程式碼重定向到自定義的404頁面。

如何獲取SEO友好URL資訊

獲取我們元素的type和id之後,剩下的就簡單了。我們需要發起另一個請求根據URL型別去獲取元素細節。

因此,讓我們假設我們的CMS中有兩種型別的元素:products和blogs。 如果是blogs,我們會查詢blogs表並要求blogs.php檔案來處理該頁面。 如果是products,我們查詢products表並獲取其詳細資訊,然後我們呼叫products.php來顯示該頁面。這些是products和blogs表:

CREATE TABLE IF NOT EXISTS `pages` (
  `pageID` int(11) NOT NULL AUTO_INCREMENT,
  `pageTitle` varchar(255) DEFAULT NULL,
  `isRoot` int(11) NOT NULL DEFAULT '1',
  `pageCont` text,
  PRIMARY KEY (`pageID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
----------------------------------

CREATE TABLE IF NOT EXISTS `webpages` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `Title` varchar(255) NOT NULL,
  `URL` varchar(255) NOT NULL,
  `Keywords` varchar(150) NOT NULL,
  `Description` varchar(250) DEFAULT NULL,
  `PageDetails` varchar(5000) DEFAULT NULL,
  `PageName` varchar(90) DEFAULT NULL,
  `PageType` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
public function particularPageSlug($id) {
    $list="select * from webpages where URL='$id'";
    $result=  $this->query($list);
    $count=  $result->num_rows;
    if($count < 1){}else{
        while($row= $result->fetch_array(3)){
            return $row;
        }
    }
}

在管理介面中建立SEO連結

我們已經看到如何重定向URL請求到index.php並且根據URL型別決定顯示product和blog型別資訊。現在我們要看一下如何在管理介面建立這些連結並將它們新增到"urls"表。

當我們新增一個blog的時候,我們將所有資料插入到“blogs”表中,現在我們要獲取blog id。我們需要在“urls”表中使用這個id。我們還需要title去建立連結。現在我們將使用create_link()函式:

<?php
 public function addPage($data){
        $message=new alertClass();
        $data["PageDetails"]=$this->real_escape_string($data["PageDetails"]);
        $data["URL"]=$this->slug($data["URL"]);
        if($this->dulicatePage($data["URL"])<1){
        $keys=array_keys($data);
        $values=array_values($data);
        date_default_timezone_set ("Asia/Kolkata");
        $table="webpages";
        $query='INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ("'.implode('","', $values).'")';
        $result=  $this->query($query) or die($this->error);
        if($result){
                unset($_POST);
                return $message->getAlert("Page is added ", "success");
        }
        else
        {
                return $message->getAlert("Error while adding page", "error");
        }
        }
        else
        {
                return $message->getAlert("Already Exists", "error");
        }
}
?>

如您所見,我們總是首先插入部落格,然後獲取它的插入ID,並獲得標題。 然後我們使用create_link函式從標題建立一個新的URL,這樣我們就可以在urls表中插入一個新行。

下面我們開始寫slug()函式

<?php
private function slug($string){
    $string = strtolower(trim($string));
    $string = str_replace("'", '', $string);
    $string = preg_replace('#[^a-z\-]+#', '-', $string);
    $string = preg_replace('#_{2,}#', '_', $string);
    $string = preg_replace('#_-_#', '-', $string);
    $string = preg_replace('#(^_+|_+$)#D', '', $string);
    return preg_replace('#(^-+|-+$)#D', '', $string);
}
public function dulicatePage($name){
        $check="select * from webpages where URL='$name'";
        $result=  $this->query($check);
        $count=  $result->num_rows;
        if($count < 1){return 0;}else{return $count;}
}
?>

slug()函式獲取blog或product的title,並轉換成小寫。然後移除特殊字元以及將空白字元替換成“-”。

我們還需要檢查我們得到的URL是否已經存在於“urls”表中。我們需要讓所有的URL在表中都是唯一的。

我們使用dulicatePage()函式檢查URL是否重複。然後我們遞迴的呼叫“slug”,直到我們獲取唯一的URL。

示例程式碼是以一種簡單的方式編寫,方便您理解概念。它不應被視為真正的CMS中經過充分測試的東西。

參考