WordPress添加自定义文章栏目

WordPress允许自定义添加文章自定义栏目,如下图,可以在文章编辑的时候,添加一个栏目随着文章发布和更新一起提交。

1.注册函数

首先添加动作,第一个参数为指定WordPress动作类型,第二个参数为指定函数

add_action('add_meta_boxes', 'fun_plug_add_meta_box');

指定函数

function fun_plug_add_meta_box() { 
add_meta_box('down_link', '下载地址', 'meta_box_down_link_form', 'post', 'advanced', 'high');
 }

add_meta_box函数功能如下

$id HTML 代码中设置区域中id属性的值,也是WordPress文章自定义栏目的一个唯一标识符

$title 区域中的标题名称,支持HTML代码
$callback 添加的设置区域的显示函数,界面在这个函数里面实现
$post_type 在 post 还是 page 的编辑页面中显示
$context 设置区域的显示位置,主编辑区(advanced)、边栏(side)
$priority 设置区域显示的优先级,high(高),low(低),default(默认)
$callback_args 回调函数接受的附加参数,一般省略

回调函数如下:

function meta_box_down_link_form($post)
{
    // 创建临时隐藏表单,为了安全
    wp_nonce_field('meta_box_down_link_form', 'meta_box_down_link_form_nonce');
    // 获取之前存储的值
    $value = get_post_meta($post->ID, 'down_link', true);
    ?>
     <input type="text" value="<?php echo $value?>">
    <?php
}

至此,后台文章已经正常显示内容了。

相关解释

【1】wp_nonce_field函数,本函数为WordPress防止攻击的一个函数,原理是生成一个随意的字符,在保存函数中,验证这个字符是否和提交的字符一致,如果不一致,就说明可能这个内容来自第三方伪造内容提交,而不是在文章页面直接提交。

当然,如果不写这个函数,也是可以的,在保存的函数中,也不用验证就是了。

函数第一个参数为唯一标识符,第二个为表单名称,在后面保存文章字段的时候,可以通过$_POST['名称']来获取这个值。

【2】get_post_meta函数,WordPress中,通过get_post_meta获取保存的文章额外字段,通过update_post_meta保存额外字段。

2.保存文章数据

上面注册函数后,也能提交内容了,但是还没有保存内容,所以无法显示东西。需要接管WordPress文章保存函数。

注册保存文章动作,第二个参数为自定义函数,WordPress会传入一个文章ID参数

add_action('save_post', 'fun_save_post_down_link');

自定义函数,本函数处理文章额外字段的保存

function fun_save_post_down_link($post_id)
{
    // 安全检查
    // 检查是否发送了一次性隐藏表单内容
    if (!isset($_POST['meta_box_down_link_form_nonce'])) {
        return;
    }
    // 判断隐藏表单的值与之前是否相同
    if (!wp_verify_nonce($_POST['meta_box_down_link_form_nonce'], 'meta_box_down_link_form')) {
        return;
    }
    // 判断该用户是否有权限
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    // 判断 Meta Box 是否为空
    if (!isset($_POST['down_link1'])) {
        return;
    }
    update_post_meta($post_id, 'down_link', $_POST['down_link1']);
}

其中,安全检查中,需要上面的wp_nonce_field支持,如果没有创建这个随机值,就不需要判断。

首先判断是否有这个值,如果没有,说明提交可能是伪造的。接着判断值是否一致,通过函数wp_verify_nonce来判断,第一个为要对比的值,通过$_POST获取提交过来的值,第二参数为唯一标识符,和wp_nonce_field函数的第一个参数一致。

接着判断用户是否有权限保存文章,current_user_can函数来判断。

最后判断是否有提交自定义的值,不为空的话,就使用函数update_post_meta来保存这个数据。

 

THE END