鲍成龙
成年人的世界没有容易二字。
鲍成龙

云天收夏色,木叶动秋声

鲍成龙

个人网站底部一直都是用document.write来获取输出现在的年份和天数的,发现和PJAX竟然无法兼容

换一个中转的办法

利用如下来输入就可以了

document.getElementById("id").innerHTML = "内容"

[aru_3]

鲍成龙

一、jQuery检测浏览器window滚动条到达底部

jQuery获取位置和尺寸相关函数:

$(document).height()    获取整个页面的高度

$(window).height()    获取当前也就是浏览器所能看到的页面的那部分的高度。这个大小在你缩放浏览器窗口大小时会改变,与document是不一样的

scrollTop()    获取匹配元素相对滚动条顶部的偏移。

scrollLeft()    获取匹配元素相对滚动条左侧的偏移。

scroll([[data],fn])    当滚动条发生变化时触犯scroll事件

jQuery检测滚动条到达底部代码:

$(document).ready(function() {
  $(window).scroll(function() {
  
    if ($(document).scrollTop()<=0){
      alert("滚动条已经到达顶部为0");
    }
  
    if ($(document).scrollTop() >= $(document).height() - $(window).height()) {
      alert("滚动条已经到达底部为" + $(document).scrollTop());
    }
  });
});

二、jQuery检测div中滚动条到达底部

上半篇介绍了jQuery检测浏览器window滚动条到达底部,其实还并不理解scrollTop和scrollHeight概念,通常滚动条都是放在div中的。

<div id="div1" style="overflow-y:auto; overflow-x:hidden; height:500px;">
  <div style="height:750px;">
  </div>
</div>

由于内部的div标签高度比外部的长,并且外部的div允许自动出现垂直滚动条,所以用浏览器打开后,可以看到垂直滚动条。

那么,这里的外部div 的scrollTop、scrollHeight 属性到底是什么呢?

实际上,在js代码里,滚动条是被抽象为一个“点”来对待的。scrollHeight其实不是“滚动条的高度”(b),而是表示滚动条需要滚动的高度,即内部div的高度750px。而scrollTop表示滚动条(一个点)当前的位置在750px里占了多少。

判断垂直滚动条是否到达底部

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <meta http-equiv="content-type" content="text/html;charset=utf-8">
     <title>下拉滚动条滚到底部了吗?</title>
     <script language="javascript" src="jquery-1.4.2.min.js" mce_src="jquery-1.4.2.min.js"></script>
     <script language="javascript">
     $(document).ready(function (){
       var nScrollHight = 0; //滚动距离总长(注意不是滚动条的长度)
       var nScrollTop = 0;   //滚动到的当前位置
       var nDivHight = $("#div1").height();
       $("#div1").scroll(function(){
         nScrollHight = $(this)[0].scrollHeight;
         nScrollTop = $(this)[0].scrollTop;
     var paddingBottom = parseInt( $(this).css('padding-bottom') ),paddingTop = parseInt( $(this).css('padding-top') );
         if(nScrollTop + paddingBottom + paddingTop + nDivHight >= nScrollHight)
           alert("滚动条到底部了");
         });
     });
     </script>
   <body>
   <div id="div1" style="overflow-y:auto; overflow-x:hidden; height:500px;">
     <div style="background-color:#ccc; height:750px;">IE 和 FF 下测试通过</div>
   </div>
   </body>
   </html>

代码解说:

内部div高度为750,外部div高度为500,所以垂直滚动条需要滚动750-500=250的距离,就会到达底部,参见语句nScrollTop + nDivHight >= nScrollHight。

程序中,在外部div的scroll(滚动)事件中侦测和执行if判断语句,是非常消耗CPU资源的。用鼠标拖拉滚动条,只要有一个像素的变动就会触发该事件。但点击滚动条两头的箭头,事件触发的频率会低得多。所以滚动条的scroll事件要谨慎使用。

本示例判断的是没有水平滚动条的情况,在有水平滚动条时,情况会有细小的变化,所以nScrollTop + nDivHight >= nScrollHight语句中,需要用“>=”比较运算符,而没有水平滚动条的时候,等号“=”就足够了。大家可以实际测试一下。还可以判断水平滚动条是否滚动到头了。

三、jQuery滚动条到达底部加载数据

msg_list_loading = false;
    
    $('.msg_list').on('scroll', function(){
        if ( ! msg_list_loading ){
            load_more_msg();
        }
    })
    
    function load_more_msg(){
        
        var msg_list = $('.msg_list');
        if (nScrollTop + paddingBottom + paddingTop + nDivHight >= nScrollHight ) { 
            msg_list_loading = true;
            msg_list.append('<div class="loading"></div>');
            $.get('ajax_data.html').done(function( data ){ 
                msg_list.find(".loading").remove();
                msg_list.append( data );
                msg_list_loading = false;
            });
            
        } 
    }

鲍成龙

以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(__FILE__)来拼凑文件路 径,不知道这样做有什么好处,后来终于发现了其中的缘由。

我们来看一个简单的例子:

有a,b,c三个php文件。a.php在网站根目录,b.php在b文件夹下——b/b.php,c.php在 c文件夹下——c/c.php。有些混乱?看图就一目了然了:

a.php 和 b.php 都包含了 c.php,最后 c.php 包含了d文件夹下的一个php文件 ——d/d.php。

我们先来看a.php:

<?php 
    $file_name = 'a.php';
    echo "this is a.php";
    echo "<hr>";
    require('c/c.php');

很简单的代码,打印输出后,包含了c/c.php,接着,我们需要看c/c.php:

 

<?php 

    $c_file_name = 'c.php';
    echo 'this is c.php, is required by ' . $file_name;
    echo "<hr>";
    require('../d/d.php');

打印输出 "this is c.php, is required by a.php",$file_name是在a.php中定义的变 量。在最后,包含了d.php。因为d文件夹在当前c.php文件的上一层,所以,按照常理,我们会理所当 然的把路径写成 "../d/d.php"。但是很遗憾,会报错。原因在于,在被包含的文件中如 c.php,再去包含其他文件,路径是相对于最外层的父文件来说的,也就是相对于a.php,可以理解为因 为你被我包含了,所以你要以我为准。看起来很玄乎,原理其实很简单:你可以把 require ('c/c.php'); 看成是c/c.php文件里的代码,这样我们的a.php看起来可以是这个样子:

<?php 

    $file_name = 'a.php';
    echo "this is a.php";
    echo "<hr>";
    // require('c/c.php');
    $c_file_name = 'c.php';
    echo 'this is c.php, is required by ' . $file_name;
    echo "<hr>";
    require('../d/d.php');

到此,你可以看到,我们要包含d/d.php文件时,刚才的路径是不是错误的了?因为,现在是在 a.php的代码里,我们是相对于a.php文件来说的,当然,路径应该是 require('d/d.php'); 才对了。 我们修改代码如下:

<?php 

    $file_name = 'a.php';
    echo "this is a.php";
    echo "<hr>";
    // require('c/c.php');
    $c_file_name = 'c.php';
    echo 'this is c.php, is required by ' . $file_name;
    echo "<hr>";
    require('d/d.php');

此时,你还没有领悟到深意,需要往下看,我们再看b/b.php:

<?php 

    $file_name = 'b.php';
    echo "this is b.php";
    echo "<hr>";
    require('../c/c.php');

不需要解释了吧,没啥问题,但是当你把 require('../c/c.php'); 换成 c/c.php 里面的代码的时 候,你就会发现问题了,注意,我们刚才修改了c/c.php里的代码,把 require('../d/d.php'); 改成 了 require('d/d.php'); 看下面包含进来后的代码:

<?php 

    $file_name = 'b.php';
    echo "this is b.php";
    echo "<hr>";
    // require('../c/c.php');
    $c_file_name = 'c.php';
    echo 'this is c.php, is required by ' . $file_name;
    echo "<hr>";
    require('d/d.php');

那么,相对于 b/b.php 来说,require('d/d.php'); 的路径错了,应该是 require ('../d/d.php'); 才对。你回去修改 c/c.php 中的require路径,但是不对呀,你改了之后,b/b.php 可以正常运行了,但是 a/a.php 又不行了,是不是,它们共用 c/c.php ,牵一发动全身,怎么办呢。

 

这个时候,我们回到文章开头提到的 dirname(__FILE__),这可是个好东西,可以完全解决以上问 题。用了它,就可以不用关心包含你的文件是哪个文件、在哪个路径下面了,不需要顾虑父文件所在的 层级,因为,dirname(__FILE__)可以相对于当前文件指定路径。也就是说,我们需要将我们的 c/c.php 中的 require 路径换为:

<?php 

    $c_file_name = 'c.php';
    echo 'this is c.php, is required by ' . $file_name;
    echo "<hr>";
    require(dirname(__FILE__) . '/../d/d.php');

这里,我们只需要把 c/c.php 作为参照,相对于它来说,d/d.php 在上一层。这样,就只有一个标 准了,那就是,以我为准,管你包含我,还是他包含我,我只以我自己为准,我要包含的文件只相对于 我自己而言了。

 

对于 dirname(__FILE__) 不明白的同修,请google,很简单。

 

鲍成龙

require 的使用方法如 require("MyRequireFile.php"); 。这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

include 使用方法如 include("MyIncludeFile.php"); 。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

他们两个的用途是完全一样的,不一定非得哪个放在最前面哪个放在中间。他们最根本的区别在于错误处理的方式不一样。

require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误

include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误。

以下为补充:

1. include有返回值,而require没有。

2. include()包括并运行指定文件 在处理失败时include() 产生一个警告,被导入的程序代码都会被执行,而且这些程序在执行的时候会拥有和源文件中呼叫到include()语句的位置相同的变量范围。你可以导入同一个服务器中的静态页面。

3. include_once()的作用和include()是几乎相同的

唯一的差别在于include_once()会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了,如果有的话就不会再次重复导入(这项功能有时候是很重要的,比方说要导入的里面宣告了一些你自行定义好的函数,那么如果在同一个程序重复导入这个文件,在第二次导入的时候便会发生错误讯息,因为PHP不允许相同名称的函数被重复宣告第二次)。

4. require()会将目标文件的内容读入,并且把自己本身代换成这些读入的内容 在处理失败时require() 则导致一个致命错。

这个读入并且代换的动作是在PHP引擎编译你的程序代码的时候发生的,而不是发生在PHP引擎开始执行编译好的程序代码的时候(PHP 3.0引擎的工作方式是编译一行执行一行,但是到了PHP 4.0以后就有所改变了,PHP 4.0是先把整个程序代码全部编译完成后,再将这些编译好的程序代码一次执行完毕,在编译的过程中不会执行任何程序代码)。require()通常来导入静态的内容,而include()则适合用导入动态的程序代码。

5. 如同include_once(),require_once()会先检查目标文件的内容是不是在之前就已经导入过了,如果是的话,便不会再次重复导入同样的内容。

5. require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require。

7. require通常放在PHP程序的最前面,PHP程序在执行前,就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

8. include一般是放在流程控制的处理部分中PHP程序网页在读到include的文件时,才将它读进来。这种方式可以把程序执行时的流程简单化。 

鲍成龙
八戒说:“俺妈把俺生下来时,也没告诉俺猪一生意义是什么,俺还在苦想,一看其他兄弟都先抢着把奶头占光了,才知道什么叫真他妈蠢。”

——来自:今何在《悟空传》

 

听过人生百态,唯有心中常晴

0 1

—— 命 ——

生下来就是有限的生命,人生的意思也许就是在这有限的生命之中做一些自己喜欢的事情,做一些有意义的事情,这样才不会愧对这生命。
但是从出生开始到长大成人,其中总会有无数的艰难。
就像上面分享的歌曲中一般说,人哪有什么生而平等,有些人从出生开始就注定了往后的命运,而想要摆脱命运的束缚,就要付出巨大的代价。
也许你忘了,这种“摆脱过程”其实也是一种意义。
命,你相信他,你就会顺从他,你不尝试一种改变,你永远不会知道命算什么东西……
古往今来,传承无数神话,其中声传百家的主角总会是不相信什么是命,为什么天生被安排?
孙悟空,哪吒,杨戬……诸如此,也许你会说他们最后都成为了皈依,但是你如果想想就知道,他们从不信命开始,就已经悄然在改变了自己,哪怕是最后的皈依。
如果孙悟空顺应天命,相信生老病死,相信天命安排,他永远只是一只猴子,直到生命尽头。就是因为不信,反抗,才拥有了无限的生命。
他打过神,杀过妖,敢于和天庭争斗,敢于和佛叫板。即使是最后的皈依,他的美名依然可以流传千百年,他所到之处,神佛妖都要尊称一声“大圣”!
命,是拼来的;名,是争来的。

0 2

—— 苦 ——

 

都知道,天不可能常晴,总会有风雨到来的时候。就像人活一辈子,哪有一生平顺的,总会遇到些无法理解的黑暗时刻。
有人说这个社会生而黑暗。无可厚非。
有人的地方就有江湖,人心本来就各异,人与人构建的社会无非就是利益共同体,当有一天利益无法满足的时候,自然人走茶也凉。
而就是在这个无比黑暗的社会,利益也会有情相伴,不是所有人都是自私的追求着利益,相比利益的存在,也许只有情才会是一些人坚持下去的理由。
不可否认的是,利益总会比情多,情也有淡薄的一日。
不管是追求利益,还有存在着某种情,其实都逃不过苦。穷人永远比富人苦,这是利益的苦;有情人总比无情人苦,不管是内心过不去的感恩,还是相思难断的情。
如果有人度过了苦,那是在黑暗之中长留希望之光,不论是穷人还是富人,不管是有情人还是无情人,都不会是绝情。但是都是苦。
没有西天,没有极乐,只有永远无尽的长路,走着一代代不肯绝望的人。

 

 

0 3

—— 光 ——

 

管是命不好也罢,还是生活苦也罢,我相信能让人坚强的活下去的理由,永远都是心中的希望还在。
希望恰恰都是自己给的!如果你自己都否认了自己,没有了希望,也就失去了生命中所谓的价值。
当一个人活不下去的时候,不是这个社会太黑暗,是他自己不在给予自己希望,就算是别人给他希望,他也会觉得是假的。说什么人情世故都看淡,唯独看不穿的是自身。
黑暗是事实,但就算是黑暗,也总会伴随着星星点点的光。天无绝人之路,这是自古的道理!只要你敢于去发现,你就知道这世上还有这无数的理由值得活下去,并坚强!同样这也会成为你以后的骄傲。
当你置身黑暗的时刻,你要做的第一件事不是去求别人怎么办,不是让你感觉此刻的自己多么无助。你需要的是抓住自己,告诉自己,还有希望存在,尽管此刻的你可能被无尽的黑暗挡住了双眼,你需要的是等下去,是熬下去,漫漫长夜不可能永存,光明也许此刻缺席,但光明总会来到。
如果你觉得你实在熬不下去,你就去自己的房间,点亮一盏灯,你会发现,你的房间此刻充满了光。
任何让你觉得美好的东西,总是会为你引来更多的美好。

0 4

—— 晴 ——

数的人其实都曾经后悔过,后悔自己的过往所做的一切。
但,请你记住此刻。你前进的每一步,都是向前走,当你向前走的时候,也许你会回头,但是你绝对不能不看前面的路,更不能闭着眼睛不敢面对。
路很长,长到走不到头。只要你还在往前走,你的过往都会被你甩在身后,随风而逝。
不用怕什么被别人看见,你要知道当你向前走的时候,被甩在身后的过往,只有在你身后的人才可以看见,这时的你永远会比他快一步,走的更远,且越来越远,你会是他可望而不可即的存在。
未来也许还有迷茫,也许还有黑暗,我想当你决定继续向前走的时候,那时你眼里的天空,只剩下了晴天了吧。
走过风雨,闯过黑暗,一身勇敢的你,将无所畏惧。

—— END ——

鲍成龙

这篇在介绍下过滤器(Filters)。

过滤器是一类函数,WordPress执行传递和处理数据的过程中,在针对这些数据做出某些动作之前的特定运行(例如将数据写入数据库或将其传递到浏览器页面)。过滤器处于数据库与浏览器中间(当WordPress正在产生页面的时候),WordPress中的多数输入与输出都经过至少一个过滤器。WordPress默认状态做了一些过滤,你的插件可以添加它自己的过滤器。

添加你过滤器到WordPress中的方法有这么几步。

1.创建过滤器(过滤数据)的PHP函数。

2.在WordPress中通过钩子(钩子就是主题中的wp_header()和wp_footer())接入过滤器,通过引用add_filter来接入。

3.把你自己的PHP函数放进一个插件文件,并激活它。

首先创建你插件中过滤器的第一步就是创建一个PHP函数来执行过滤,并把它存入你的插件文件中(你的插件文件必须要置于wp-content/plugins目录下)。例如,如果你需要确认你的文章和评论中没有包含脏话,你可以定义一个包含禁用词语列表的全局变量,然后创建下面的PHP函数:

// 当评论文本内容还没有展示在页面之前,执行自定义的过滤函数来过滤内容中的敏感字
add_filter('comment_text','filter_word');
// 声明全局变量,来存储需要过滤的关键字
global $shieldingword;
$shieldingword = array('fuck', 'dirty'); // 需要过滤的关键字
// 过滤关键字的函数, 创建函数名的时候,要注意保持函数名的唯一性。
function filter_word($content) {
    foreach($shieldingword as $shielding) {
        $content = str_ireplace($shielding, '{Censored Word}', $content);
    }
    return $content;
}

在你的函数定义完成后,下一步就是挂载或者说在WordPress中注册它。注意:在你插件的全局执行空间引用指定的挂在点。

add_filter ('hook_name', 'your_filter', [priority], [accepted_args]);// 官方文档: http://codex.wordpress.org/Plugin_API/Filter_Reference// hook_name: WordPress提供的过滤器钩子,这钩子定义了你的过滤器何时会被执行。
// your_filter: 你希望用来执行过滤功能的函数名称。这可以是一个标准的PHP函数,一个标准的WordPress核心函数,或者是一个你在一个插件文件中定义过的函数。
// priority: (可选参数),整型参数,用来确定与特定过滤器相关联的函数在执行过程中的顺序(默认为10)。具有相同优先权的函数在执行时的顺序依据它们在过滤器中的添加顺序。
// accepted_args: (可选参数),整型参数,定义了你的函数可以接受多少参数(默认为1)。有一定作用价值,因为一些钩子会传递多于一个的

最后将插件激活。就可以使用这个过滤器函数了。如果你想移除某个过滤器函数可以使用remove_filter('filter_hook','filter_function')来完成。

过滤器就为大家简单介绍一下。详细使用说明请参照官方文档:http://codex.wordpress.org/Plugin_API/Filter_Reference

鲍成龙

这一篇为大家说一下WordPress插件函数吧,要制作插件,了解这些函数是非常有必要的

WordPress插件函数分为“动作”(Actions)和过滤器”(Filters),WordPress 使用这种接口函数把插件挂接到系统中来,然后加以使用,这一篇主要是介绍下过滤器(Actions)函数。

动作 (Action)函数 是 WordPress 运行到某些环节,或者在某些事件发生时,就会被执行的一种hook(钩子)。任何的插件都可以通过动作接口来指示系统在遇到这些环节或者事件的时候,就执行指定的 PHP 函数。 是由 WordPress 内部的某些事件所触发的,比如说发表一篇文章、更换主题或者访问后台的某个管理界面,这些都是一件事件的例子。而插件则可以指定某些 PHP 函数来响应这些事件所触发的动作。例如:

  • 修改数据库数据

  • 发送电子邮件

  • 修改即将显示出来的内容

1.在插件代码中定义当某个事件发生时,需要执行的 PHP函数

例如:

//官方文档:http://codex.wordpress.org/Plugin_API/Action_Reference/admin_head
// 当wp后台的头部加载时,执行的 PHP函数 my_custom_admin_head
add_action('admin_head', 'my_custom_admin_head');
// 输出一个css样式,改变body的背景颜色
function my_custom_admin_head() {
    echo '<style>body {background-color: #4AAF48 !important;}</style>';
}

注意:在插件内定义函数时,函数名称必须保持唯一性。

 

2.用add_action() 把这个函数注册到动作执行挂勾上

定义完动作响应函数之后,下一步就得把这个函数挂载(或者注册)到 WordPress 里面去。做法是在插件中调用 add_action() 函数,如下:

// add_action ('hook_name', 'your_function_name', [priority], [accepted_args] );
// 官方文档: http://codex.wordpress.org/Plugin_API/Action_Reference
// hook_name: (必要参数) WordPress 所提供的动作名,用于标识在哪个动作发生时,执行响应函数.
// your_function_name:(必要参数) 当动作 hook_name 发生时需要执行的响应函数的名字。可以是 PHP 标准的函数,或者是 WordPress 内置函数,或者是插件内自定义的函数,例如上述例子中的 my_custom_admin_head()
// priority: (可选参数),默认值为10。由于可以把多个函数注册到同一个动作,所以这个参于是用于指定注册到这个动作中的这个函数执行的优先级,数字越小优先 级越高,执行得也越早,反之亦然。如果若干个函数以相同的优先级注册到同一个动作,那么执行顺序则是由它们注册的先后顺序所决定。
// accepted_args: (可选参数),确认值是1。由于某些动作可能会把多个参数传给响应函数,所以这个有时候需要指定响应函数能接受多少个参数。这个参数是在 1.5.1 版加进去的。
// 通过这个函数我们就可以把上面的例子添加一个动作。例如上述例子中的 add_action('admin_head', 'my_custom_admin_head');

3.把插件源码文件放到 WordPress 插件目录,然后激活插件, 看看是否在wp后台头部加载时,输出了css样式改变了后台背景的颜色

WordPress动作(Actions)函数就为大家简单介绍一下。更多动作列表请参照官方文档:http://codex.wordpress.org/Plugin_API/Action_Reference

鲍成龙

这篇为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来。原理很简单,激活插件的时候运行创建数据库的代码。看下面代码:

<?php
/**
 * @package 创建数据表
 * @version 1.0
 */
/*
Plugin Name: 创建数据表
Plugin URI: http://www.cnblogs.com/fxmbz/p/4060296.html
Description: 这是一款简单的插件样例,激活插件的时候,会在该数据库下面创建一个新的数据表
Author: myname
Version: 1.0
Author URI: http://www.cnblogs.com/fxmbz
*/
// 声明常量来存储插件版本号 和 该插件最低要求WordPress的版本
define('MY_PLUGIN_VERSION_NUM', '1.0');
define('MY_PLUGIN_MINIMUM_WP_VERSION', '4.0');
// 声明全局变量$wpdb 和 数据表名常量
global $wpdb;
define('MY_NEW_TABLE', $wpdb->prefix . 'mynewtable');
// 插件激活时,运行回调方法创建数据表, 在WP原有的options表中插入插件版本号
register_activation_hook(__FILE__, 'plugin_activation_cretable');
function plugin_activation_cretable() {
    global $wpdb;
    /*
     * We'll set the default character set and collation for this table.
     * If we don't do this, some characters could end up being converted 
     * to just ?'s when saved in our table.
     */
    $charset_collate = '';
    if (!empty($wpdb->charset)) {
      $charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset}";
    }
    if (!empty( $wpdb->collate)) {
      $charset_collate .= " COLLATE {$wpdb->collate}";
    }
    $sql = "CREATE TABLE " . MY_NEW_TABLE . " (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        name tinytext NOT NULL,
        text text NOT NULL,
        url varchar(55) DEFAULT '' NOT NULL,
        UNIQUE KEY id (id)
    ) $charset_collate;";
    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
    // update_option()方法,在options表里如果不存在更新字段,则会创建该字段,存在则更新该字段
    update_option('my_plugin_version_num', MY_PLUGIN_VERSION_NUM);
}
// 插件激活时,运行回调方法在数据表中插入数据, 
register_activation_hook(__FILE__, 'plugin_activation_insertdate');
function plugin_activation_insertdate() {
    global $wpdb;
    
    $data['name'] = '我的博客';
    $data['text'] = '欢迎来到我的博客!';
    $data['url']  = 'http://www.cnblogs.com/fxmbz';
    $wpdb->insert(MY_NEW_TABLE, $data);
}
// 当加载插件时,运行回调方法检查插件版本是否有更新,
add_action('plugins_loaded', 'myplugin_update_db_check');
function myplugin_update_db_check() {
    // 获取到options表里的插件版本号 不等于 当前插件版本号时,运行创建表方法,更新数据库表
    if (get_option('my_plugin_version_num') != MY_PLUGIN_VERSION_NUM) {
        plugin_activation_cretable();
    }
}
// 插件停用时,运行回调方法删除数据表,删除options表中的插件版本号
register_deactivation_hook(__FILE__, 'plugin_deactivation_deltable');
function plugin_deactivation_deltable() {
    global $wpdb;
    $wpdb->query("DROP TABLE IF EXISTS " . MY_NEW_TABLE);
    delete_option('my_plugin_version_num');
}

基本都是使用的WordPress数据库相关函数来操作的,这个需要大家熟悉一下。官方文档:http://codex.wordpress.org/Creating_Tables_with_Plugins