OELOVE:模版內傳參+XHook+PHP開發SEO僞靜態插件

請輸入圖片描述
在昨天的開發基礎上,閱讀了OELOVE的官方宣傳介紹文檔後,開發出了可以傳遞參數並實現絕大部分PHP功能的OE插件:大超超OE僞靜態助手php

開發思路:主要運用了系統預留的XHook鉤子類,因爲OE源代碼加密無從得之其具體實現方法。html

安裝方法:將源代碼保存爲dv_rewrite.php,在/source/plugin/下創建dv_rewrite文件夾,將dv_rewrite.php複製到新創建的文件夾下,而後在後臺插件和應用裏找到插件列表,啓用大超超OE僞靜態助手便可。mysql

調用方法:在模版相應輸出位置調用XHook::doAction並傳入參數,分別是插件內添加的識別名傳入的參數(多參數傳遞還沒有嘗試),將分頁動態連接替換爲靜態連接的示例調用方法以下。sql

<!--{if !empty($showpage)}-->
<div class="ft result-y">
    <div class="pagenum">
        <!--{XHook::doAction('dv_rewrite_page', $showpage)}-->
    </div>
</div>

插件源代碼:segmentfault

<?php
/*
Plugin Name: 大超超OE僞靜態助手
Version: v1.3
Plugin URL: http://www.thinkful.cn/archives/400.html
Description: 針對疑難僞靜態,提供地區id轉拼音、分頁連接替換、分頁標題SEO等優化功能。
For Version: OElove v3.x全部版本
Author: DCC
Author URL: http://www.thinkful.cn/
Last Update: 2014-01-27 16:32:55
*/
if(!defined('IN_OESOFT')) {
    exit('Access Denied');
}

// 返回城市id對應的拼音
function dv_rewrite_getSpreadnameById($arr) {
    $provinceid = $arr['provinceid'];
    $cityid     = $arr['cityid'];

    $sql = "select spreadname from ".DB_PREFIX."area where areaid=$cityid";
    $res = mysql_query($sql);
    // 若是沒有cityid,則調用provinceid @ 2014-01-26 15:51:27
    if( mysql_result($res, 0)=='' ){
        $sql = "select spreadname from ".DB_PREFIX."area where areaid=$provinceid";
        $res = mysql_query($sql);
    }
    return mysql_result($res, 0);
}

// 替換列表頁分頁href內容,生成僞靜態連接
function dv_rewrite_replacePagination($p, $rw_type='-init') {
    if( $rw_type==='-init' ){
        // 用戶列表替換
        $rw_type = $_GET['s_marry']==1 ? 'yk' : 'by';
        // 微播列表替換
        if( $_GET['c']=='weibo' ) $rw_type = 'weibo';
        // 招聘、日記(共用模版)列表替換
        if( $_GET['c']=='diary' ){
            $rw_type = $_GET['cid']==1 ? 'zp' : 'rj';
        }

    }
    $pattern = '/href="(.*?)index.php(.*?)page=(\d+)"/';
    $rewrite_res = 'href="${1}'.$rw_type.'/page-$3/"';
    echo preg_replace($pattern, $rewrite_res, $p);
}

// 詳細信息頁地區靜態連接函數
function dv_rewrite_spread($arr){
    echo dv_rewrite_getSpreadnameById($arr);
}

// 地區模版列表替換靜態連接
function dv_rewrite_locationPagination($p){
    $arr = array(
        'provinceid' => $_GET['s_dist1']+0,
        'cityid'     => $_GET['s_dist2']+0
    );
    // 生成list-type,共用替換函數
    $rw_type = dv_rewrite_getSpreadnameById($arr);
    dv_rewrite_replacePagination($p, $rw_type);

}

// 向文本後添加第幾頁(若是有)
function dv_rewrite_fixTitle($s){
    if( $_GET['page'] ){
        $page = '第'.$_GET['page'].'頁';
        // 是標題
        if( strpos($s, '-') ){
            $tmparr = explode('-', $s);
            $end = end($tmparr);
            $tmparr[count($tmparr)-1] = $page.'-'.$end;
            $s = join('-', $tmparr);
        }
        // 是關鍵詞和描述
        else{
            $s = $s.','.$page;
        }
    }
    echo $s;
}

// 根據地區id生成附近地區連接 @ 2014-01-27 15:52:13
function dv_rewrite_generateAreaLinks($provinceid){
    $sql = "select areaname,spreadname from ".DB_PREFIX."area where rootid=$provinceid";
    $res = mysql_query($sql);
    while( $r=mysql_fetch_array($res, MYSQL_ASSOC) ){
        extract($r);
        $s .= '<a href="'.PATH_URL.$spreadname.'/">'.$areaname.'*</a>';
    }
    echo $s;
}

// 添加綁定事件
// 列表頁(用戶、日記、招聘共用)替換靜態連接
XHook::addAction('dv_rewrite_page', 'dv_rewrite_replacePagination');
// 詳細信息頁地區靜態連接
XHook::addAction('dv_rewrite_spreadname', 'dv_rewrite_spread');
// 地區模版列表替換靜態連接
XHook::addAction('dv_rewrite_morepage', 'dv_rewrite_locationPagination');
// 分頁時便於SEO須要修改標題、關鍵詞和描述
XHook::addAction('dv_rewrite_pageSEO', 'dv_rewrite_fixTitle');
// 生成附近地區連接
XHook::addAction('dv_rewrite_arealinks', 'dv_rewrite_generateAreaLinks');
?>

開發這個插件的同時在作一個WEB項目,時間相對較緊迫,不免有些疏忽和不高效之處,歡迎指正。
項目爲大,插件爲小,開發插件權當練手,一點一點積累基礎才能出大成績,加油。函數

原文地址:http://www.thinkful.cn/archives/400.htmlfetch

相關文章
相關標籤/搜索