鲍成龙
鲍成龙

我们知道 Linux 服务器有个 Cron 的功能,可以用来设置定时执行的作业,但是并不是每个人都熟悉 Linux 系统,并且也不是所有的主机管理面板都有 Cron 栏目。

其实 WordPress 本身也有类似于 Cron 的功能,让我们可以直接在 WordPress 中定义和执行定时作业,WordPress 把这个功能定义为:WP-Cron,比如 WordPress 本身的文章预发布功能就是基于 WP-Cron 实现的。

WP-Cron 功能是基于页面浏览的,所以时间上不会十分准确,但是随着站点流量增大,这个准确度会越来越高的。WP-Cron 定义了一套完整的 API,让 WordPress 第三方开发者可以通过插件的去定义定时作业。

 

定义作业

WP-Cron 支持两种类型的定义作业:

单一的未来事件(比如设定某篇文章在将来某个时间发布)
重复发生的事件,比如每天或每个星期等一段时间内重复发生的事件(比如定时清理无用的信息)

 

定义单一的未来事件

我们可以使用函数

wp_schedule_single_event($timestamp, $hook, $args)

来定义单一的未来事件,它有三个参数:

$timestamp:事件发生的时间戳。

$hook:事件调用的 hook,需要预先通过 add_action 关联定时作业的回调函数。

$args:传给回调函数的参数数组。

定义重复发生的事件

我们可以使用函数

wp_schedule_event($timestamp, $recurrence, $hook, $args)

来定义重复发生的时间。

$timestamp,$hook 和 $args 这三个参数含义和 wp_schedule_single_event 的一样。

$recurrence:事件重复的频率。

定时作业的频率

WordPress 已经内置了四种重复频率:

频率 描述
hourly 每小时1次
twicedaily 每天2次 -- 12小时1次
daily 每天1次 -- 24小时1次
weekly 每周1次

 

但是如果还不够用,比如每15分钟1次,甚至频率更高一些,每5分钟1次。WP-Cron 也支持自定义事件频率类型。

查看 wp_get_schedules() 函数的源代码,频率内部是使用秒数来定义的,然后我们可以通过 cron_schedule 这个 filter 去自定义频率:

add_filter('cron_schedules', unction($schedules){
	return array_merge($schedules, [
		'five_minutes'		=> ['interval'=>300,	'display'=>'每5分钟一次'],
		'fifteen_minutes'	=> ['interval'=>900,	'display'=>'每15分钟一次'],
	]);
});

 

定时作业的 hook 和回调函数

从上面可知,WordPress 的定时作业对应就是一个 hook,然后通过 hook 关联具体的回调函数,比如我们要定义一个每天都要执行的作业,我们把这个作业 hook 定义为:daily_function_hook,具体的回调函数为:daily_function。

function daily_function(){
	// 把每天定时执行的作业具体的代码写在这里
}

把回调函数关联到 hook 上:

add_action( 'daily_function_hook', 'daily_function');

将 hook 加入到定时作业列表,有两种方法:

1. 代码的方式:

if(!wp_next_scheduled('daily_function_hook')){
	wp_schedule_event(time(), 'daily', 'daily_function_hook');
}

上面代码,首先使用函数 wp_next_scheduled 检测 daily_function_hook 是否已经被加入到定时作业列表中,如果没有,我们使用 wp_schedule_event 函数加入,这样可以确保作业只被定义一次。

 

 

 

鲍成龙

WordPress 提供了一个,timer_stop()函数,官方给出的介绍为:检索或显示从页面开始到调用函数的时间。简单的说就是我们访问一个 WordPress 链接,服务器生成处理这个页面所需要的时间,当然这并不是指我们打开或者加载这个页面的时间。更多的是服务器端的处理速度和 WordPress 本身运行情况。

//函数
timer_stop( $display, $precision = 3 )
 
//$display:是否直接输出,int | bool 必选,是否回显或返回结果。0 或 false 表示返回;1 或 true 表示输出显示。默认值为 0 | false。
 
//$precision:精度,int 可选,指要显示的小数点右边的位数。默认为 3.
 
//示例
 
<?php timer_stop(1);//直接输出显示 ?>

最后分享一个比较常见的关于 WordPress 显示当前页面数据库查询次数、页面生成时间以及服务器内存消耗情况的方法代码,如下:

<?php echo '<!-- ' . get_num_queries() . ' queries in ' . timer_stop(0,3) . ' seconds ' . memory_get_peak_usage()/1024/1024 . 'MB memory -->';?>

 

鲍成龙

这一篇为大家讲解如何将数据保存到数据库中,并且显示在页面上,不会因提交表单时刷新页面输入框中内容消失。要实现这一功能我们需要借助WordPress函数来实现,下面就来讲解具体的实现方法,先把代码贴出来。还是根据之前的那个插件样例,大家可以直接在上面做修改。

WordPress插件制作教程(四): 将数据保存到数据库

// 在WordPress后台评论处添加一个子菜单
add_action('admin_menu', 'comments_submenu');
function comments_submenu() {
    add_comments_page(__('数据保存'), __('数据保存'), 'read', 'my-unique-identifier-datasave', 'add_comments_submenu');
}
// WordPress后台评论处菜单page
function add_comments_submenu(){
   if($_POST['test_hidden'] == 'y') {
       update_option('test_input_c',$_POST['test_insert_options']); //更新你添加的数据库
?>
     <div id="message" style="background-color: green; color: #ffffff;">保存成功 !</div>
<?php
   }
?>
  <div>
      <?php screen_icon(); //显示图标  ?>
      <h2>添加数据</h2>
      <form action="" method="post" id="my_plugin_test_form">
          <h3>
              <label for="test_insert_options">输入测试数据:</label>
              <input type="text" id="test_insert_options" name="test_insert_options" value="<?php  echo esc_attr(get_option('test_input_c')); ?>"  />
          </h3>
          <p>
              <input type="submit" name="submit" value="保存" class="button button-primary" />
              <input type="hidden" name="test_hidden" value="y"  />
          </p>
      </form>
  </div>
<?php
}
// 通过get_option()来显示存在数据库中的信息。
// 以上填写的信息都存在了数据库中的wp_options表里面。

上面简短的代码就实现了数据保存并显示的功能,通过这个功能我们就可以延伸到其他的方法或者功能上面。比如一些不错的主题都带有主题设置,里面的一些显示和存储都可以用上面的方法来实现,大家可以多多去尝试下。

2. 创建自定义插件设置菜单,实现options表的字段的更新设置:如图

WordPress插件制作教程(四): 将数据保存到数据库

WordPress插件制作教程(四): 将数据保存到数据库

<?php
// 创建自定义插件设置菜单
add_action('admin_menu', 'baw_create_menu');
function baw_create_menu() {
    // 创建新的顶级菜单
    add_menu_page('BAW Plugin Settings', 'BAW Settings', 'administrator', __FILE__, 'baw_settings_page', '');
    // 调用注册设置函数
    add_action( 'admin_init', 'register_mysettings' );
}
function register_mysettings() {
    // 注册我们的设置
    register_setting( 'baw-settings-group', 'new_option_name' );
    register_setting( 'baw-settings-group', 'some_other_option' );
    register_setting( 'baw-settings-group', 'option_etc' );
}
function baw_settings_page() {
?>
<div class="wrap">
<h2>你的插件名称</h2>
<form method="post" action="options.php">
    <?php settings_fields( 'baw-settings-group' ); // 设置字段 这个函数取代了 nonce magic, action field, and page_options ?>
    <?php do_settings_sections( 'baw-settings-group' ); // 这个函数取代了表单字段标记形式本身 ?>
    <table class="form-table">
        <tr valign="top">
        <th scope="row">New Option Name</th>
        <td><input type="text" name="new_option_name" value="<?php echo esc_attr( get_option('new_option_name') ); ?>" /></td>
        </tr>
         
        <tr valign="top">
        <th scope="row">Some Other Option</th>
        <td><input type="text" name="some_other_option" value="<?php echo esc_attr( get_option('some_other_option') ); ?>" /></td>
        </tr>
        
        <tr valign="top">
        <th scope="row">Options, Etc.</th>
        <td><input type="text" name="option_etc" value="<?php echo esc_attr( get_option('option_etc') ); ?>" /></td>
        </tr>
    </table>
    <?php submit_button(); ?>
</form>
</div>
<?php }?>

WordPress 选项机制

参阅Creating Options Pages,你将学会如何去创建一个自动保存选项数据的页面。

WordPress有一个"选项"机制,用于保存、更新以及检索那些独立的,具有特定名称的数据。选项的值可以是字符串、数组,甚至是PHP对象(当然,PHP对象在保存时必须能够被序列化或转换成字符串,检索的时候也必须能够被反序列化)。选项的名称必须是字符串,且必须是唯一的,这样才能够确保它们不会和WoredPress或其它插件产生冲突。

通常情况下,你最好能够对插件选项的数量进行一下精简。例如,如果你有10个不同名称的选项需要保存到数据库中,那么,你就可以考虑将这10个数据作为一个数组,并保存到数据库的同一个选项中。

以下是让你的插件使用选项机制的主要函数:

add_option($name, $value, $deprecated, $autoload);
// 官方文档: http://codex.wordpress.org/Function_Reference/add_option
// 创建一个新的选项并保存到数据库中,若选项已存在,则不进行任何操作。
// $name 必要参数(string)。要创建的选项的名称。
// $value 可选参数(string)。要创建的选项的值。默认值为空字符串。
// $deprecated 可选参数(string)。该选项是否已经过期。若需要让后面的$autoload参数生效,则该参数必须传入空字符串或null。
// $autoload 可选参数(enum: 'yes' or 'no')。是否自动加载该选项。若设置为 'yes',则该选项会被get_alloptions 函数自动检索到。默认值为 'yes'。
delete_option($option);
// 官方文档: http://codex.wordpress.org/Function_Reference/delete_option
// $option 必要参数(string) 选择要删除的选项的名称。有效的默认选项的列表可以在Option Reference选择参考。
update_option($option_name, $newvalue);
// 官方文档: http://codex.wordpress.org/Function_Reference/update_option
// 更新数据库中的选项值,若选项不存在,则创建该选项。
// (注意:如果你用不到$deprecated和$autoload参数的话,那么大可不必使用add_option函数)。
// $option_name 必要参数(string)。要更新/创建的选项名称。
// $newvalue 必要参数(string|array|object)。要更新/创建的选项的值。
get_option($option);
// 官方文档: http://codex.wordpress.org/Function_Reference/get_option
// 从数据库中获取指定选项的值。
// $option 必要参数(string)。选项的名称。你可以在Option Reference中找到与WordPress一同安装的默认选项列表。
"admin_email"——博客管理员的电子邮件地址。
"blogname"——博客标题,一般设置选项。
"blogdescription"——为你的博客标语;一般设置选项。
为你的博客"blog_charset"——字符编码;设置在阅读选项。
"date_format"——默认日期格式,一般设置选项。
"default_category"——默认文章类别;书面设置选项。
"home"——博客的网址,一般设置选项。
中的"siteurl"——WordPress网站地址,一般设置选项。
    警告:这不是一样get_bloginfo(中的"siteurl")(将返回主页url),但随着get_bloginfo("wpurl")。
"template"——当前主题的名字,表示。
"start_of_week"——天星期日历应该开始,一般设置选项。
"upload_path"——默认上传位置;设置在杂项选项。
"posts_per_page"——最大数量的帖子显示在页面上,设置在阅读选项。
"posts_per_rss"——最大数量的最近的帖子显示聚合提要;设置在阅读选项。
可以有更多的选择,这取决于你有什么插件安装。访问/ wp-admin /选项。php页面的完整列表。
强调独立的单词,小写字母只有——这将是在数据库中。

本章总结:

1. 本章主要介绍add_option()、delete_option()、 update_option(),、get_option() 四个函数的方法

2. 官方文档 参考:https://codex.wordpress.org/Function_Reference

Options

 

鲍成龙

这一篇我们在更深一步,当我们激活插件后后台会显示菜单出来,然后通过单击菜单显示自己定义好的信息。激活之后会在WordPress后台显示一个菜单,下面会有多个子菜单,如下图:

1. 在WordPress后台添加一个同级主菜单,在主菜单下添加子菜单

WordPress插件制作教程(三): 添加菜单的方法

// add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); 
// 官方文档: http://codex.wordpress.org/Function_Reference/add_menu_page
// 关于参数:
// $page_title:(字符串) (必须) 这个参数是子菜单的标题,将会显示在浏览器的标题栏,默认为空;
// $menu_title:(字符串) (必须) 显示的菜单名称,默认为空;
// $capability:(字符串) (必须) 用户权限,定义了具有哪些权限的用户会看到这个子菜单(权限部分请看文章结尾处),默认为空;关于用户权限的官方文档:http://codex.wordpress.org/Roles_and_Capabilities
// $menu_slug:(字符串) (必须) 显示在URl上面的菜单名称,默认为空;
// $function:返回的方法名称;
// $icon_url:(字符串) (可选) 显示的菜单图标,可以使用plugin_dir_url( __FILE__ ),图标宽高为16像素;
// $position:(整数) (可选) 显示菜单的位置。常用位置,4或者59或者99。
// add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );
// 官方文档: http://codex.wordpress.org/Function_Reference/add_submenu_page
// 关于参数:
// $parent_slug:(字符串) (必须)顶级菜单名称,可以在顶级菜单中加入我们的子菜单,也可以在自定义顶级菜单中加入子菜单;(也就是 add_menu_page() 函数中的 $menu_slug 参数)
// $page_title:(字符串) (必须) 这个参数是子菜单的标题,将会显示在浏览器的标题栏,默认为空;
// $menu_title:(字符串) (必须) 显示的菜单名称,默认为空;
// $capability:(字符串) (必须) 用户权限,定义了具有哪些权限的用户会看到这个子菜单(权限部分请看文章结尾处),默认为空;关于用户权限的官方文档:http://codex.wordpress.org/Roles_and_Capabilities
// $menu_slug:(字符串) (必须) 显示在URl上面的菜单名称,默认为空;
// $function:所有调用的函数名称,通过调用这个函数来显示这个子菜单页面的内容。
// 显示主菜单和子菜单
add_action('admin_menu','add_settings_menu');
function add_settings_menu() {
    add_menu_page(__('自定义菜单标题'), __('测试菜单'), 'administrator',  __FILE__, 'my_function_menu', false, 100);
    add_submenu_page(__FILE__,'子菜单1','测试子菜单1', 'administrator', 'your-admin-sub-menu1', 'my_function_submenu1');
    add_submenu_page(__FILE__,'子菜单2','测试子菜单2', 'administrator', 'your-admin-sub-menu2', 'my_function_submenu2');
    add_submenu_page(__FILE__,'子菜单3','测试子菜单3', 'administrator', 'your-admin-sub-menu3', 'my_function_submenu3');
}
function my_function_menu() {
  echo "<h2>测试菜单设置</h2>";
}
function my_function_submenu1() {
   echo "<h2>测试子菜单设置一</h2>";
}
function my_function_submenu2() {
    echo "<h2>测试子菜单设置二</h2>";
}
function my_function_submenu3() {
    echo "<h2>测试子菜单设置三</h2>";
}

2. 在WordPress后台外观菜单里面添加一个子菜单

WordPress插件制作教程(三): 添加菜单的方法

// add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function );
// 官方文档: http://codex.wordpress.org/Function_Reference/add_theme_page
// 关于参数:
// $page_title: (string) (required) 显示菜单的标题,将会显示在浏览器的标题栏,默认为空;
// $menu_title: (string) (required) 显示的菜单名称,默认为空;
// $capability: (string) (required) 用户权限,定义了具有哪些权限的用户会看到这个子菜单(权限部分请看文章结尾处),默认为空;关于用户权限的官方文档:http://codex.wordpress.org/Roles_and_Capabilities
// $menu_slug: (string) (required)  显示在URl上面的菜单名称. 默认为空;
// $function: (callback) (optional) 通过调用这个函数来显示这个子页面的内容。 Default: ' '
//在WordPress后台外观菜单里面添加一个子菜单
add_action('admin_menu', 'appearance_submenu');
function appearance_submenu() {
  add_theme_page(__('插件设置'), __('插件设置'), 'administrator', 'your-unique-identifier', 'add_appearance_submenu');
}
function add_appearance_submenu() {
  echo '<div><p>这儿就是主题插件设置的地方.</p></div>';
}

3.  在WordPress后台仪表盘处添加一个子菜单

WordPress插件制作教程(三): 添加菜单的方法

// add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function);
// 官方文档: http://codex.wordpress.org/Function_Reference/add_dashboard_page
// 关于参数:
// $page_title: (string) (required) 显示菜单的标题,将会显示在浏览器的标题栏,默认为空;
// $menu_title: (string) (required) 显示的菜单名称,默认为空;
// $capability: (string) (required) 用户权限,定义了具有哪些权限的用户会看到这个子菜单(权限部分请看文章结尾处),默认为空;关于用户权限的官方文档:http://codex.wordpress.org/Roles_and_Capabilities
// $menu_slug: (string) (required)  显示在URl上面的菜单名称. 默认为空;
// $function: (callback) (optional) 通过调用这个函数来显示这个子页面的内容。 Default: ' '
// 在WordPress后台仪表盘处添加一个子菜单
add_action('admin_menu', 'dashboard_submenu');
function dashboard_submenu() {
    add_dashboard_page(__('仪表盘设置'), __('仪表盘设置'), 'read', 'your-unique-identifier', 'add_dashboard_submenu');
}
function add_dashboard_submenu() {
  echo '<div><p>这儿就是仪表盘菜单设置的地方.</p></div>';
}

4. 在WordPress后台评论处添加一个子菜单

WordPress插件制作教程(三): 添加菜单的方法

// add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function);
// 官方文档: http://codex.wordpress.org/Function_Reference/add_comments_page
// 关于参数:
// $page_title: (string) (required) 显示菜单的标题,将会显示在浏览器的标题栏,默认为空;
// $menu_title: (string) (required) 显示的菜单名称,默认为空;
// $capability: (string) (required) 用户权限,定义了具有哪些权限的用户会看到这个子菜单(权限部分请看文章结尾处),默认为空;关于用户权限的官方文档:http://codex.wordpress.org/Roles_and_Capabilities
// $menu_slug: (string) (required)  显示在URl上面的菜单名称. 默认为空;
// $function: (callback) (optional) 通过调用这个函数来显示这个子页面的内容。 Default: ' '
// 在WordPress后台评论处添加一个子菜单
add_action('admin_menu', 'comments_submenu');
function comments_submenu() {
    add_comments_page(__('评论菜单'), __('我的评论'), 'read', 'your-unique-identifier-comments', 'add_comments_submenu');
}
function add_comments_submenu() {
    echo '<div><p>这儿就是评论菜单设置的地方.</p></div>';
}

5. 以上介绍了不同的显示方法和显示位置。除此之外还有

add_posts_page();      // 在文章处添加子菜单
add_media_page();      // 在媒体处添加子菜单
add_links_page();      // 在链接处添加子菜单
add_pages_page();      // 在页面处添加子菜单
add_plugins_page();    // 在插件处添加子菜单
add_users_page();        // 在用户处添加子菜单
add_management_page(); // 在工具处添加子菜单
add_options_page();    // 在设置处添加子菜单
// 这些都是在WordPress后台添加菜单以及子菜单的方法。大家可以根据自己的需要来进行选择

最后附上:各个用户角色所具有的权限,可以参看这个对应关系表:Capability vs. Role Table,横坐标是用户角色,纵坐标是用户权限,中间蓝色高亮部分为各个角色所拥有的权限。

本章总结:

1. 分别在WP后台的,主菜单、外观菜单、仪表盘菜单、评论菜单处,添加菜单级子菜单

2. 有关本章所涉及到的函数参考,官方文档:https://codex.wordpress.org/Function_Reference

 

鲍成龙

这一篇简单给大家写一个插件样例,让大家有一个基本的印象。这个插件的样例就是当你激活这个插件后会在你的每篇文章中插入一段自己定义好的内容,比如你想插入版权信息,订阅信息等等,下面就来简单写这个给每篇文章后面添加版权信息的方法。如下面代码:

<?php
/**
 * @package 添加版权信息
 * @version 1.0
 */
/*
Plugin Name: 添加版权信息
Plugin URI: http://www.cnblogs.com/fxmbz/4059745.html
Description: 这是一款简单的插件样例,将自己定义好的内容显示每篇文章后面
Author: myname
Version: 1.0
Author URI: http://www.cnblogs.com/fxmbz
*/
// 当加载文章内容的时候,执行添加版权信息的方法
add_action('the_content', 'add_copyright_info');
/**
 * [add_copyright_info 输出内容后连上要显示的版权信息,简单设置增加版权信息的内容的样式]
 * @param [type] $content [string]
 */
function add_copyright_info ($content){
    $content .= '<div style="clear:both; border-top:1px dashed #e0e0e0; padding:10px 0 10px 0; font-size:12px;">版权所有©转载必须以链接形式注明作者和原始出处:<a href="'.get_bloginfo("home").'" title="点击去首页">'.get_bloginfo("name").'</a> » <a title="本文地址" href="'.get_permalink().'">'.get_the_title().'</a></div>' ;
    return $content;
}
?>

在插件所在文件夹(wp-content/plugins/)创建一个文件,比如叫add_copyright.php然后将上面的代码放到这个文件里面。接着刷新WordPress后台点击插件菜单看是否存在这个插件名称,如果有激活一下,然后你再去wp前台页面看每篇文章内容后面都会有定义好的信息显示出来了。这样一个非常简单的插件就做好了。有的朋友可能会问这么简单的方法也需要做成插件吗? 是的,如果你将里面的

// 当加载文章内容的时候,执行添加版权信息的方法
add_action('the_content', 'add_copyright_info');
/**
 * [add_copyright_info 输出内容后连上要显示的版权信息,简单设置增加版权信息的内容的样式]
 * @param [type] $content [string]
 */
function add_copyright_info ($content){
    $content .= '<div style="clear:both; border-top:1px dashed #e0e0e0; padding:10px 0 10px 0; font-size:12px;">版权所有©转载必须以链接形式注明作者和原始出处:<a href="'.get_bloginfo("home").'" title="点击去首页">'.get_bloginfo("name").'</a> » <a title="本文地址" href="'.get_permalink().'">'.get_the_title().'</a></div>' ;
    return $content;
}

代码直接放在主题的Functions.php文件里面也是可以工作的,这样就减少了插件的使用次数,感兴趣的可以去试试。

通过这个简单样例,制作插件其实不是你想的那么难,但是你需要有好的PHP基础,以及要更多的去浏览官网的插件文档。在以后的文章中我会把这些插件比较常用的函数介绍一下。给大家提供更好的帮助。

本章总结:

1. 创建一个插件,功能是 在文章内容后面 添加一个版权信息

2. 简单插件的文件也可以跟随主题一并启用,需要将插件内的代码放置在 wordpress/wp-content/themes/twentyfourteen(当前启用主题文件夹)/functions.php文件中

WordPress插件制作教程(二): 编写一个简单的插件

 

鲍成龙

相信大家都知道插件的安装文件在什么地方吧,没错就在WP-Content->plugins里面,我们所安装的插件都存放在了这个文件夹里面。当我们刚开始搭建好WordPress网站的时候,里面会默认提供两个插件,一个是Akismet(过滤垃圾评论插件)和一个hello插件(显示歌词的插件)。我们可以打开hello.php这个文件,这个插件相当于我们制作插件的入口,通过查看里面的内容,就可以知道创建一个插件的方法。如下:

<?php
/**
 * @package Hello_Dolly
 * @version 1.6
 */
/*
Plugin Name: Hello Dolly
Plugin URI: http://wordpress.org/plugins/hello-dolly/
Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
Author: Matt Mullenweg
Version: 1.6
Author URI: http://ma.tt/
*/
// 上面分别是 插件的名称,插件URL地址,插件描述,插件作者,插件版本,作者地址. 这些内容使用 '/*  */' 注释符号括住

这里要注意的是你创建的插件名称和插件文件夹名称必须是唯一的,独一无二的,这样避免与其他插件发送冲突。可以去Google或者百度先验证一下这个名字到底是不是独一无二的。还有就是你的取的插件名字得让别人明白你的插件是干什么的,文件夹名称不能使用中文名称,下面就简单的说一下流程。

首先你需要考虑所制作插件的复杂度,如果很简单可以直接创建一个文件,如果涉及的文件较多,需要创建一个文件夹。不管哪种需要名称的唯一性,比如创建一个插件文件夹名为my_plugin,然后在文件中创建下面的信息。

/**
 * @package Hello_Dolly
 * @version 1.6
 */
/*
Plugin Name: My Plugin
Plugin URI: http://www.myplugin.com
Description: 我制作的第一个WP插件
Author: myname
Version: 1.0
Author URI: http://www.cnblogs.com/fxmbz
*/

标准的插件信息至少要有插件名称,这样WordPress才能识别你的插件。其他信息将显示在控制面板插件管理页面中。 标准插件信息对各行顺序没有要求。 创建好之后你的后台便会出现你刚刚创建的插件。这样你的插件就算创建成功了,还有一般在插件信息的下面可以添加版权信息。

/*
  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官网(插件提交与推广参考:https://codex.wordpress.org/Plugin_Submission_and_Promotion),或者给用户有一个很好的说明。可以添加一个名称为 Readme.txt 的文件。里面可以介绍插件的功能、安装方法、使用说明、适用的WordPress版本、插件更新信息等。

插件的创建还是比较容易的。大家可以根据自己的习惯和需求添加一些其它内容,比如可以写一个html页面专门来介绍你的插件。还有就是在开始制作插件之前多多研究下已有插件的写法,每个插件的制作方法千变万化,如果有不错的方法要及时做好总结。这样我们在开发的过程中可以少走很多弯路。

本章总结:

1. WordPress插件,文件放置的目录:wordpress/wp-content/plugins/myplugin/myplugin.php

2. WordPress插件,的声明范本

3. 实现简单的插件功能(在wp后台头部输出自定义字符串)

/**
 * @package My Plugin
 * @version 1.6
 */
/*
Plugin Name: My Plugin
Plugin URI: http://www.cnblogs.com/fxmbz/p/4059678.html
Description: 我制作的第一个WP插件,这个插件就是在后台页面的头部显示一段文字
Author: zhangxl
Version: 1.0
Author URI: http://www.cnblogs.com/fxmbz
*/
/*
  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
 */
// 在wp后台头部输出自定义的字符串
add_action('admin_head', 'my_first_plugin');
function my_first_plugin() {
    echo '<h1>我制作的第一个WP插件</h1>';
}

 

鲍成龙

register_taxonomy()函数为自定义的Post type添加自定义分类功能。

语法结构

<?php register_taxonomy($taxonomy, $post_type, $args); ?> //为自定义的Post type添加自定义分类功能

参数

$taxonomy添加的类的名称

$post_type注册的自定义类型

$labels的详细参数

‘name’ – 分类的通用名称,通常为复数
‘singular_name’ – 此分类法的一个对象的名称
‘search_items’ – 搜索项目文字。默认为__(’搜索标签’)或__(’搜索类别’)
‘popular_items’ – 热门项目文字。默认为__(’热门标签’)或null
‘all_items’ – 所有项目文本。默认为__(’所有标签’)或__(’所有类别’)
‘parent_item’ – 父项文本。此字符串不用于非分层分类法,例如帖子标记。默认值为null或__(’父类别’)
‘parent_item_colon’ – 与结果相同parent_item,但:结尾为冒号,__(’父类别:’)
‘edit_item’ – 编辑项目文本。默认为__(’编辑标签’)或__(’编辑类别’)
‘update_item’ – 更新项目文本。默认为__(’更新标签’)或__(’更新类别’)
‘add_new_item’ – 添加新项目文本。默认为__(’添加新标签’)或__(’添加新类别’)
‘new_item_name’ – 新项目名称文本。默认为__(’新标签名称’)或__(’新类别名称’)
‘separate_items_with_commas’ – 分类项元框中使用逗号文本的单独项目。此字符串不用于分层分类法。默认值为__(’带逗号的单独标签’)或null
‘add_or_remove_items’ – 添加或删除项目文本,并在禁用JavaScript时在元框中使用。此字符串不用于分层分类法。默认值为__(’添加或删除标记’)或null
‘choose_from_most_used’ – 从分类法元框中使用的最常用文本中进行选择。此字符串不用于分层分类法。默认值为__(’从最常用的标签中选择’)或null
‘menu_name’ – 菜单名称文字。此字符串是提供菜单项的名称。默认为name的值

$args的详细参数

public- 否应在管理UI中公开此分类

  1. show_ui – 是否生成用于管理此分类的默认UI。默认值:如果未设置,则默认为public参数的值
  2. show_in_nav_menus – true使此分类在导航菜单中可供选择,默认值:如果未设置,则默认为public参数的值
  3. show_tagcloud – 是否允许Tag Cloud小部件使用此分类,默认值:如果未设置,则默认为show_ui参数的值
  4. 增加几个参数类型。分别是
    show_in_rest ,rest_baserest_controller_class。第一个参数可以理解为是否在 REST API 中显示,所以参数值必须是 true;第二个参数可以理解为通过哪个 REST API 显示数据,所以参数值最好是自定义文章类型的别名,且必须是英文或是拼音,比如:bbs;第三个参数可以理解为采用哪个 REST API 的控制类,所以参数值必须是使用文章的控制类:WP_REST_Posts_Controller。加上这三个参数项,基本上自定义文章类型的 REST API 就创建成功了。
<?php$labels = array(
        'name' => '产品分类',
        'singular_name' => '产品分类',
        'search_items' =>  '搜索产品' ,
        'all_items' => '所有产品' ,
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => '编辑产品' ,
        'update_item' => '更新产品' ,
        'add_new_item' => '添加产品' ,
        'new_item_name' => '新产品',
        'separate_items_with_commas' => '' ,
        'add_or_remove_items' => '添加或删除',
        'choose_from_most_used' => '从经常使用的类型中选择',
        'menu_name' => '产品分类',
    );
    register_taxonomy(
        'products', array('product'),
        array(
            'labels' => $labels,
            'hierarchical' => true,
            'show_ui' => true,
            'query_var' => true,
        )
    );?>

前台调用

自定义分类法的分类列表页面模板文件是taxonomy.php或taxonomy-{taxonomy_slug}.php,taxonomy.php是所有自定义分类法默认调用的模板文件,taxonomy-{taxonomy_slug}.php则是指定自定义分类法调用的模板文件,比如本教程中创建的自定义分类法products,使用taxonomy-products.php文件即可指定调用。

TIPS

强调一点,添加过新的自定义分类之后一定要更新下固定连接,只需要点击保存设置就行,不然前台是调用不出来的。

 

鲍成龙

有时候我们需要用到is_home()来判断是不是wordpress的首页,从而进行一些相关配置,但是有一点需要注意,当你的首页不是默认的index.php的时候,比如是在后台指定了一个页面。这种情况下is_home也会失效。

也就是说这样子的情况下就不能再用is_home来判断了。而是要用is_front_page来进行判断。is_front_page是判断当前页是不是指定的首页。

记录

 

鲍成龙

 

the_time()和data()区别是返回类型不停,前者是void,后者是string。两者的使用方法基本相同。

WordPress The_time()的使用方法

代码示例1:

//wordpress the_time()函数 
<? php the_time('Y年n月j日'); ?>

 

输出效果:

2020年1月16日

the_time()函数的传入值里除了几个字母有讲究, 其它的内容可以完全自定义,下面是为大家总结的wordpress the_time()函数各参数的表示意义,请注意字母的大小写往往代表不同的含义

  • 参数z:    描述:天数                          示例:365
  • 参数Y:    描述:年份                          示例:2020
  • 参数y:    描述:年份                          示例:20
  • 参数W:    描述:周数                         示例:51
  • 参数w:    描述:星期                          示例:4
  • 参数T:    描述:时区                          示例:CST
  • 参数S:    描述:序列型数字的后缀      示例:st/th
  • 参数r:    描述:完整的日期时间        示例:Thu,16 Jan 2020 20:30:10 +0800
  • 参数O:    描述:时区                       示例:+0800
  • 参数n:    描述:月份                        示例:1
  • 参数M:    描述:月份                      示例:Jan
  • 参数m:    描述:月份                      示例:01
  • 参数l:    描述:星期                        示例:星期四
  • 参数A:    描述:上下午                   示例:AM/PM
  • 参数a:    描述:上下午                   示例:am/pm
  • 参数H:    描述:分钟                     示例:06
  • 参数h:    描述:分钟                     示例:6
  • 参数G:    描述:小时                    示例:06
  • 参数g:    描述:小时                    示例:6
  • 参数F:    描述:月份                    示例:一月
  • 参数D:    描述:星期                   示例:四
  • 参数j:    描述:日期                    示例:6
  • 参数d:    描述:日期                   示例:06

为了大家对以上参数的用法有个比较直观深入的了解,下面提供几个实例供大家参考:

1.怎样用Wordpress输出时间:年 月 日,

如:2020年1月16日:

//怎样用wordpress输出时间:年 月 日 
<?php the_time('Y年n月j日'); ?>

2.怎样用Wordpress输出时分秒时间:,

如:12:00:00:

//怎样用wordpress输出时分秒时间:
<?php the_time('G:i:s');?>

3.怎样用Wordpress输出星期几:

如:2020年1月16日星期四:

//怎样用wordpress输出星期几:
<?php the_time('Y年n月j日l') ;?>

注意

在最后还要强调一个问题,就是当你使用中文版的wordpress时,它会很智能的将你的某些时间参数转换成中文的输出方式,比如月份。有时我们可能并不需要这样智能的转换,而只是希望利用阿拉伯数字进行输出,那么应该怎么去解决这个问题呢?
其实解决问题的办法也不难,只是要求我们将时间函数的参数进行一些修改即可:
比如说我们原来输出月份的代码如下:

//这个输出结果时会自动将月份转换成中文
<?php the_time('M');?>

我们只需要将以上代码替换成下面这样就行了:

//修改后的代码
<?php echo date('M',get_the_time('U'));?>

WordPress时间函数 Data()

上面介绍了wordpress data()函数的使用方法,data函数的参数和the time相同,在此不一一赘述。需要提醒的还是:如果你要在网页中直接输出时间请用the_time(),如果需要调用时间,比如把它传给一个变量,写进数据库等等,就要使用data()了。

一句话:

<?php the_time() ?>等价于<?php echo data() ?>

鲍成龙

wordpress 移除用户角色添加新角色并赋予角色能力/权限,一看这个标题就知道是关于用户的,也就是说用户角色跟那些开放了用户注册登陆的站有关。WordPress 提供的 5 类用户角色与权限,除了管理员好使之外,其它角色很多时候都不好用。这时候我们就需要添加我们自己的用户角色,比如普通用户、VIP 用户等等。并且给它们赋予不同的权限,方便我们实现我们需要的业务逻辑。WordPress 也知道自己的角色与权限不够大家用,于是提供了相应的函数供我们 DIY。

移除角色

WordPress 自带的订阅者对我们几乎没有作用,因此可以考虑移除它,你也可以不移除。

remove_role($data)

参数是角色名字,WordPress 的角色名如下:

订阅者:subscriber

投稿者:contributor

作者:author

编辑:editor

管理员:administrator

比如移除订阅者:

remove_role( 'subscriber' );//移除订阅者

将代码放在主题的 functions.php 中即可。

 

添加角色

//添加普通用户角色
add_role('pt_user', '普通用户', array(
'read' => false, //读权限
'edit_posts' => false,//编辑权限
'delete_posts' => false, //删除权限));

 

这样就可以添加一个名为普通用户的角色,为了与上面 WordPress 自带的角色名形成对比,特意写成下面的形式:

普通用户:pt_user

同样将代码放在主题的 functions.php 中即可。

比如不让普通用户拥有查看部分内容,就不给普通用户赋予读权限,在使用时,只需判断用户是否具有读权限即可,如下

if ( is_user_logged_in()  && current_user_can( 'read' ) ) {
//有权限
}else{
//没有权限}


修改添加角色后,我们在后台可以看到目前拥有的角色,如下:

WordPress移除用户角色添加新角色并赋予角色能力/权限

另外,在移除了订阅者后,新用户注册将默认无身份,我们可以在给用户注册时指定用户角色来赋予新用户默认角色。具体请查看用户注册函数 WordPress 函数 wp_insert_user 注册新用户中的参数介绍。

 

修改角色

$user = new WP_User( $ID );
$user->set_role( 'pt_user' );


直接设置角色,将覆盖已拥有角色,WordPress 允许拥有多个角色!

鲍成龙

本文是“WordPress 路径相关函数总结”系列文章的最后一篇文章,在 讲完站点路径相关函数主题路径相关函数插件路径相关函数后,最后要讲讲的是 WordPress 中还有一组用define定义的常量代表路径。

WP_CONTENT_DIR

wp-content目录的服务器绝对路径,例如

/home/user/public_html/wp-content

 

WP_CONTENT_URL

wp-content目录的URI地址,例如

http://xxx.com/wp-content

WP_PLUGIN_DIR

插件目录的服务器绝对路径,例如

/home/user/public_html/wp-content/plugins

WP_PLUGIN_URL

插件目录的URI地址,例如

http://xxx.com/wp-content/plugins

TEMPLATEPATH

当前启用主题目录的服务器绝对路径,相当于get_template_directory()例如

/home/user/public_html/wp-content/themes/twentyeleven

STYLESHEETPATH

当前启用主题目录的服务器绝对路径,相当于get_stylesheet_directory(),与TEMPLATEPATH的区别在于如果使用child theme,该常量指向child theme目录。

 

鲍成龙

这一篇则是针对WordPress 插件的函数,对于开发WordPress 插件的开发者很有帮助.

 

plugins_url()

获取当前插件的目录的URI,例如一个插件位于/wp-content/plugins/myplugin下,该目录下放有插件的主文件名为myplugin.php,在myplugin.php中执行下面的代码,结果如下

echo plugins_url();
//输出:http://xxx.com/wp-content/plugins
echo plugins_url('',__FILE__);
//输出:http://xxx.com/wp-content/plugins/myplugin
echo plugins_url('js/myscript.js',__FILE__);
//输出:http://xxx.com/wp-content/plugins/myplugin/js/myscript.js

 

plugin_dir_url()

返回当前插件的目录URI,例如

echo plugin_dir_url( __FILE__ );
//输出:http://xxx.com/wp-content/plugins/myplugin/

注意结尾有反斜杠。

plugin_dir_path()

返回当前插件目录的服务器绝对路径,例如

echo plugin_dir_path( __FILE__ );
//输出:/home/user/public_html/wp-content/plugins/myplugin/

可以用来引用文件,例如

<?php
define( 'MYPLUGINNAME_PATH', plugin_dir_path(__FILE__) );
require MYPLUGINNAME_PATH . 'includes/class-metabox.php';
require MYPLUGINNAME_PATH . 'includes/class-widget.php';
?>

plugin_basename()

返回调用该函数的插件文件名称(包含插件路径)

例如在插件myplugin下的myplugin.php文件中调用该函数,结果如下

echo plugin_basename(__FILE__);
//输出:myplugin/myplugin.php

如果在myplugin/include/test.php文件中调用(test.php通过include引用到myplugin.php中),结果如下

echo plugin_basename(__FILE__);
//输出:myplugin/include/test.php