[success]这个文章是我为了实现订阅推送功能做的笔记,所以并不是专门只讲这个知识点,这里我只是顺带讲一下。[/success]
add_acction函数
我们需要实现的是我发布文章后依次发送邮件给订阅的人。所以第一步就是在发布文章后执行某个函数,刚好我们可以利用wordpress的钩子函数,这里我找到了一些相关资料,然后直接使用了下面这个函数[highlight lanaguage=”PHP”]
//发布文章时发送电子邮件
function send_email($new_status,$old_status,$post)
{
//获取到参数然后执行
}
add_action('transition_post_status','send_email',1,3);
[/highlight]
这个函数会返回3个参数,第一个和第二个分别是新的和旧的发布状态,这里如果是publish就说明是发布或者更新了文章,第三个返回的是文章对象,我们可以参考官方给出说明来获取我们需要的内容(这里好像无法获取到文章内容。。。我也不知道怎么回事)。
发送邮件
第一步成功实现了,我们下面就是发送邮件来通知订阅者,因为我们的服务器不是邮件服务器,所以不能直接发送邮件,我们需要使用邮件服务器来发送邮件。这里说一下,原主题的邮件发送好像是没有用的,我们需要自己下一个叫 wp mail bank的插件才可以发送邮件。我们这里使用的是wordpress的wp_mail函数这个函数的最简单的用法
[highlight lanaguage=”PHP”]
$to ='发送者邮箱'; $subject = '邮件标题'; $message = '邮件内容'; wp_mail($to,$subject,$message);
[/highlight]
我就直接使用这个最简单的用法了。
后台设置界面
下面我们就需要到后台进行设置了,这里我参考了这篇文章。(下面的函数直接用的该文章的,我的函数就没有贴了,很多地方我讲的没他好,所以直接复制了一些内容)首先我们需要创建输出后台管理界面的函数
[highlight lanaguage=”PHP”]
function cccomm_option_page() {
?>
<div class="wrap">
<?php screen_icon(); ?>
<h2>CC Comments Options </h2>
<p>Welcome to CC Comments plugin, here you can edit the email(s) to CC your comments to. </p>
</div>
<?php
}
[/highlight]
这里显示的html界面,所以需要我们自己设计好html界面才可以在wordpress后台显示。
然后我们还需要把我们的菜单放到顶级菜单下
[highlight lanaguage=”PHP”]
function cccomm_plugin_menu() {
add_options_page(‘CC Comments Settings’, ‘CC Comments’, ‘manage_options’, ‘cc-comments-plugin’,’cccomm_option_page’ );
}
[/highlight]
当然,这样做我们还是不能加wordpress后台的,我们还需要将函数钩到hook中。
- 该菜单选项页面标题,这里是CC Comments Settings
- 菜单标题,CC Comments
- 查看选项页面的用户必须具备的权限,这里用manage_options,意为只有管理员可以查看
- 给菜单一个slug,或者说id,这样才能和其他菜单区分开,这里是cc-comments-plugin
- 最后,需要告诉他用哪个函数产生选项页面的HTML结构,也就是步骤2中定义的cccomm_option_page
[highlight lanaguage=”PHP”]
add_action( ‘admin_menu’, ‘cccomm_plugin_menu’ );
[/highlight]
然后就可以显示了。
当然光显示界面还是不行的,我们需要保存我们的数据到数据库中,这里我就直接讲怎么用wordpress提供的api函数来存取数据。
我们先写一个初始化函数
[highlight lanaguage=”PHP”]
function cccomm_init() {
register_setting('cccomm_options', 'cccomm_cc_email');
}
[/highlight]
register_settings至少需要两个参数,首先我们告诉它这个字段属于哪个group,分组的意思是可能有多个字段需要存储,nonce等信息将以组为单位产生。这里的group名称是cccomm_options;
接着我们告诉函数要注册的字段名称,也就是cccomm_cc_email。
接下来,为了让这个函数执行,必须将它加到hook中,这里选择init。
[highlight lanaguage=”PHP”]
add_action('admin_init', 'cccomm_init');
[/highlight]
然后我们需要修改一下我们之前的from表单。
[highlight lanaguage=”PHP”]
<form action="options.php" method="post" id="cc-comments-email-options-form">
<?php settings_fields('cccomm_options'); ?>
<h3><label for="cc_email"></label>Email to send CC to:
<input type="text" name="cccomm_cc_email" id="cccomm_cc_email"
value="<?php echo esc_attr(get_option('cccomm_cc_email')) ?>" size="40" /></h3>
<p><input type="submit" name="submit" value="Save Email" /></p>
</form>
[/highlight]
- 表单提交地址不再是当前页面,而是options.php(action="options.php"),因为我们要使用Settings API
- settings_fields('cccomm_options')用来产生nonce等隐藏域,cccomm_options正是我们注册的group name
- input field中的name和id都要与注册的字段名称相同,这里都改为cccomm_cc_emai
[highlight lanaguage=”PHP”]
if( !empty($_POST) && check_admin_referer('cccomm_admin_options-update') ) {
update_option('cccomm_cc_email', $_POST['cc_email']);
?>
<div id="message" class="updated">
<p><strong>Email was saved for CC Comments</strong></p>
</div>
<?php
}
[/highlight]
在检测是否有数据提交时,使用了check_admin_referer()函数,参数就是wp_nonce_field()函数中定义的key这里就可以执行一些操作了,比如这里是显示一条信息。
当然,我这里没有使用wordpress自带的API而是自己写一个,因为word匹配自带的api无法附加数据。
下面是我自己写的那个函数,我这里是和看板娘的数据整合到了一起。
[highlight lanaguage=”PHP”]
//看板娘的设置界面
function live2d_option_page() {
//判断是否有数据提交
if(!empty($_POST)) {
//live2d的设置
if(!empty($_POST['live2d-setting'])) {
if (savejs($_POST['live2d-setting'])) {
?>
<div id="message" class="updated">
<p><strong>数据已保存(清除缓存后设置才能生效)</strong></p>
</div>
<?php
} else {
?>
<div id="message" class="updated">
<p><strong>保存数据失败</strong></p>
</div>
<?php
}
}
//邮件订阅设置
if(!empty($_POST['email_list'])) {
if(emaillist_add($_POST['email_list'])==1) {
?>
<div id="message" class="updated">
<p><strong>添加记录成功</strong></p>
</div>
<?php
}
else
{
?>
<div id="message" class="updated">
<p><strong>该记录已存在</strong></p>
</div>
<?php
}
}
//删除订阅用户
if(!empty($_POST['delete']))
{
if(emaillist_remove($_POST['delete'])==0)
{
?>
<div id="message" class="updated">
<p><strong>没有找到该订阅者</strong></p>
</div>
<?php
}
else
{
?>
<div id="message" class="updated">
<p><strong>已从列表中移除该订阅者</strong></p>
</div>
<?php
}
}
}
?>
<style>
.title{margin-bottom: 5px}
.savejs{margin: 0px;}
</style>
<h1>主题其他设置</h1><br>
<div>
<form action="" method="post" id="live2d-options-form">
<div><div class="title"><h4>看板娘设置</h4> 直接读取的js文件,同时也会保存为js文件,不要修改除设置以外的其他地方!</div>
<textarea rows="6" cols="150" name="live2d-setting"><?php echo getjs() ?></textarea>
</div>
<input class="savejs" type="submit" name="savejs" value="保存js文件" />
</form>
</div>
<div>
<form action="" method="post" id="email-options-form">
<?php wp_nonce_field('kratos_admin_options-update'); ?>
<div><div class="title"><h4>邮件订阅设置</h4></div>这里显示了所有订阅者名单,每行一个,添加时不会判断邮箱的正确性,请自行检查</div>
<textarea rows="6" cols="150" name="email_lists"><?php $arr=explode(",",esc_attr(get_option('email_list')));$i=1;foreach ($arr as $item ){if($item){echo $i.':'.$item."
";}$i++;}?></textarea>
</div>
<p>
添加订阅用户:<input type="text" id="email_list" name="email_list"/>
<input class="savejs" type="submit" name="submit" value="添加到订阅列表" /><br>
</p>
<p>
删除订阅用户:<input type="text" id="delete" name="delete"/>
<input class="savejs" type="submit" name="submit" value="从订阅列表中移除" />
</p>
</form>
</div>
<?php
}
//注册数据库
function email_init() {
register_setting('kratos_options', 'email_list');
}
add_action('admin_init', 'email_init');
[/highlight]
这里主要就是要先注册数据库,然后我们提交时会调用自身,我们可以使用post来获取我们提交的数据,然后调用函数就可以添加和删除数据了。
我这里邮箱都是用分割符来区分的,都存在一个字段里面。
下面就是在用户资料界面显示订阅的复选框了。这里我们使用了add_action函数。很多东西都写在注释里了,自己看注释把。
[highlight lanaguage=”PHP”]
//给注册用户开放邮件订阅服务(这里就是显示用户订阅的界面)
function open_email($user) {
$content=esc_attr(get_option('email_list'));
//判断用户是否已经订阅(不同状态显示不标签)
if(strpos($content,$user->user_email)===false)
{
?>
<h3>开启邮件订阅</h3>
<input type="checkbox" name="openemail[]" />开启后当站长发布新文章后会通知你哦!
<?php
}
else
{
?>
<h3>开启邮件订阅</h3>
<input type="checkbox" name="openemail[]" checked="checked" />开启后当站长发布新文章后会通知你哦!
<?php
}
}
//给自己的列表添加用户(这里就是对数据库的操作)
function emaillist_add($email)
{
$content=esc_attr(get_option('email_list'));//获取数据库的数据
if(strpos($content,$email)===false)//这里就是判断邮箱是否存在,用三个等于号来判断逻辑值
{
if(!$content)
$content=$email;
else
$content=$content.','.$email;
update_option('email_list',$content);
return 1;
}
else
{
return 0;
}
}
//给自己的列表删除用户
function emaillist_remove($email)
{
$content=esc_attr(get_option('email_list'));
if(strpos($content,$email)===false)
{
return 0;
}
else
{
$pos = strpos($content, $email);
if ($content[$pos - 1] == ',') {
$content = str_replace(',' . $email, '', $content);
} else {
if ($content[$pos + strlen($email)] == ',')
$content = str_replace($email . ',', '', $content);
else
$content = str_replace($email, '', $content);
}
update_option('email_list', $content);
return 1;
}
}
//更新后进行的操作(这个函数提供一个参数就是用户的id)
function update_email_setting($id)
{
//判断是否有数据提交(这里我们可以通过post来获取我们的数据)
if(!empty($_POST)) {
//获取用户邮箱
$user=get_userdata($id);//通过id获取用户对象
if($_POST['openemail'])//这里是当选框勾选后就会添加数据,没有就删除数据
emaillist_add($user->user_email);
else
emaillist_remove($user->user_email);
}
}
add_action('show_user_profile','open_email');//这里就是在显示用户数据的时候调用的函数
add_action('personal_options_update','update_email_setting');//这里就是用户点击更新后执行的函数
[/highlight]
如何判断站长是否是发布新文章并发送html界面的邮件
[highlight lanaguage="PHP"]//发布文章时发送电子邮件
function send_email($new,$old,$post)
{
if($new=="publish" && ($old=="auto-draft" || $old=="draft") && $post->post_title!="")//这里是判断文章是否是没发布过的文章,并且不是日记(日记我们一般不写标题)
{
$to=explode(",",esc_attr(get_option('email_list')));//把邮件分割为列表
$subject = '你关注的博主有新文章发布啦!φ(>ω<*) ';//邮件主题
$permalink = get_permalink($post->ID);//获取文章链接
$message='
<style>.qmbox img.wp-smiley{width:auto!important;height:auto!important;max-height:8em!important;margin-top:-4px;display:inline}
</style>
<div style=”background:#ececec;width:100%;padding:50px 0;text-align:center”>
<div style=”background:#fff;width:750px;text-align:left;position:relative;margin:0 auto;font-size:14px;line-height:1.5”>
<div style=”zoom:1;padding:25px 40px;background:#518bcb; border-bottom:1px solid #467ec3;”>
<h1 style=”color:#fff;font-size:25px;line-height:30px;margin:0”><a href=”‘.home_url().’” style=”text-decoration:none;color:#FFF”>’.get_bloginfo(‘name’).’</a></h1>
<img style=”position: relative;left: 423px;top:25px;” src=”https://img.xiaoyou66.com/images/2019/05/17/lvDc.png“>
<h3 style=”position: relative;color:#FFF;left: 263px;bottom: -25px;”>(〃’▽’〃)你关注的博主有文章更新啦( • ̀ω•́ )✧</h3>
</div>
<div style=”padding:35px 40px 30px”>
<h2 style=”font-size:18px;margin:5px 0”>文章标题:’.$post->post_title.’</h2>
<hr>
<h3 style=”font-size:18px;margin:5px 0”>摘要:</h3>
<p style=”color:#313131;line-height:20px;font-size:15px;margin:20px 0”>’.showSummary($post->post_content).’</p>
<h4><a href=”‘.$permalink.’”>点击查看原文</a></h4>
<br />
<div style=”font-size:13px;color:#a0a0a0;padding-top:10px”>该邮件由系统自动发出,如果不是您本人操作,请忽略此邮件。</div>
<div class=”qmSysSign” style=”padding-top:20px;font-size:12px;color:#a0a0a0”>
<p style=”color:#a0a0a0;line-height:18px;font-size:12px;margin:5px 0”>’.get_bloginfo(‘name’).’</p>
<p style=”color:#a0a0a0;line-height:18px;font-size:12px;margin:5px 0”><span style=”border-bottom:1px dashed #ccc” t=”5” times=””>’.date(“Y-m-d”,time()).’</span></p>
</div>
</div>
</div>
</div>
‘;//上面这个发送的HTML内容,这里可以修改成自己喜欢的样子
$headers = ‘Content-type: text/html’;//这里是说明发送的是html格式
wp_mail($to,$subject,$message,$headers);//这里就是邮件的发送函数
}
}
add_action(‘transition_post_status’,’send_email’,1,3);//这个函数就是当用户的文章状态发生变化时就调用发送邮件的函数
[/highlight]
[successbox title=”结尾”]差不多就这些了,虽然简单,当时各种问题调试了我半天,还看了一大堆资料,很多东西都是在代码里说明了,还请大家多多看代码,我这里写字很难解释清楚,如果感兴趣到时候主题更新后就可以看到全部的代码了,大家可以去看源代码,这里我只是给大家提供一个思路,说一下这些功能具体是怎么实现的,详细的地方还请大家多去查查资料把。[/successbox]