长春移动端网站设计,WordPress文章角标,周村网站制作价格低,html静态网页素材这篇文章也可以在我的博客中查看
本文内容
在WordPress中存在层级文章的设定#xff0c;常见于#xff1a;Page、Custom Post Type
有时候我们需要让子文章的访问权“继承”于父文章#xff0c;即#xff1a;
当父文章为私有、草稿时#xff0c;子文章也无法被公开访问…这篇文章也可以在我的博客中查看
本文内容
在WordPress中存在层级文章的设定常见于Page、Custom Post Type
有时候我们需要让子文章的访问权“继承”于父文章即
当父文章为私有、草稿时子文章也无法被公开访问当父文章为公开时子文章的访问性应由自己决定
具体做法
做法1
将子文章的状态设置为inherit
一般情况下inherit主要用于attachment等附属于主文章的内容但事实上任何文章都可以设置为inherit
你可以通过以下代码实现
if ($post_id) {$post_data array(ID $post_id,post_status inherit,);wp_update_post($post_data);
}但并不推荐这么做因为
这个状态本身只预留给附属物当文章是这个状态时它不会出现在你的文章列表在多层次结构时不知道会发生什么事情我没试过
做法2
在某个hook中检测当前文章的父文章/祖先文章的状态再检测当前用户的访问权限最后根据结果决定是否驳回。
检测父文章状态
我们可以使用get_post_ancestors()获取文章的各级祖宗返回是个list
$ancestors get_post_ancestors($post-ID);检测当前用户权限
Role Capabilities
是什么权限 是使用current_user_can()检测用户是否有私有读权限吗 并不是如果只检测角色权限(Role Capabilities)那作者本人或者其它有编辑权限的人也可能会被拦截。
那难道我们就不能用current_user_can()了 也不是
虽然这个函数在官方文档中非常隐晦而且看起来它只能按类别处理权限 但其实不是它可以按实体处理权限 换言之它可以实现用户对“某文章”是否有访问权限 Meta Capabilities
这个东西称为元权限Meta Capabilities 它并不实际存储于任何位置而是在使用时实时计算并最终转换为角色权限处理
事实上current_user_can()可以接受role或者meta作为参数 我不知道为什么这么重要的东西在官网找不到 但你可以在这里找到对这个函数更详细的使用介绍 比如我们的目标检测用户对某私有文章是否有访问权限
current_user_can(read_post, $private_post_id)它会检测当前用户是否为作者等有编辑能力的人随后检测是否有私有读权限 一次满足三个愿望爽到 最终做法 我将以继承根文章的访问权限作为例子 如果你需要继承其它层级你需要做一些小改动 首先找一个最快能获取当前文章ID的hook
使用pre_handle_404可以最快地在主查询后访问结果
找到根文章检测当前用户是否有访问根文章的权限
若有完事若没有返回404 关于如何返回404你可以看我的这篇文章
所以我们可以写出这样的代码
add_filter(pre_handle_404, function ($_, $wp_query) {if (empty($wp_query-post))return false;$ancestors get_post_ancestors($wp_query-post-ID);$ancestor_id end($ancestors);// 是子文章且无权访问爷/爹if ($ancestor_id !current_user_can(read_post, $ancestor_id)) {//清空文章$wp_query-posts [];unset($wp_query-post);$wp_query-post_count 0;//设置404$wp_query-set_404();status_header(404);nocache_headers();}return false;
}, 10, 2);参数$wp_query中存储了当前的文章 如果压根没有文章我们提前返回 否则就检测用户对根文章的访问权限
使用get_post_ancestors()获得各级祖先再用end()得到最后一个元素即根文章 若根文章是私有/草稿且用户无访问权限我们就返回404