说明:本教程仅限学习,高手请绕道

开发程序:WordPress 3.9-RC1

使用主题:Twenty Fourteen

在开始之前,需要注意三件事情

I、给插件取一个个性化的名字,越个性化越好,以防和其他插件重名冲突。

II、代码里面,一定要包含注释,不为自己,也要为想修改你代码的别人想想。

III、尽量用最新版的 WordPress 进行开发和测试。

插件名称和插件结构

一般来说,都是在 wp-content\plugins 目录下建立一个文件夹,文件夹名就是插件的名称,我们插件名字为"copyright_plugin",文件结构如下。

\wp-content\plugins\copyright_plugin下有copyright_plugin.php和readme.txt

这里的 readme.txt 文件中包含了一些插件的介绍,使用说明等信息,主要是提交到 WordPress 官方网站时候用到的,可以参考他们给的模板 http://wordpress.org/extend/plugins/about/readme.txt,另外还有插件截图预览的功能,需要另外添加图片,但是我们现在是练习,不需要提交到官网,所以暂时先不涉及这些。

插件的核心

总的来说,插件的核心是两个 function,用来添加 Hooks(中文译为钩子)

  1. add_action ($hookname, $callbackfunction)
    add_filter ($hookname,$callbackfunction)

这两个方法相当重要,几乎所有的插件都要用到他们。

Actions,我理解就是 wordpress 核心代码预留的一些特殊的切入点,或者说是在执行一些特定事件时候发生,例如文章发布时,或者访客留言时触发。
Filters,应该就是 wordpress 执行时,对数据传输过程的一种过滤机制,例如当文章保存到数据库的过程,或者文章从事数据库中取出,展现到浏览器中的这个过程。

我们今天要制作的插件,应该是用 Filters,因为我们要在文章显示在浏览器之前,在最后面加上一段字符窜,用来显示版权信息,后面添加菜单项的时候,也要用到 Actions。

插件概要信息

用文本编辑器打开 copyright-plugin.php 文件,输入如下信息:

  1. <?php
  2. /*
  3. Plugin Name: Copyright plugin
  4. Plugin URI: http://www.xxxx.com/plugins/
  5. Description: 此插件将在文章正文最下面,显示一行版权信息
  6. Version: 1.0.0
  7. Author: xcxc
  8. Author URI: http://www.xxxx.com/
  9. License: GPL
  10. */
  11. ?>

保存好文件,然后登录 WordPress 后台,打开插件菜单,应该就可以看到这个插件,已经显示在插件列表里面了,并且可以启用这个插件试试,不过没有任何效果,因为到目前为止,这个插件还没有实现任何功能。

为插件实现功能

修改copyright_plugin.php

  1. <?php
  2. /*
  3. Plugin Name: Copyright plugin
  4. Plugin URI: http://www.xxxx.com/plugins/
  5. Description: 此插件将在文章正文最下面,显示一行版权信息
  6. Version: 1.0.0
  7. Author: xcxc
  8. Author URI: http://www.xxxx.com/
  9. License: GPL
  10. */
  11.  
  12. /* 此插件将在文章正文最下面,显示一行版权信息 */
  13. function display_copyright() {
  14. return "<p style='color:red'>本站点所有文章均为原创,转载请注明出处!</p>";
  15. }
  16. ?>

保存好这个文件,然后打开正在用的主题文件夹,打开index.php 文件夹,找到 get_template_part( 'content', get_post_format() ); 并在下面添加如下代码

  1. if(function_exists('display_copyright')) {
  2. echo display_copyright();
  3. }

function_exists 是判断 display_copyright 函数是否存在,因为当插件停用的时候,主题代码里面是找不到这个函数的,所以要判断一下,防止出错。

然后在 wordpress 后台启用该插件,再打开首页看看效果吧!

至此,这段代码,应该可以勉强算是一个插件了。之所以说勉强,是因为这个插件存在一个问题,需要手工去修改主题代码,如果用户换了主题的话,需要在新主题里面再次修改代码,这个不好。

改良插件

还记得我们前面说过的 Hooks (钩子)吗,我们要开始用 Filter 钩子了!

代码修改copyright_plugin.php如下:

  1. <?php
  2. /*
  3. Plugin Name: Copyright plugin
  4. Plugin URI: http://www.xxxx.com/plugins/
  5. Description: 此插件将在文章正文最下面,显示一行版权信息
  6. Version: 1.0.0
  7. Author: xcxc
  8. Author URI: http://www.xxxx.com/
  9. License: GPL
  10. */
  11. add_filter( 'the_content', 'display_copyright' );
  12.  
  13. /* 这个函数在日志正文结尾处添加一段版权信息,并且只在 首页 页面才添加 */
  14. function display_copyright( $content ) {
  15. if( is_home() )
  16. $content = $content . "<p style='color:red'>本站点所有文章均为原创,转载请指明出处!</p>";
  17.  
  18. return $content;
  19. }
  20. ?>

参看以上代码,其中 the_content 是钩子的名字,display_copyright 是回调函数名称。这样一来,只要启用插件就可以实现功能,无需去修改主题了,请把刚才在index.php 文件中添加的代码删掉,然后启用插件,看看效果吧,显示效果应该是一样的,无论怎么换主题,还是会自动显示版权信息。

is_home是判断是不是主页

更进一步

至此一个真正的插件算是完成了。但是此插件将版权信息直接写在代码里,如果用户想自定义版权信息的话,需要修改插件的源代码,仍然不方便,所以此插件仍需改进。其实,我们可以在 WordPress 后台中为插件单独添加一个菜单和页面,用户可以在这里来自定义设置设置版权信息,信息可以保存在数据库里面。

先附上完整代码,后面会做说明

  1. <?php
  2. /*
  3. Plugin Name: Copyright plugin
  4. Plugin URI: http://www.xxxx.com/plugins/
  5. Description: 此插件将在文章正文最下面,显示一行版权信息
  6. Version: 1.0.0
  7. Author: xcxc
  8. Author URI: http://www.xxxx.com/
  9. License: GPL
  10. */
  11.  
  12. /* 注册激活插件时要调用的函数 */
  13. register_activation_hook( __FILE__, 'display_copyright_install');
  14.  
  15. /* 注册停用插件时要调用的函数 */
  16. register_deactivation_hook( __FILE__, 'display_copyright_remove' );
  17.  
  18. function display_copyright_install() {
  19. /* 在数据库的 wp_options 表中添加一条记录,第二个参数为默认值 */
  20. add_option("display_copyright_text", "<p style='color:red'>本站点所有文章均为原创,转载请注明出处!</p>", '', 'yes');
  21. }
  22.  
  23. function display_copyright_remove() {
  24. /* 删除 wp_options 表中的对应记录 */
  25. delete_option('display_copyright_text');
  26. }
  27.  
  28. if( is_admin() ) {
  29. /* 利用 admin_menu 钩子,添加菜单 */
  30. add_action('admin_menu', 'display_copyright_menu');
  31. }
  32.  
  33. function display_copyright_menu() {
  34. /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); */
  35. /* 页名称,菜单名称,访问级别,菜单别名,点击该菜单时的回调函数(用以显示设置页面) */
  36. add_options_page('Set Copyright', 'Copyright Menu', 'administrator','display_copyright', 'display_copyright_html_page');
  37. }
  38.  
  39. function display_copyright_html_page() {
  40. ?>
  41. <div>
  42. <h2>Set Copyright</h2>
  43. <form method="post" action="options.php">
  44. <?php /* 下面这行代码用来保存表单中内容到数据库 */ ?>
  45. <?php wp_nonce_field('update-options'); ?>
  46.  
  47. <p>
  48. <textarea
  49. name="display_copyright_text"
  50. id="display_copyright_text"
  51. cols="40"
  52. rows="6"><?php echo get_option('display_copyright_text'); ?></textarea>
  53. </p>
  54.  
  55. <p>
  56. <input type="hidden" name="action" value="update" />
  57. <input type="hidden" name="page_options" value="display_copyright_text" />
  58.  
  59. <input type="submit" value="Save" class="button-primary" />
  60. </p>
  61. </form>
  62. </div>
  63. <?php
  64. }
  65.  
  66. add_filter( 'the_content', 'display_copyright' );
  67.  
  68. /* 这个函数在日志正文结尾处添加一段版权信息,并且只在 首页 页面才添加 */
  69. function display_copyright( $content ) {
  70. if( is_home() )
  71. $content = $content . get_option('display_copyright_text');
  72.  
  73. return $content;
  74. }
  75. ?>

说明:

以下代码自己要是在启用插件时和停用插件时调用,注释中已经写得很详细了。

  1. /* 注册激活插件时要调用的函数 */
  2. register_activation_hook( __FILE__, 'display_copyright_install');
  3.  
  4. /* 注册停用插件时要调用的函数 */
  5. register_deactivation_hook( __FILE__, 'display_copyright_remove' );
  6.  
  7. function display_copyright_install() {
  8. /* 在数据库的 wp_options 表中添加一条记录,第二个参数为默认值 */
  9. add_option("display_copyright_text", "<p style='color:red'>本站点所有文章均为原创,转载请注明出处!</p>", '', 'yes');
  10. }
  11.  
  12. function display_copyright_remove() {
  13. /* 删除 wp_options 表中的对应记录 */
  14. delete_option('display_copyright_text');
  15. }

添加菜单和页面的代码如下:

  1. if( is_admin() ) {
  2. /* 利用 admin_menu 钩子,添加菜单 */
  3. add_action('admin_menu', 'display_copyright_menu');
  4. }
  5.  
  6. function display_copyright_menu() {
  7. /* add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function); */
  8. /* 页名称,菜单名称,访问级别,菜单别名,点击该菜单时的回调函数(用以显示设置页面) */
  9. add_options_page('Set Copyright', 'Copyright Menu', 'administrator','display_copyright', 'display_copyright_html_page');
  10. }

至此,已经可以在后台看到菜单项了,但是点击的话,还会出错,因为还没有添加对应的页面(如何自定义添加后台菜单位置

下面开始添加页面,主要代码如下:

  1. function display_copyright_html_page() {
  2. ?>
  3. <div>
  4. <h2>Set Copyright</h2>
  5. <form method="post" action="options.php">
  6. <?php /* 下面这行代码用来保存表单中内容到数据库 */ ?>
  7. <?php wp_nonce_field('update-options'); ?>
  8.  
  9. <p>
  10. <textarea
  11. name="display_copyright_text"
  12. id="display_copyright_text"
  13. cols="40"
  14. rows="6"><?php echo get_option('display_copyright_text'); ?></textarea>
  15. </p>
  16.  
  17. <p>
  18. <input type="hidden" name="action" value="update" />
  19. <input type="hidden" name="page_options" value="display_copyright_text" />
  20.  
  21. <input type="submit" value="Save" class="button-primary" />
  22. </p>
  23. </form>
  24. </div>
  25. <?php
  26. }

现在再去点击刚才新加的菜单,可以显示出来一个页面了,我们可以在这里设置版权信息文本。

另外还有如下代码要修改

  1. /* 这个函数在日志正文结尾处添加一段版权信息,并且只在 首页 页面才添加 */
  2. function display_copyright( $content ) {
  3. if( is_home() )
  4. $content = $content . get_option('display_copyright_text');
  5.  
  6. return $content;
  7. }

将原来的静态化文本,改成动态的,之所以要这么改,是因为我们已经将数据存到数据库里面了,这里要从数据库里面取出数据。

WordPress插件开发实例教程 - 版权插件的更多相关文章

  1. 黄聪:《跟黄聪学WordPress插件开发》

    续<跟黄聪学WordPress主题开发>之后,又一个作品完成!<跟黄聪学Wordpress插件开发>,国内最好的Wordpress插件开发视频教程!! 目录预览: WordPr ...

  2. jQuery插件开发——全屏切换插件

    这个插件包含三个部分:HTML结构.CSS代码和JS代码. HTML结构是固定的,结构如下: <!--全屏滚动--> <div class="fullpage-contai ...

  3. 分享本年度最佳的15个 Photoshop 实例教程

    毫无疑问,Photoshop 是任何其类型的设计相关工作的最佳工具.有这么多东西,你可以用它来设计,发挥你的想象力,一切皆有可能. 现在,几乎所有的封面图像都会用 Photoshop 来修饰. 您可能 ...

  4. 值得 Web 开发人员学习的20个 jQuery 实例教程

    这篇文章挑选了20个优秀的 jQuery 实例教程,这些 jQuery 教程将帮助你把你的网站提升到一个更高的水平.其中,既有网站中常用功能的的解决方案,也有极具吸引力的亮点功能的实现方法,相信通过对 ...

  5. Web 开发中应用 HTML5 技术的10个实例教程

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  6. 值得 Web 开发人员收藏的20个 HTML5 实例教程

    当开始学习如何创建 Web 应用程序或网站的时候,最流行的建议之一就是阅读教程,并付诸实践.也有大量的 Web 开发的书,但光有理论没有实际行动是无用的.现在由于网络的发展,我们有很多的工具可以用于创 ...

  7. 《HTML5与CSS3实例教程》

    <HTML5与CSS3实例教程> 基本信息 作者: (美)Brian P. Hogan 译者: 卢俊祥 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:97871153634 ...

  8. jQuery插件开发详细教程

    这篇文章主要介绍了jQuery插件开发详细教程,将概述jQuery插件开发的基本知识,最佳做法和常见的陷阱,需要的朋友可以参考下 扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间. ...

  9. WordPress主题制作教程[壹] - 了解WP&结构&索引

    最近开始筹备WordPress主题开发了.首先我们在此章节中进行了解什么是WP,以及WP的结构.通过这个文章索引到以后所写的WP系列教程. (抱歉,大家不要急,持续更新中....) 1.首先,我们来认 ...

随机推荐

  1. CentOS升级Python 2.6到2.7

    查看python的版本 python -V Python 2.6.6 下载Python   Python-2.7.8.tar.xz      链接:http://pan.baidu.com/s/1i4 ...

  2. asp.net权限控制配置web.config

    项目下 有三个文件夹 A,B,C 验正方式是 Forms 验正 我要设置他们的访问权限为, A,匿名可访问 B,普通用户授权后才能访问 C,只允许管理员访问 <configuration> ...

  3. 关闭Android/iPhone浏览器自动识别数字为电话号码

    <meta name="format-detection" content="telephone=no"><meta http-equiv=& ...

  4. hdu2191 多重背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2191 多重背包:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是 ...

  5. Codeforces Round #354 (Div. 2)-D

    D. Theseus and labyrinth 题目链接:http://codeforces.com/contest/676/problem/D Theseus has just arrived t ...

  6. Zepto tap 穿透bug

    当两个层重叠在一起时,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿透”,“google”说原因是“tap事件实际上是在冒泡到body上时才 ...

  7. windows 安装oracle 后,所有服务都是什么意思,需要开户吗?

    中的方法成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volum ...

  8. python 代码片段22

    #coding=utf-8 class AddressBookEntry(object): version=0.1 def __init__(self, name,phone): self.name ...

  9. 纯CSS打造银色MacBook Air(完整版)

    上一篇:<selection伪元素小解> ::selection{ background:blue; color:red; }p{font-size:14px;} 作者主页:myvin 博 ...

  10. Codeforce - Runtime Error

    Bahosain was trying to solve this simple problem, but he got a Runtime Error on one of the test case ...