5
十一/09
3

定制wordpress的文章发布

wordpress在发布文章的时候,已经集成了很多特性,比如tinyMCE这个可视化编辑器,文章标签(tags),别名(alias),以及分类(taxonomy)。但对于一个基于wordpress的项目,我们仍然需要对其高度定制,wordpress为我们提供了add_meta_box,来优雅的解决这个问题。

用起来比较简单,就6个参数,其中第三个参数为callback。我们可以在这个callback中设置一些输出信息,或者一个表单,最常用的还是后者。比如我们设置一个textarea的文本区域,用来保存一些用户输入的信息,这样用户发布这个post或者page的时候,这个信息就会保存到postmeta表里。其次,我们可以使用get_post_meta来获取这个数据。说到这里,有必要简单提下wordpress的表结构。

不像drupal那么复杂,wordpress主要的内容信息其实就两个表,一个post表,一个postmeta表,前者存放用户发布的基本内容,比如一篇blog,后者存放这个内容的一些附加信息,比如我们刚才定制的那个textarea。

最后,这里说下我碰到的一个问题以及自己的解决办法。在使用add_meta_box的时候,我们只是给post这个表单加入了一些输入控件,如果要处理文件的上传,或者使用curl等库来处理更高级的http操作,就出现问题了。因为form这个表单本身在wordpress中就定义好了,我们知道如果上传文件,form表单必须设置enctype = “multipart/form-data”属性,但默认的是没有的。google大叔告诉我很多人直接修改了wordpress的core,但我觉得这不是一个好的处理方式,我的解决办法是加入一段javascript来动态修改。
window.onload = function() {
var form = document.getElementById(”post”);
form.enctype = “multipart/form-data”;
};
这段javascript可以替换为更好的jquery代码,因为jquery等很多javascript类库已经集成到wordpress里面。目前能想到的就是这种方式,或许我还不够了解wordpress的机制?

关键字:
2
十一/09
0

初涉wordpress开发

近期涉及到wordpress-MU版本的开发工作,因为用户对其插件buddypress比较感兴趣。看了两天的文档,感慨wordpress文档的匮乏。。。

除了少的可怜的官方文档,基于codex系统,很多页面都没有书写外,自己down了一份plugin development的pdf,看完这个pdf才有点插件开发的感觉。写了4-5个小插件,熟悉了下wordpress的hook(wp中称作action和filter)。感觉还是不如drupal的模块优雅和灵活,但定制一个系统还是比较简单的,最大的痛苦就是wordpress的api函数太多,而很多都没有文档,不知道该如何选择,看了很多sample,用的还都不一样,版本之间留有差异性,不像drupal,5.x和6.x之间分别保持统一。

目前看来,一个buddypress新建一个用户,数据库中会多出8个表,这个恐怖的事实在网上已经有商业插件解决,不知道这个项目到底是怎么回事?
另外,视频方面采用了vimeo,开发和调试阶段颇为麻烦,因为国内的防火墙墙掉了很多应用,vimeo也不例外,使用vpn虽然解决了这个问题,但文档和wordpress一样少的可怜。

经过5天的google和编码,还算有点收获,过几天不忙了整理点文档共享给wordpress的插件开发者们。感慨:好的开源项目,如果文档不完善,依然是一件痛苦的事情。

关键字:
16
十/09
0

给drupal批量导入外部数据

很多时候,我们想给自己的drupal站点批量导入节点数据,其中包括很多方法,例如csv格式文件的导入,通过别的站点抓取到得信息,整合别的系统时,相互数据的迁移都要用到这些内容。我们建立一个简单的模型,只考虑节点基本数据,不考虑其他因素(比如节点图片,节点术语分类等等),将模型简单化有助于我们解决问题。

以拿抓取页面为例,我们使用正则表达式过滤出需要的信息后,将其存放在一个一维关联数组中,其中键对应数据库中的节点字段,比如title,body,name。。。然后我们手动调用node_submit方法,将一维数组传进去,这个方法会对我们的数组做一些存表之前的工作,我们直接可以在api.drupal.org查看这个方法的代码。

<?php
function node_submit($node) {
  global $user;

  // Convert the node to an object, if necessary.
  $node = (object)$node;

  // Auto-generate the teaser, but only if it hasn't been set (e.g. by a
  // module-provided 'teaser' form item).
  if (!isset($node->teaser)) {
    $node->teaser = isset($node->body) ? node_teaser($node->body, isset($node->format) ? $node->format : NULL) : '';
  }

  if (user_access('administer nodes')) {
    // Populate the "authored by" field.
    if ($account = user_load(array('name' => $node->name))) {
      $node->uid = $account->uid;
    }
    else {
      $node->uid = 0;
    }
  }

  $node->created = !empty($node->date) ? strtotime($node->date) : time();

  // Do node-type-specific validation checks.
  node_invoke($node, 'submit');
  node_invoke_nodeapi($node, 'submit');

  $node->validated = TRUE;

  return $node;
}
?>

除了一些数据的可用性检查外,该方法调用了所有实现submit和nodeapi中实现submit的函数,之后就简单了,再调用node_save即可。

关键字:
28
九/09
0

Mysql的一些问题总结

最近时间比较多,决定花些时间深入研究下mysql,尤其是性能和高负载站点的优化问题。不可避免的再次察漏补缺下基础知识,还是发现一些以前忽略的小细节,正可谓温故知新。

  1. 使用alter语句修改表的时候,change和modify都可以修改表的定义,不同的是change后面需要写两次列名,但可以修改列名,而modify则不行。
  2. insert语句一个很好的特性:可以一次插入多条记录。格式为:insert into table (field 1, … , fieldn) values (value1, … , valuen), (value1, … , valuen); 这个特性在插入大量记录时,节省很多网络开销,大大提高效率。
  3. 其实查询Mysql安装后自带的帮助文档是很方便的,在提示符中键入 ? contents,根据结果依次使用问号操作符做进一步查询,即可获得详细信息。
  4. Blob和text类型会引起一些性能问题,尤其是删除了大量记录的时候。应该使用optimize table功能进行碎片整理。
  5. MyISAM引擎建议使用固定长度的数据列代替可变长度的数据列,而innodb引擎建议使用varchar类型,因为char平均占用空间多于varchar。
  6. 可以使用合成索引来提高大文本字段的查询性能,在表的设计中多一个字段,用来存储大文本的md5值,精确匹配大文本查询的时候可以利用该文本的md5值进行查询,以减少I/O,提高查询效率。
关键字:
26
八/09
2

使用 PHP 和 Apache Solr 实现企业搜索

来源:http://www.ibm.com/developerworks/cn/opensource/os-php-apachesolr/index.html
通过本文了解如何将企业级搜索引擎 —— Apache Software Foundation 的 Solr —— 与 PHP 应用程序结合使用。

在 “用 PHP 构建自定义搜索引擎” 中,我结合使用 PHP 与开源 Sphinx 搜索引擎创建了文本密集型数据库查询的快速备选方法,例如 MySQL 中的 LIKE 和 MATCH(要获得与 Sphinx 相关的信息,请参阅 参考资料)。

Sphinx 非常易于安装和维护,并且功能十分强大。而且,Sphinx 的最新版本现在提供了一个本机 MySQL 引擎,不需要运行独立的 Sphinx 守护进程。V0.9.8(撰写本文时的最新版本)还添加了地理距离(geodistance)查询,用于查找在给定位置的某个距离范围内的记录;并添加了名为多查询(multi-query)的功能,它是在单一网络连接中绑定多个查询和结果集的优化功能功能。

关键字: