WordPress在首页文章显示评论的方法

前一阵给TTT弄了个博客:http://ttt.jennal.cn/
TTT周五有个要求,她要博客的首页可以看到评论,不要点进去才能看到,那样太麻烦。
在网上找了很多资料,没有找到单独对这个进行介绍的。所以只好找了其他很多资料,加上不断的尝试,昨晚做到快4点,为了防止这次伟大的事件在我的记忆中被删除,还是写下来纪录一下。
要在首页显示评论,我们需要修改四个文件(可能你的文件命名会有些不同,没有关系)。
这些文件都位于wp-content/themes/我的主题目录下

index.php很简单,在你要放评论的地方加上如下代码,当然要放在日志的循环里面:

$withcomments 是一定要设置的,首页默认为0
至于comments_template这个函数,它会帮你comments先取出来,供你的模板使用。如果有看文档的话,应该知道有一个wp_list_comments函数,这个函数的参数没有接受postId,它是不做数据库查询工作的,具体它是怎么工作的,我也没有深究,只是用到它的回调功能来自定义我们的comments列表,这个在下面会提到。
下面我们来看一下homepage_comments.php怎么写

本来以为直接在comments模板里面写结构和样式就可以了。但是发现不行,除非直接去取$wp_query->comments,但是这样不好,最好还是调用它的API,不然以后版本升级可能要出问题。
这里我把wp_list_comments的全部参数都列出来了,其实没有必要,只要设置你想要的参数就可以了。
这里要补充一下需求,我不希望把所有的评论都列出来,我只要列出最新的3条,而且要倒序,就是最新评论的在最上面。所以我把per_page设置成3,reverse_top_level设置成true。但是这样有个问题,显示的时候是显示最后一页,可能你有4条评论,那它只会显示第4条。在不改变和添加新API的情况下,我没想出解决的办法。如果在看这篇文章的你知道怎么解决,请告诉我。顺便说一下,type如果设置成别的可能会出问题。我之前就学别的模板,把它设置成comments,结果每个post的comment全变成一样了。然后设会all就好了,这个问题也不去深究,有兴趣的自己看源码/wp-includes/comment-template.php。
重点来了,重点是'callback' => 'homepage_comments'这个参数。顾名思义,这是设置回调函数,那homepage_comments就是函数名。为了代码的整洁和统一,我把这个函数放在functions.php里了。那在循环遍历comments的时候,就会调用这个函数。
下面来看functions.php这个文件

这个太长了,就不一一详细介绍了,重点讲一下$GLOBALS['comment'] = $comment;,这个是为下面那些API作准备的,类似comment_text()等。这个主要是结构,HTML和PHP混合在一起,所以代码比较乱。但是wp的API函数都能顾名思义出来,需要改结构的请自行调整。
最后我们看一下样式文件comments.css

OK,一切搞定,如果出问题请自行解决,哈哈哈,本人概不负责。
可惜现在没有示例网站可以看,因为TTT看了首页显示出评论的页面以后说“但我现在想让它变回去”。唉。。辛苦了半天。。算了,至少提高了职业技能,哈哈哈

php下载文件的函数

转自:http://www.ruofeel.cn/329.html

搞定一个很纠结的json问题,记录一下

今天被json编码中文搞死了。。。
json_encode中文的时候,会把每个中文字符encode成“\uxxxx”
而存进数据库的时候,“\”被屏蔽了,直接变成"uxxxx"
郁闷,我还以为是json_decode的问题。。。在网上查了一个下午资料都没解决
直到发现网上的文章都说json_encode是把中文encode成“\uxxxx”,我才顿悟。。。
经过一番实验,才发现问题出在存储到数据库的环节。。。
特此纪念一下
至于解决办法,当然是让"\"保留啦,把"\" replace成"\\"就可以啦~
还有一个问题,差点忘了,就是json_decode以后返回的不是array,而是stdclass,有一个很郁闷的问题,如果hash带下划线,如json['xx_yy']会出现很奇怪的问题,页面什么都不显示,也不报错,差点晕死。有一个办法解决,就是先foreach一下,把带下划线的存到一个array里面,或者直接整个转存成array。
//感谢软工的回复
由于已经是2年前写的博客,也没有写实际场景,我已经忘记json_decode是在什么场景下出现的问题。
如果我没有记错的话,当时json_decode还没有第二个参数。

PHP get remote ip address

Discuz!源代码分析[模板使用include template(discuz)]:./include/template.func.php

本帖不仅仅是分析文件,还把Discuz中模板解析这一原理分析了一下。转自www.discuz.net 作者:郭鑫
我记得我刚开始学PHP的时候,对模板解析实在是觉得很奇怪,不知道这个原理怎么实现的,后来看书看多了也明白有一个著名的Smarty在那,曾经也用过一段,不过感觉不是很好,就开始分析Discuz的模板技术是怎么实现的了,然后我把这个模板解析的代码分离出来了,觉得很好用,用了一段时间, Discuz的模板解析是用正则表达式替换一些模板中的规定的语言标记,然后呢,写到forumdata/templates中,再用include引用到index, forumdisplay等等中,和smarty的原理基本上相同,只是功能没有smarty那么多,smarty内建了一个cache来着…连个 User Guide都几百页…
  呵呵,不过现在基本上两个都没用过,正则表达式好是好用,不过正则的效率不是很高,以前看PHP技术文档的时候说能不用正则就尽量不要用,那东西烦着,现在做什么项目基本上用的是框架,MVC的模式,View中的代码一般不用模板解析出来,混杂php代码在里面,也觉得不错,OOP的开发效率比较高,很多地方重用代码是很开心的~!
  Discuz的模板解析要分析出来只要用到两个文件:./include/global.func.php和. /include/template.func.php,global只要一个函数就够了,template要全部的文件下面我就分开讲一下,会比较详细,大家耐心看:
Section One--./include/global.func.php---->template function

这个函数一共有三个传入参数:
$file 表示模板名
$templateid 表示模板id
$tpldir 表示模板目录

这个是把$tplrefresh作为一个全局变量,tplrefresh表示是不是刷新模板

$tpldir和$templateid赋值,如果没有传进来就用常量TPLDIR和TEMPLATEID给它们值

这里是把$tplfile(表示的是模板文件)和$objfile(表示的是要编译成的文件)赋值

防止TEMPLATEID不等于1且$templateid不等于1,而且模板文件不存在导致空白问题。
这里也可以算一个迭代,也可以不算,就是把1作为第二个参数再调用函数本身。

很巧妙的一段,Discuz的模板缓存就体现在这里,如果你没打开模板刷新的话(config.inc.php->$tplrefresh=0),这里就直接返回一个$objfile了,而这个文件是你第一次建论坛的时候就写入的,如果你不改模板的话,关了是能提高相当一部分效率的!反之,如果你打开了模板刷新的话就接着判断是不是模板文件的建立时间大于 forumdata/templates下的文件,是的话就引用./include/template.func.php写入模板文件到 forumdata/templates中,否则的话还是直接返回一个已经编译好的模板文件。
关于template.func.php文件中函数的分析在下面:

[转]关于大家问的uc开发手册不能同步登陆问题

最近在做一个整合 UCenter 的项目,下载了一份 uc开发手册,测试结果是这样的:
通过uch 登陆 可以同步登陆到论坛,但是不能登陆到 ucexample_1.php 和 2 这个开发手册自带的例子中。
但是通过ucexample_1.php 和 2 的例子登陆是可以登陆到 uch 和 论坛的
所有都是在配置正确的前提下进行,在 uc管理中的 应用管理 通信是要成功的。
那么问题是如何出现的呢?
看一下 api/uc.php
99-110行

  1. //同步登录 API 接口
  2. include './include/db_mysql.class.php';
  3. $db = new dbstuff;
  4. $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
  5. unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
  6. $uid = intval($get['uid']);
  7. $query = $db->query("SELECT uid, username FROM {$tablepre}members WHERE uid='$uid'");
  8. if($member = $db->fetch_array($query)) {
  9. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
  10. dsetcookie('Example_auth', authcode($member['uid']."\t".$member['username'], 'ENCODE'), 86400 * 365);
  11. }

复制代码

你会发现是一个读取数据库的操作,读取到才能设置咱们自己应用的 cookies 的
那么样例中似乎说的是要连接到自己的数据库中,可想如果咱们自己的数据库没有会员数据那么就登陆不成功了,所以解决办法就是读取uc自己的数据库!
在 app 的 config.inc.php 中
21-28行,不要看提示说是设置自己的,咱们直接设置 uc 的数据库

  1. //ucexample_2.php 用到的应用程序数据库连接参数
  2. $dbhost = 'localhost';                        // 数据库服务器
  3. $dbuser = 'root';                        // 数据库用户
  4. $dbpw = '';                                // 数据库密码
  5. $dbname = 'uc';                        // 数据库名
  6. $pconnect = 0;                                // 数据库持久连接 0=关闭, 1=打开
  7. $tablepre = 'uc_';                   // 表名前缀, 同一数据库安装多个论坛请修改此处
  8. $dbcharset = 'gbk';                        // MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定

然后你在测试一下,通过论坛 uch登陆 也可以直接同步登陆到 示例的应用中了!
转自:http://www.discuz.net/viewthread.php?tid=1043330&extra=page%3D1&frombbs=1