[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]