Backlinks.com 是目前使用人数最多、最容易上手和使用的网页文字链接交易平台。
Discuz! X 系列作为国内使用最广泛的论坛门户建站软件,其中 Backlinks.com 的用户也不少。但是,也正是因为 Discuz! 强大的模板机制,直接导致了我们难以便捷地向 Discuz! 的站点页面中添加我们需要的 PHP 代码,甚至只是 JavaScript。
本文将向大家详细介绍如何利用 Discuz! 自带的模板 Hook (钩子)功能向各页面添加自定义代码(PHP、JavaScript 均可)。
此方法是基于 Discuz! 的插件功能来实现的,整个过程不修改 Discuz! 核心代码,方便易用。
Step 1: 制作自定义代码插件
编写文件 install.php、uninstall.php、validator.xml、discuz_plugin_backlinks.xml、backlinks.class.php。内容分别如下:
install.php 文件内容:
<?php $finish = true; ?>
uninstall.php 文件内容:
<?php $finish = true; ?>
validator.xml 文件内容:
<?xml version="1.0" encoding="UTF-8"?> <root> <item id="Title"><![CDATA[Discuz! Plugin Validator]]></item> <item id="Version"><![CDATA[X2]]></item> <item id="Data"> <item id="0"><![CDATA[source/plugin/backlinks/backlinks.class.php]]></item> </item> </root>
discuz_plugin_backlinks.xml 文件内容:
<?xml version="1.0" encoding="UTF-8"?> <root> <item id="Title"><![CDATA[Discuz! Plugin]]></item> <item id="Version"><![CDATA[X2]]></item> <item id="Data"> <item id="plugin"> <item id="available"><![CDATA[1]]></item> <item id="adminid"><![CDATA[1]]></item> <item id="name"><![CDATA[Backlinks.com Code Installation]]></item> <item id="identifier"><![CDATA[backlinks]]></item> <item id="description"><![CDATA[( N/A )]]></item> <item id="datatables"><![CDATA[]]></item> <item id="directory"><![CDATA[backlinks/]]></item> <item id="copyright"><![CDATA[YChong.com]]></item> <item id="version"><![CDATA[1.0]]></item> <item id="__modules"> <item id="0"> <item id="name"><![CDATA[backlinks]]></item> <item id="menu"><![CDATA[]]></item> <item id="url"><![CDATA[]]></item> <item id="type"><![CDATA[11]]></item> <item id="adminid"><![CDATA[0]]></item> <item id="displayorder"><![CDATA[0]]></item> <item id="navtitle"><![CDATA[]]></item> <item id="navicon"><![CDATA[]]></item> <item id="navsubname"><![CDATA[]]></item> <item id="navsuburl"><![CDATA[]]></item> </item> </item> </item> <item id="version"><![CDATA[X2]]></item> <item id="installfile"><![CDATA[install.php]]></item> <item id="uninstallfile"><![CDATA[uninstall.php]]></item> <item id="var"> </item> </item> </root>
backlinks.class.php 文件内容:
<?php
class plugin_backlinks_forum extends plugin_backlinks {
function index_side_bottom_output() {
$output = '';
$output .= '<div id="portal_block_74" class="block move-span"><div style="background-image: url(static/image/common/title.png); background-repeat: repeat;" class="blocktitle title"><span class="titletext" style="margin-left: 10px; font-size: 12px;">友情链接</span></div><div id="portal_block_74_content" class="dxb_bc"><div class="module cl ml mls">';
// ===== Backlinks.com 代码 (修改后)开始 =====
// THE FOLLOWING BLOCK IS USED TO RETRIEVE AND DISPLAY LINK INFORMATION.
// PLACE THIS ENTIRE BLOCK IN THE AREA YOU WANT THE DATA TO BE DISPLAYED.
// MODIFY THE VARIABLES BELOW:
// The following variable defines whether links are opened in a new window
// (1 = Yes, 0 = No)
$OpenInNewWindow = "1";
// # DO NOT MODIFY ANYTHING ELSE BELOW THIS LINE!
// ----------------------------------------------
$BLKey = "";
if(strlen($_SERVER['SCRIPT_URI'])){
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_URI'].((strlen($_SERVER['QUERY_STRING']))?'?'.$_SERVER['QUERY_STRING']:'');
}
if(!strlen($_SERVER['REQUEST_URI'])){
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'].((strlen($_SERVER['QUERY_STRING']))?'?'.$_SERVER['QUERY_STRING']:'');
}
$QueryString = "LinkUrl=".urlencode((($_SERVER['HTTPS']=='on')?'https://':'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$QueryString .= "&Key=" .urlencode($BLKey);
$QueryString .= "&OpenInNewWindow=" .urlencode($OpenInNewWindow);
//if(intval(get_cfg_var('allow_url_fopen')) && function_exists('readfile')) {
// @readfile("http://www.backlinks.com/engine.php?".$QueryString);
//}
//elseif(intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) {
if(intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) {
if($content = @file("http://www.backlinks.com/engine.php?".$QueryString))
$output .= @join('', $content);
}
elseif(function_exists('curl_init')) {
$ch = curl_init ("http://www.backlinks.com/engine.php?".$QueryString);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch);
if(curl_error($ch))
$output .= "Error processing request";
curl_close ($ch);
}
else {
$output .= "It appears that your web host has disabled all functions for handling remote pages and as a result the BackLinks software will not function on your web page. Please contact your web host for more information.";
}
// ===== Backlinks.com 代码 (修改后)结束 =====
$output .= '</div></div></div>';
return $output;
}
}
?>
此处解释一下 Backlinks.com 提供的 PHP 代码结构。这段代码通过将唯一的识别码 $BLKey 以及当前页面 URL 等信息传送到 Backlinks.com,返回内容后直接显示在当前区域。代码共用了三个判断来兼容各种环境,这三个函数都是用来请求远程 HTTP 数据的。第一个是 readfile 函数,它取得参数中 URL 返回的数据后,直接打印在当前 HTML 位置,而不是输出到返回值(返回值是内容的长度);第二个是 file 函数,它返回的是一个将参数 URL 返回的数据以行分割的数组;第三个是 curl 系列函数,除非前面有 curl_setopt($ch, CUROPT_RETURNTRANSFER,1); ,否则该函数将直接在当前 HTML 位置打印返回的数据。
类中函数 index_side_bottom_output() 的意义是,捕捉模板中名为 index_side_bottom 的“钩子”,并在此“钩子”所在的位置执行函数 index_side_bottom_output()。我们也正是利用这一途径,将 Backlinks.com 的返回代码输出到页面中。
Step 2: 修改 Backlinks.com 提供的 PHP 代码
为了使程序依照我们的期望,在固定的模板 Hook 中显示返回的数据内容,我们需要修改 Backlinks.com 提供的 PHP 代码,使之将返回的数据内容写入 Hook 回调函数的返回值中,而不是直接在当前 HTML 输出位置打印数据内容。
找到代码片段的中部:
if(intval(get_cfg_var('allow_url_fopen')) && function_exists('readfile')) {
@readfile("http://www.backlinks.com/engine.php?".$QueryString);
}
elseif(intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) {
修改为:
if(intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) {
此处修改的含义为:去除对第一个函数 readfile 的判断(因为 readfile 函数不论如何都会直接打印返回的数据,而不能写入到某变量中),使之直接判断 file 函数和 curl 系列函数。
然后,将代码片段中的所有 print 替换为 $output .= ,意为将返回的数据内容追加到变量 $output 中(结尾直接将变量 $output 作为返回值返回给 Hook 回调函数)。
Step 3: 安装、激活插件
将上述的四个文件上传到 /source/plugin/backlinks 目录中,进入 Discuz! X 管理后台,点选安装新插件 Backlinks.com Code Installation 1.0。


完成后更新缓存,进入站点首页即可看到效果。
没有用过类似的平台。
Disucz! 应用挺广泛的