wordpress自己添加后台设置


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

  • 该菜单选项页面标题,这里是CC Comments Settings
  • 菜单标题,CC Comments
  • 查看选项页面的用户必须具备的权限,这里用manage_options,意为只有管理员可以查看
  • 给菜单一个slug,或者说id,这样才能和其他菜单区分开,这里是cc-comments-plugin
  • 最后,需要告诉他用哪个函数产生选项页面的HTML结构,也就是步骤2中定义的cccomm_option_page
当然,这样做我们还是不能加wordpress后台的,我们还需要将函数钩到hook中。

[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" &amp;&amp; ($old=="auto-draft" || $old=="draft") &amp;&amp; $post-&gt;post_title!="")//这里是判断文章是否是没发布过的文章,并且不是日记(日记我们一般不写标题)
{
    $to=explode(",",esc_attr(get_option('email_list')));//把邮件分割为列表
    $subject = '你关注的博主有新文章发布啦!φ(&gt;ω&lt;*) ';//邮件主题
    $permalink = get_permalink($post-&gt;ID);//获取文章链接
    $message='
                &lt;style&gt;.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]

 


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录