2014-06-24
利用Discuz checkrobot() 函数给搜索引擎的蜘蛛爬虫启用301重定向

在搜索相关资料时,看到不少朋友拿“跳转”来干“坏事”,例如欺骗友链。因为Discuz 换了默认域名,而www 仅做简单的展示。这次给蜘蛛作301 重定向的目的就是为了提供更好的用户体验,同时也避免因为“主页”做了大规模的变动而导致搜索引擎大K。

Discuz checkrobot() 函数:

checkrobot() 函数已在source/function/function_core.php 中定义

function checkrobot($useragent = ‘’) {
static $kw_spiders = array(‘bot’, ‘crawl’, ‘spider’ ,’slurp’, ‘sohu-search’, ‘lycos’, ‘robozilla’);
static $kw_browsers = array(‘msie’, ‘netscape’, ‘opera’, ‘konqueror’, ‘mozilla’);

$useragent = strtolower(empty($useragent) ? $\_SERVER\['HTTP\_USER_AGENT'\] : $useragent);
if(strpos($useragent, 'http://') === false && dstrpos($useragent, $kw_browsers)) return false;
if(dstrpos($useragent, $kw_spiders)) return true;
return false;

}

判断蜘蛛,启用PHP 301 重定向

新建一个php 页面,引入Discuz 核心类source/class/class_core.php:

发送301 HTTP 状态码后,跳转至新地址http://newdomain.com/。

使用蜘蛛模拟工具查看结果

使用较多的就是Chinaz 的工具了,执行一下蜘蛛模拟访问,发现输出了预期的新地址网页内容,也就是成功了。普通访客即非robot 不会遇到301 重定向。简单地完成任务!

Read More

2014-04-17
修改Discuz forumdisplay_subforum.htm,实现显示子版块主题分类!

$value[name]

插件钩子

之前添加数据查询循环调用。 弊端是,如果启用了主题分类的子版块有N 个,那么将会增加N 次Mysql 的Query,所以footer 下面的Queries 会增加N 条。不知道有没有什么好的解决方法…

Read More

2014-04-10
让Discuz 安卓独立客户端帖子内容页展示分类信息字段

参照之前《简单修改,让Discuz 手机触屏版默认帖子内容页模板显示分类信息内容》一文,举一反三,其实要在Discuz 的独立客户端里实现贴内分类信息的展示并不难。终于可以抛掉使用“温馨提示”来引导用户切换模板的尴尬局面了(见:Discuz 手机版”触屏版” 通过版块判断为viewthread模板页添加自定义文本) 根据经验,要实现起来非常简单! Discuz 安卓独立客户端插件启用后,插件目录位于source/plugin 的mobileoem 中。 查看目录结构:

[root@localhost mobileoem]# tree
.
├── api
│ ├── pushlist.php
│ ├── pushtomobile.php
│ ├── refreshpush.php
│ ├── register.php
│ ├── removepush.php
│ ├── sendtopc.php
│ └── threaddetail.php
├── discuzcode.func.php
├── discuz_plugin_mobileoem.xml
├── index.htm
├── install.php
├── json.class.php
├── mobileoem.class.php
├── mobile.php
├── qrcode.class.php
├── setting.inc.php
├── static
│ ├── image
│ │ ├── cloud.png
│ │ ├── icon_reply.png
│ │ ├── load_pic.png
│ │ └── push.png
│ └── js
│ ├── index.htm
│ ├── iscroll.js
│ └── viewthread.js
├── switch.php
├── table
│ ├── table_mobileoem_member.php
│ └── table_mobileoem_pushthreads.php
└── template
├── downloadguide.htm
├── mobileoem
│ ├── common
│ │ ├── header.htm
│ │ └── showmessage.htm
│ └── forum
│ ├── discuzcode.htm
│ ├── viewthread.htm
│ ├── viewthread_node_body.htm
│ └── viewthread_node.htm
└── module.htm

9 directories, 34 files

客户端帖子主题也模板文件是viewthread_node_body.htm,只要修改一下就可以用了。 找到$post[message],在上面添加以下内容:

$option[title]:

$option[value] $option[unit]-

就完成了。仅仅是循环输出各个字段的内容,不启用分类信息模板,毕竟仅是手机网页,简洁才能有好体验。另外,为了看起来舒服点,可以定义一点css style!


顺便说一下,Discuz 的客户端除了首页有个登陆入口外,真找不到其它的了,如有好位置,可以添加一个“A”标签来调用客户端的登陆页:

[登陆](javascript:AppInterface.toLogin())
Read More

2014-04-10
Discuz Nginx 301 重定向规则,解决二级域名多入口问题

Discuz 在启用了版块或者频道的二级域名时,可通过改二级域名访问论坛的url并且不会自动纠正,似乎不太友好。之前用apache 也写了rewrite 规则实现重定向,但现在切换至nginx,需要重新配置一下,但也很简单: 原来的apache rewrite 规则:

RewriteCond %{HTTP_HOST} ^a.domain.com$
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ http://www.domain.com/thread-$1-$2-$3.html [L,R=301]
RewriteRule ^forum.php(.)$ http://www.domain.com/forum.php$1 [L,R=301]
RewriteRule ^archiver(.
)$ http://www.domain.com/archiver$1 [R=301,L]

nginx 规则:

if ($host != ‘www.domian.com')
{
rewrite ^/forum.php(.)$ http://www.domain.com/forum.php$1 permanent;
rewrite ^/forum-(.
)$ http://www.domain.com/forum-$1 permanent;
rewrite ^/thread-(.)$ http://www.domain.com/thread-$1 permanent;
rewrite ^/archiver(.
)$ http://www.domain.com/archiver$1 permanent;
}

因为是多个二级域名的关系,所以将所有$host 不是“www.domain.com” 都rewrite 到“www.domain.com” 下面。将这段规则放到Discuz 生成的规则上面就好了。 看一下效果:

ying@ying-desktop:~/Desktop$ wget http://a.domian.com/thread-18513-1-1.html--2014-04-10 13:28:56– http://a.domain.com/thread-18513-1-1.html
正在解析主机 a.domain.com (a.domain.com)… 114.215.101.226
正在连接 a.domain.com (a.domain.com)|114.215.101.226|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 301 Moved Permanently
位置:http://www.domain.com/thread-18513-1-1.html [跟随至新的 URL]
–2014-04-10 13:28:57– http://www.domain.com/thread-18513-1-1.html
正在解析主机 www.domian.com (www.domain.com)... 114.215.101.226
再次使用存在的到 a.domain.com:80 的连接。
已发出 HTTP 请求,正在等待回应… 200 OK
长度: 未指定 [text/html]
正在保存至: “thread-18513-1-1.html”

\[     <=\>                               \] 106,477      100KB/s   用时 1.0s
Read More

2014-04-09
Discuz 添加自定义语言包(source/language/lang_*.php) 并在模板中调用

没有系统学习过Discuz,想来些diy 确实吃力。现在我要加载一个语言包在source/language/lang_identifier.php 这个 lang_identifier.php是我自定义的。 内容:

‘名字’,
);

?>

目前只知道需要在模板中用php 使用Discuz 的lang 函数输出,不知道有没有更直观的方法?

lang() 函数位于source/function/function_core.php 中:

function lang($file, $langvar = null, $vars = array(), $default = null) {
}

$file 如果写成不包含路径的文件,则代表 source/language 目录下的文件。如果包含目录,如 ‘forum/misc’,则代表 source/language/forum/lang_misc.php 文件。如果写成 plugin/插件id,则会读取插件的语言包文件,即 data/plugindata/lang_plugin.php,此文件是根据安装并启用的插件缓存后生成的。

Read More

2014-04-08
给Discuz 的发帖按钮加个判断,自动补上当前主题分类(分类信息) 的typeid (sortid)

默认Discuz X3.1 发帖按钮的作用就是简单地在当前版块发表新主题!自己搭建的Discuz 站点,划分了一定量的主题分类及分类信息,而在使用论坛的使用过程中,会遇到这样的场景: 进入A 版块,选中A 版块的A-a 主题分类来浏览该主题分类下的所有帖子。然后点击发帖按钮发布新主题。结果在发帖的时候,默认不会选择主题分类,必须再一次执行选择主题分类的操作! 这个给我的感觉就是累,像我这样“低智商”的用户,更喜欢”傻瓜式“的类似”所见即所得“的操作方式,而不是”再一次“执行旧动作。 好了,既然如此,那就弄个判断,给Discuz 的发帖按钮添加上当前主题分类或分类信息的id,让发帖按钮触发的发帖链接带上主题分类或分类信息! 涉及的模板文件:

  1. template/default/forum/forumdisplay.htm (版块主题列表页)
  2. template/default/forum/forumdisplay_list.htm (版块主题列表页)
  3. template/default/forum/viewthread.htm (帖子内容页)

forumdisplay.htm 及forumdisplay_list.htm 这两个文件的修改方法是一样的。 找到发帖按钮所在的位置:

{lang send_posts}

在 forum.php?mod=post&action=newthread&fid=$_G[fid] 后面添加上主题分类及分类信息的判断及输出:

{if ($_G[‘forum’][‘threadtypes’] && $_G[‘forum’][‘threadtypes’][‘listable’]) || count($_G[‘forum’][‘threadsorts’][‘types’]) > 0}{if $_GET[‘typeid’] != 0}&filter=typeid&typeid={$_GET[‘typeid’]}{/if}{if $_GET[‘sortid’] != 0}&sortid=$_GET[‘sortid’]{/if}{/if}

最后变成:

{lang send_posts}

forumdisplay.htm 里还有个通过发帖按钮触发的onmouseover 事件,触发的事件就是发帖按钮下面的ul 列表,其中第一个li 默认是:

这里也总要加上吧:

{if $_GET[‘typeid’] != 0}&filter=typeid&typeid=$_GET[‘typeid’]{/if}{if $_GET[‘sortid’] != 0}&sortid=$_GET[‘sortid’]{/if}

最后是这样子的:

至此,Discuz 主题列表页的修改已经完成。然后,还需调整的地方就剩下帖子内容页viewthread.htm 里面的发帖链接了。


与主题列表页基本一致的发帖按钮(链接):

{lang send_posts}

但对应的变量不同了,所以按照主题列表页的方法会出错,需要加入的判断为:

{if $_G[‘forum_thread’][‘typeid’] && $_G[‘forum’][‘threadtypes’][‘types’][$_G[‘forum_thread’][‘typeid’]] && $_G[forum_thread][typeid] != 0}&filter=typeid&typeid=$_G[forum_thread][typeid]{/if}{if $_G[‘forum’][‘threadsorts’] && $_G[‘forum_thread’][‘sortid’] != 0}&sortid=$_G[forum_thread][sortid]{/if}

最后这段发帖链接变为:

{lang send_posts}

对应的onmouseover 事件:

变更为:


有两个比较需要留意的地方

  • 一个是发帖按钮对后台是否启用了分类信息的“发帖必须归类”选项有个值判断:

    !$_G[‘forum’][‘threadsorts’][‘required’]

    这里,我是直接去掉了这个判断,因为我启用了这个选项,版块对应的特殊主题也是关闭的,加入的内容随便放在if 或者else 之后估计不会有太大影响。当然如果有问题,还请指出:)

  • 另外一个,不是很重要,只是加上了typeid 及 sortid 是否等于0 的判断,因为如果不加上,那么在主题列表页没有选择主题分类或分类信息及相关帖子没有启用主题分类或分类信息时,发帖按钮(链接)激活的typeid 及sortid 值均为0,虽然没什么影响,但看起来十分不雅,so…
Read More

2014-04-04
简单修改,让Discuz 手机触屏版默认帖子内容页模板显示分类信息内容

之前特发一文《Discuz 手机版”触屏版” 通过版块判断为viewthread模板页添加自定义文本》以记录在Discuz 上获得的“重大突破”,最近才发现成“笑话”了。与其给Discuz 中的分类信息来个“温馨提示”,还不如直接让它显示出来,用户体验提升又提升一个层次。继续写文备忘… 继续浏览Discuz X3.1 触屏版帖子展示页模板:template/default/touch/forum/viewthread.htm,发现在主题输出段与普通标准版的内容是一致的,为什么不会和标准版模板一样输出分类信息内容呢?

{lang has_expired}

$_G[forum][threadsorts][types][$_G[forum_thread][sortid]]

$option\[title\]: $option\[value\] $option\[unit\]--  

后来往上翻,发现执行一句PHP 语句:

原来变量$threadsort 值已经赋值了,值为null,那么以下有关$threadsort 的if 判断当然被否认了,也就是“!”。直接去掉这段赋值语句,Discuz X3.1 的触屏版就能循环输出分类信息字段内容了。但输出模板真的很难看…如果要调用后台分类信息的“diy 调用模板”,有朋友说可以通过以下方式实现:

  • 原loop 循环段:
$option\[title\]: $option\[value\] $option\[unit\]--  
  • 替换为:

    $threadsortshow\[typetemplate\]
    

    提示:必须在分类信息模板的 DIY调用模板 编写好HTML样式

Read More

2014-04-02
Discuz 插件设计:添加版块多选(forums)变量

不是说最近准备学习Discuz 插件的编写了,整个过程都是为了实现在某版块显示子版块主题分类这一小功能而折腾的。因为相关知识异常的缺乏,所以耗时巨长,还迫于记忆力不好,所以赶紧写文备忘。其实Discuz 的开发文档已经非常完善了,只不过对于我等菜鸟来说还是有点难吃消。 开始编写一个新插件,请首先打开 config/config_global.php 文件,在文件结尾添加以下代码开启插件设计者模式。

$_config[‘plugindeveloper’] = 1;

按照Dicusz 的要求,“设置”、“模块”就不说了,在“变量”选项卡添加一个版块多选(forums)变量,如配置变量名为“forumsAllowed”。然后相关“模块”文件中加入判断即可。

global $_G;
@extract($_G[‘cache’][‘plugin’][‘identifier’]);
if(!in_array($_G[‘fid’],(array)unserialize($forumsAllowed))) return ‘’;
else {

}
Read More

2014-03-14
Discuz 手机版"触屏版" 通过版块判断为viewthread模板页添加自定义文本

目前移动互联网那么火热,虽然是小草根在做点小事情,但确实也感受到这玩意的强大。方便、快捷、精准!突然间有点小兴奋也有点担忧。就是这样,作为半个屌丝的存在,赶紧为在Discuz 手机版发现的问题找个解决方法。目前Discuz 3.1 的触屏版对内容的呈现方式,许多网友都习惯了,但是在分类信息这块却特别无力。考虑到个人联系电话的私密性,已将号码段划分为”分类信息“并设置登陆可见,但是最新Discuz 3.1 手机触屏版并不会显示任何分类信息字段,甚至连个提示都没有,只有在“标准版”下才可见,部分刚刚接触的网友会很无奈地在回帖里咨询”联系电话“- -! 迫于没有足够资金定制手机模板及过硬的开发技术的情况下,只能折衷地手动将这个“提示” 添加上去了。 guest member 相关文件:

  • /template/default/touch/forum/viewthread.htm

添加位置: 将下面这段代码添加至

这个div 关闭前。

自定义添加的内容:

温馨提示:此帖为分类信息,查看楼主联系电话请

 [{lang register}](<!--{if $_G['setting']['regstatus']}-->member.php?mod={$_G[setting][regname]}<!--{else}-->javascript:; "{$_G['setting']['reglinkname']}") | [{lang login}](member.php?mod=logging&action=login "{lang login}") 后 [切换至“{lang no_simplemobiletype}”]({$_G['setting']['mobile']['simpletypeurl'][0]}) 。

[切换至“{lang no_simplemobiletype}”]({$_G['setting']['mobile']['simpletypeurl'][0]}) 。

由于个人相关知识有限,如果这段代码有问题,欢迎指正!

关于几个判断:

判断是否是Fist Post,即“楼主”。因为这个提示仅是针对“查看楼主联系电话”,所以只需对主题作者所在楼层做手脚即可。

版块判断!就是多个版块的fid,有多少个启用了分类信息的版块,就or 上几个。

判断用户是否登陆,游客则显示“…” else 会员则显示“…”


其实更简单的还是直接判断版块是否启用了分类信息功能:

Read More

2013-04-11
Discuz 利用showWindow自定义浮动窗口

最近微信收费闹得很响,看来微信确实太火,不得不重视,所以为了响应潮流必须也整个公众微信并在网站上面添加上二维码方便关注。由于插件实在太多了,加个微信还得弄个新插件感觉不是很好,而且这么小的功能都需要用插件来实现的话也太麻烦了,所以回去看了看7drc提供的一些单页制作和了解了一些Discuz的showWindow 函数。于是决定自己动手了。 关于Discuz js的showWindow(k, url, mode, cache, v) 函数,以下列表说明各个参数的含义:

key

默认值

含义

可选值及解释

k

(必填)

浮窗的 key

url

(必填)

get 方式 url 表示浮窗请求的地址 post 方式 url 表示浮窗提交的表单 id

mode

‘get’

弹窗请求类型

get: ajaxget 方式请求 url post: ajaxpost 方式请求 url

cache

1

是否缓存弹窗内容

1:是 0:否

v

由于 showWindow() 是以 showMenu() 函数为内核,因此此处可微调 showMenu() 参数,如不指定则使用 howWindow() 的默认值

提示:

  • 同一页面同时可以弹出多个浮窗,但 k 及 url 相同的浮窗同时只能显示一个。
  • 浮窗标题区域支持拖拽。
  • 另外关闭浮窗请使用 hideWindow(k)。

具体使用实例可参照官网:http://www.discuz.net/thread-2190572-1-1.html。 下面简单整理单页的创建过程: 根据“体无完肤”提供的单页制作方法:http://www.discuz.net/thread-2233010-1-1.html,自定义微信单页的php文件和htm模板文件。 gaozhoubawx.php文件内容:

init();
$navtitle = ‘高州吧官方微信’;
$metakeywords = ‘高州吧官方微信’;
$metadescription = ‘高州吧官方微信, 微信账号:gaozhoubawx’;
include template(‘forum/gaozhoubawx’);//调用单页模版文件
?>

gaozhoubawx.htm文件内容:

###
高州吧官方微信
关闭

![](http://www.gaozhouba.com/files/image/static/gaozhoubawx.jpg)

扫描二维码

使用微信扫一扫左边的二维码

或者直接添加

**微信帐号:****gaozhoubawx**

需要创建的文件已经完成,然后在模板加入代码插入。 将php文件放置论坛根目录,htm文件放置/template/default/forum/目录下。

这样就顺利完成了。

.archives_350 {} .archives_350 td {border:1px solid #642;}

Read More