新建一个插件
成都创新互联公司专注于上饶企业网站建设,响应式网站开发,成都商城网站开发。上饶网站建设公司,为上饶等地区提供建站服务。全流程定制网站,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
这个部分告诉你怎么把开发插件的理想变为现实。
名称,文件和地方
插件名
你得先想一个名字,并且努力让它独一无二。在 Plugins 或者其他宝贝地方——Google或者百度先验证一下这个名字到底是不是独一无二的。另外你的名字得让别人明白你的插件是干什么的。
插件文件
下一步是创建一个PHP文件。按照原文奇怪的逻辑,你得先想好名字。这个名字还得是从插件名衍生过来的(其实是为你自己辨认的)。举个例子吧,比如说你的插件名字叫 "Fabulous Functionality",你的PHP名字可能是 fabfunc.php。另外不要用汉语拼音(这也是我加的),还要避免重名。人民群众会把你的插件安装到一个你也知道的叫wp-content/plugins/的地方,如果名字冲突岂不要悲剧了。
你也可以选择把插件分割成几个文件。 显而易见一个php文件是必需的,同时还需要图片、CSS、JavaScript、语言(当然也可以没有)。如果有很多文件,命名一个php和一个文件夹,例如 fabfunc and fabfunc.php。把你所有插件文件放到文件夹里,然后让你的用户相信只要把你的整个压缩包解压到 wp-content/plugins/就能正常使用你的劳动成果。
在本文的其余部分,“插件的PHP文件”是指主要插件的PHP文件,无论是在的wp-content/plugins/或子目录。
Readme文件
如果你想将你的插件发布到, 你必须在插件包中建立一个标准格式readme.txt文件. 文件格式参见.
主页
最好为插件建立一个主页,以介绍插件的功能、安装方法、使用说明、适用的WordPress版本、插件更新信息等。
文件Headers
现在开始吧,首先让我们从向PHP主文件中加入一些信息
标准插件信息
插件的主文件顶部必须包括一个标准插件信息头。WordPress通过标准信息头识别插件的存在,并把她加入到控制面板的插件管理页面,这样插件才能激活,载入插件,并运行里面的函数;如果没有信息头,插件将无法激活和使用。标准信息插件头的格式为:
?php
/*
Plugin Name: 插件名
Plugin URI: 插件的介绍或更新地址
Description: 插件描述
Version: 插件版本,例如 1.0
Author: 插件作者名称
Author URI: 插件作者的链接
License: A "Slug" license name e.g. GPL2
*/
?
标准信息头至少要包括插件名称,这样WordPress才能识别你的插件。其他信息将显示在控制面板插件管理页面中。标准插件信息对各行顺序没有要求。
这样的升级机制能够正确地读出你的插件版本,建议你选择一个格式的版本号,不同版本之间,并坚持下去。例如,x.x中或x.x.x或xx.xx.xxx
注意:文件必须是 UTF-8 格式!
版权信息
通常我们还要在标准信息头中加入插件的许可证信息。大多数插件使用GPL或GPLCompatibleLicenses许可。如果使用GPL许可,要求插件中包含以下信息:
?php
/* Copyright 年份 作者名 (email : 你的邮箱)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
?
开始编写插件
现在是时候让你的插件能干些什么了。这部分内容包括插件开发的一般思路,而且介绍了开发插件需要做哪些工作。
WordPress插件钩子
许多WordPress插件通过连接一个或多个WordPress插件钩子来完成他们的功能。插件钩子的运行机理是,当WordPress运行到不同阶段,WordPress会检查当前阶段是否注册了插件函数,如果是,那么函数将被执行。通过执行插件函数改变了WordPress的默认功能。
例如,在WordPress将日志标题和post发送到浏览器前,会检查是否有插件函数注册了名为“the_title”的“filter”钩子。如果是,标题文本将会传送到注册函数中,注册函数返回值将会传送到浏览器。所以,如果要在日志标题中加入一些信息,可以通过这种方式实现。
另一个例子是名为“wp_footer”的“action”钩子。在WordPress的HTML页脚创建之前,会检查是否有插件注册了名为“wp_footer”的“action”钩子,如果是依次执行她们。
在Plugin API了解更多如何注册“filter”和“action”类型的钩子函数,及WordPress提供了那些插件钩子。如果你发现WordPress没有提供自己想要的钩子,你可以建议WordPress加入这个钩子,很多建议WordPress都会采纳。具体方法参考Reporting Bugs。
模版标签
另一个通过插件加入新功能的方法是建立自定义的模版标签Template Tags。如果有人想用你的插件,可以在他们的主题中添加这些标签,边栏,文章内容段,或者任意的只要是适合这插件的地方。例如,一个给文章添加地理位置的插件可能定义了一个模板标签函数geotag_list_states()放在边栏上,这里列表了所有在文章中关联的州的名称,并且还带有插件提供的到这些州的文档页的链接。
定义一个自定义模板标签,仅需要写一个PHP函数,并且在你插件主页或者插件的主PHP文件中声明一下。声明函数的时候,为这个函数提供一个示例来明确如果想要应用这个函数需要加主题中加些什么文件是个相当棒的主意。
保存插件数据到数据库
大多数WordPress插件需要站点的所有者或者是博客的用户输入信息,然后在对话过程中保存起来,以便过滤器函数(filter)、动作函数(action)或者模板函数(Template)使用。这些信息必须保存在WordPress的数据库中,以便下次使用。这里有两种基本的方法用于保存插件的信息到数据库里面。
使用WordPress的"option"机制(稍后会有介绍)。这种方法适合于保存一些相对小数量的静态命名类数据--这类数据通常只需要网站的所有者在首次建立插件的时候输入,以后很少改动。
文章属性post meta(a.k.a. Custom Fields),适用于那些只和个人文章、页面或者附件有关的数据。
参看post_meta Function Examples, add_post_meta(), 以及与文章相关函数属性post.fuction meta (a.k.a. Custom Fields).
自定义分类法。对于文章分类或者其他对象,比如用户、评论,或者用户可编辑列表中的数据名称/值,可以考虑使用自定义分类法,尤其是当你要访问的所有的文章/对象与给定的分类法项目相关联的时候。查阅 Custom Taxonomies
在数据库中创建一个新的自定义数据表。这种方法适合于与个人文章、页面、附件或者评论相关的数据,这类数据会随着时间越来越多,它们也没有专有名称。参看Creating Tables with Plugins来了解更多这类信息处理方法。
WordPress的选项机制
参看 Creating Options Pages 得到更多如何创建会自动保存你选项数据的页面。
WordPress拥有一个机制来保存,更新和检索WordPress数据库中专用,名称类数据(即"options"机制)。选项值可以是字符,数组或PHP对象(他们会被"序列化",或在存储前转换为字符,并在被检索时解开序列)。选项名称是字符,并且它们必须是独一无二的,这样就不会与其它的WordPress插件相冲突。
它也通常被认为是一个不错的主意,将你的插件使用的选项的数量降到最低。例如,考虑存储序列化数组的10个元素作为一个单一的命名选项,而不是存储10个不同的命名选项。
这里是你的插件应用WordPress option功能的主要函数。
add_option($name, $value, $deprecated, $autoload);
建立一个新的option; 如果这个option已经存在则不做动作.
$name
必须 (string). 要添加的option的名称.
$value
可选(string), 默认是空字符. option值会存在这里.
$deprecated
可选 (string), 不再被WordPress使用了,你可以不填或NULL 如果你希望应用后面的$autoload参数.
$autoload
可选, 默认为 'yes' (enum: 'yes' or 'no'). 如果设置为 'yes' 那么这个option会被get_alloptions 函数自动检索.
get_option($option);
在数据库中检索option值.
$option
Required (string). 你想返回数值的option名称。你可以Option Reference在找到一个随着WordPress一起安装好的默认option表。
update_option($option_name, $newvalue);
更新或创建数据库中的option值(注意 add_option 不是必须被调用,如果你不想作用 $deprecated 或$autoload 参数).
$option_name
必须(string). 要更新的option名.
$newvalue
必须. (string|array|object) option的新值.
管理面板
假定你的插件有一些选项(option)存储于WordPress的数据库中(参看上一节),你可能会想要一个主控面板来允许你的插件用户查看和编辑选项值。实现这一目标的方法阐述于Adding Administration Menus。
插件国际化
在你完成了你的插件的编写工作之后,另一个需要考虑的问题(假设你准备跟大家分享你的插件的话)就是将其国际化。国际化就是将你的软件设置成能够本地化的过程;本地化是将软件中显示的语言翻译成其他语言的过程。Wordpress正在被全球的人们使用,所以全球化和本地化是他内在的特性,这其中就包括了插件的本地化。
请注意,插件的语言文件是不会自动加载。将此插件代码,以确保加载的语言文件:
load_plugin_textdomain('your-unique-name', false, basename( dirname( __FILE__ ) ) . '/languages' );
要简单地取一个字符串使用 __('String name','your-unique-name'); 返回翻译或者 _e('String name','your-unique-name'); 输出翻译。翻译,然后进入你插件的 /languages 文件夹。
我们十分希望你能够将你的插件国际化,这样其他国家的用户就可以在自己的本地使用它了。我们有一个关于国际化的综合说明在I18n for WordPress Developers,这其中就包括了一个描述插件国际化的部分。
更新你的插件
本节介绍将插件托管到 之后必要的更新步骤。特别列出wordpress.org关于使用 Subversion(SVN)的一些细节。
假设你已经提交你的插件到WordPress的插件库,随着时间的推移,你可能会发现需要将某些功能添加到插件或修正错误。更新代码,并将变化提交到你的插件主干(trunk),这些变化将是公开可见的,但仅限于在技术上志同道合的人通过SVN检查你的插件。其他用户通过网站或自己的WordPress插件管理下载都不会改变。
当你准备发布一个新版本的插件:
确保一切承诺和新版本的实际工作。注意所有版本的WordPress的插件支持,并尝试与他们进行测试。不要只是测试新功能,也确保你不小心打破一些插件的旧功能。
更改主要的PHP文件头注释中的版本号为新的版本号。
更改readme.txt文件的“Stable tag”字段中的版本号。
在readme.txt文件中添加一个新的小节“changelog“,简要介绍与最后一个版本相比,新版本有什么改变。这将列出的插件页面上的“更新日志”选项卡。
提交这些更改。
创建一个新的SVN标记作为副本主干(trunk),遵循 this guide。
给系统一个运行两三分钟,然后检查你的插件,看看更新是否一切正常,以及WordPress 是否提示插件有更新(更新检查可能有缓存,比如wordpress.org插件页面或后台安装,所以这可能需要一些时间 —— 尝试访问“可用更新”页面)。
故障排除:
wordpress.org插件的页面上仍然列出旧版本。你是否更新了树干文件夹'stable tag' 字段?只创建一个标签和或更新readme.txt文件是不够的!
插件的页面提供了一个zip文件的新版本,但按钮仍然列出旧的版本号,而且WordPress 没有装更新通知。你是否已修改主要的PHP文件中“Version”版本号?
对于其他问题,请参考: The Plugins directory and readme.txt files
插件开发建议
最后这个部分是关于开发插件的一些建议。
WordPress插件的代码应该遵循 WordPress Coding Standards. 另外请同时参考Inline Documentation。
你的插件中所有函数的名称都应该与现存的Wordpress Core函数,其他插件或主题的任何名称不同。基于这个原因,我们建议你在你的插件的所有函数的名称之前加上一个你自己选择的前缀,或者把你的插件的函数都写在一个类里面(当然这个类的名字也必须是唯一的)。
请不要把Wordpress数据库表格前缀(通常是“wp_”)直接写在你的插件里,请使用$wpdb-prefix 。
虽然数据库的读取相对便宜,但它的写入是相当昂贵的。数据库十分擅长获取信息并呈现给用户,而且这些操作(通常)是非常迅速的。然而对数据库进行改动就是一个非常复杂的过程了,而且需要使用更长的计算时间。因此,请尽量减少你对数据库进行写入的次数。在你编写程序的时候就做好所有的准备,这样就可以只在必须的时候再进行写入了。
在数据库里只SELECT你需要的东西。尽管数据库的读取十分便捷,我们依然推荐你值查找真正需要的数据,来尽量减少数据库的负载。例如,如果你只想获得表格的行数,不要使用 SELECT * FROM, 因为这样的话每一行中的所有数据都会被读出,导致内存的浪费。同样的,如果在插件中你只想获得post_id和post_author,请只 SELECT 这两项来减少数据库的负载。记住:在某一个操作的同时可能有其他上百个进程需要使用数据库,而数据库和服务器都必须同时满足所有这些进程的需求。学习怎样尽量减少你的插件对数据库的使用可以避免对这些资源的滥用。
不要让你的PHP出错。在你的wp_config.php文件中添加define('WP_DEBUG',true);,对你的所有函数进行测试来确定是否有任何的错误或者警告。有多少,就修复多少,直到再也不出现为止。
尽量不要直接调用script和style标记 —— 推荐使用 wp_enqueue_style() 和 wp_enqueue_script() 函数。他们帮助消除引用重复的脚本和样式,以及引进依赖的支持。
首先去wordpress官网下载或者直接登陆WP后台:插件》安装插件》在搜索框中输入websimon-tables,搜索到该插件》立即安装》启用。
设置表格属性和内容:在控制面板“工具”中找到websimon tables,然后设置行列、已经表格内容,如下图所示,可以设置好表格的内容和表格样式。
插入表格到文章内容:把设置好的表格,如上图所示找到对应的(shortcode)简码,直接复制插入到文章编辑器中,就完成了表格的插入。
测试效果
其它方法:
(1)使用修改wordpress的css样式来实现,不过这个工程浩大,本人觉得没那个必要。
(2)使用WP-Table Reloaded表格管理插件,这个也可以实现,但是效果不是很好。
WordPress默认的注册表单仅由两个字段组成—-用户名和邮箱。
这个仅有的用户名和邮箱表单字段使得注册速度非常的简单。首先,你输入一个用户名,然后输入邮箱,这个邮箱就是用来接收密码的。接下来,你使用邮箱接收到的密码登陆站点,并且完成个人资料,把密码修改成简单易记得。
仅仅是在站点注册,而不是让用户区经历这些压力,那为什么除了用户名和邮箱之外,不提供一个直接的、包含一些额外重要的表单字段,例如密码、个人的URL、个人简介、昵称和他们的姓名的注册表单供用户使用呢?
这对于像Tuts+的多用户网站是非常有用的。
在这篇文章中,我们将使用下列的表单字段建立一个自定义的表单注册插件:
username
password
website URL
first name
last name
nickname
biography (or an about section)
这个自定义表单插件可以通过使用短代码和联系模板整合到WordPress中。
利用短代码模板,你可以在你的站点中创建一个正式的注册页面。你也可以再一篇发表的文章中是用短代码模板,这样用户就可以在阅读完你的文章之后进行注册。
如果你想添加一个注册表单在你网站侧边栏的某个具体位置,你可以对WordPress主题中仅仅期望放置标签模板的位置进行编辑,来创建需要的注册表单。
在创建之前,需要注意的是,用户名、密码和电子邮件字段是必需的。
当我们编写验证函数时,我们将强制执行这些规则。
构建插件
正如说的那样,我们开始对插件编码。首先,包含插件的头部:
?php
/*
Plugin Name: Custom Registration
Plugin URI:
Description: Updates user rating based on number of posts.
Version: 1.0
Author: Agbonghama Collins
Author URI:
*/
接下来,我们创建一个包含注册表单的HTML代码的PHP函数:
function registration_form( $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio ) {
echo '
style
div {
margin-bottom:2px;
}
input{
margin-bottom:4px;
}
/style
';
echo '
form action="' . $_SERVER['REQUEST_URI'] . '" method="post"
div
label for="username"Username strong*/strong/label
input type="text" name="username" value="' . ( isset( $_POST['username'] ) ? $username : null ) . '"
/div
div
label for="password"Password strong*/strong/label
input type="password" name="password" value="' . ( isset( $_POST['password'] ) ? $password : null ) . '"
/div
div
label for="email"Email strong*/strong/label
input type="text" name="email" value="' . ( isset( $_POST['email']) ? $email : null ) . '"
/div
div
label for="website"Website/label
input type="text" name="website" value="' . ( isset( $_POST['website']) ? $website : null ) . '"
/div
div
label for="firstname"First Name/label
input type="text" name="fname" value="' . ( isset( $_POST['fname']) ? $first_name : null ) . '"
/div
div
label for="website"Last Name/label
input type="text" name="lname" value="' . ( isset( $_POST['lname']) ? $last_name : null ) . '"
/div
div
label for="nickname"Nickname/label
input type="text" name="nickname" value="' . ( isset( $_POST['nickname']) ? $nickname : null ) . '"
/div
div
label for="bio"About / Bio/label
textarea name="bio"' . ( isset( $_POST['bio']) ? $bio : null ) . '/textarea
/div
input type="submit" name="submit" value="Register"/
/form
';
}
请注意注册字段是作为变量传递给上面的函数。在函数中,你会看到下面代码的示例:
( isset( $_POST['lname'] ) ? $last_name : null )
这个三元操作符是检查全局变量数组$_POST是否包含数据,如果有数据,就把填充的表单字段值保存以便进入下一个字段。
除非你验证了表单数据并且清空了表单数据,一个注册表单才能算完成,否则就不算。因此,我们要创建一个名为 registration_validation的表单验证函数。
为了简化验证的”痛苦”,我们可以使用WordPress中的 WP_Error 类。跟着我编写验证函数:
1、创建函数,并将注册表单的字段值作为函数的参数传递进来
function registration_validation( $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio ) {
2、实例化 WP_Error 类,并把实例作为全局变量,以便于我们可以再函数的作用域之外使用。
global $reg_errors;
$reg_errors = new WP_Error;
3、记住:我们说的用户名、密码和电子邮件是必填的,不要忽略了。为了执行这个规则,我们需要检查它们中任何一个是否为空。如果为空,我们就将错误信息追加给 WP_Error 类的实例。
if ( empty( $username ) || empty( $password ) || empty( $email ) ) {
$reg_errors-add('field', 'Required form field is missing');
}
4、我们也可以确保用户名的字符个数不小于4
if ( 4 strlen( $username ) ) {
$reg_errors-add( 'username_length', 'Username too short. At least 4 characters is required' );
}
5、检查用户名是否被注册了
if ( username_exists( $username ) )
$reg_errors-add('user_name', 'Sorry, that username already exists!');
6、利用WordPress的 validate_username 函数确保用户名是可用的
if ( ! validate_username( $username ) ) {
$reg_errors-add( 'username_invalid', 'Sorry, the username you entered is not valid' );
}
7、确保用户输入的密码的字符个数不小于5
if ( 5 strlen( $password ) ) {
$reg_errors-add( 'password', 'Password length must be greater than 5' );
}
8、检查电子邮件是否有效
if ( !is_email( $email ) ) {
$reg_errors-add( 'email_invalid', 'Email is not valid' );
}
9、检查电子邮件是否被注册
if ( !is_email( $email ) ) {
$reg_errors-add( 'email_invalid', 'Email is not valid' );
}
10.、如果用户填写了网站字段,需要检查其是否有效
if ( ! empty( $website ) ) {
if ( ! filter_var( $website, FILTER_VALIDATE_URL ) ) {
$reg_errors-add( 'website', 'Website is not a valid URL' );
}
}
11、最后,我们在WP_Error实例中对错误进行循环,并显示个别的错误
if ( is_wp_error( $reg_errors ) ) {
foreach ( $reg_errors-get_error_messages() as $error ) {
echo 'div';
echo 'strongERROR/strong:';
echo $error . 'br/';
echo '/div';
}
}
这样,验证函数就完成了。接下来是 complete_registration()函数,用于处理用户注册。用户的注册真正完成是通过wp_insert_user函数,
用户的数据作为数据保存后可以作为此函数的参数。
function complete_registration() {
global $reg_errors, $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio;
if ( 1 count( $reg_errors-get_error_messages() ) ) {
$userdata = array(
'user_login' = $username,
'user_email' = $email,
'user_pass' = $password,
'user_url' = $website,
'first_name' = $first_name,
'last_name' = $last_name,
'nickname' = $nickname,
'description' = $bio,
);
$user = wp_insert_user( $userdata );
echo 'Registration complete. Goto a href="' . get_site_url() . '/wp-login.php"login page/a.';
}
}
在上面的函数中,我们将$reg_errors作为WP_Error的实例,并将表单字段作为全局变量以便于可以再全局作用域中使用。
我们需要检查$reg_errors是否包含任何错误,如果没有错误,则将用户注册信息插入到WordPress的数据库并用登陆链接来显示注册完成的信息。
然后,把所有我们之前创建的函数全部放在全局函数 custom_registration_function()之中
function custom_registration_function() {
if ( isset($_POST['submit'] ) ) {
registration_validation(
$_POST['username'],
$_POST['password'],
$_POST['email'],
$_POST['website'],
$_POST['fname'],
$_POST['lname'],
$_POST['nickname'],
$_POST['bio']
);
// sanitize user form input
global $username, $password, $email, $website, $first_name, $last_name, $nickname, $bio;
$username = sanitize_user( $_POST['username'] );
$password = esc_attr( $_POST['password'] );
$email = sanitize_email( $_POST['email'] );
$website = esc_url( $_POST['website'] );
$first_name = sanitize_text_field( $_POST['fname'] );
$last_name = sanitize_text_field( $_POST['lname'] );
$nickname = sanitize_text_field( $_POST['nickname'] );
$bio = esc_textarea( $_POST['bio'] );
// call @function complete_registration to create the user
// only when no WP_error is found
complete_registration(
$username,
$password,
$email,
$website,
$first_name,
$last_name,
$nickname,
$bio
);
}
registration_form(
$username,
$password,
$email,
$website,
$first_name,
$last_name,
$nickname,
$bio
);
}
我需要说明一下全局函数 custom_registration_function()中有哪些代码。
首先,我通过检查$_POST['submit']是否是空来确定表单是否提交。如果提交了,我就调用
registration_validation()函数来验证用户提交的表单.
然后,确保表单数据的有效性并将有效的数据在表单字段域之后用一个变量命名。最后,调用
complete_registration()函数保存用户。我需要调用registration_form()函数来显示用户注册表单。
我之前提到过,我打算用短代码模板来支持注册插件。下面就是短代码模的支持代码:
// Register a new shortcode: [cr_custom_registration]
add_shortcode( 'cr_custom_registration', 'custom_registration_shortcode' );
// The callback function that will replace [book]
function custom_registration_shortcode() {
ob_start();
custom_registration_function();
return ob_get_clean();
}
到这里为止,我们已经完成了插件