向任何以其 slug 结尾的 URL 提供页面

Serving a page to any URL that ends in its slug

还是 WordPress 的新手,所以请放轻松。

目标:

防止特定角色的用户查看由相同角色的用户创建的其他自定义 post 类型。

预期解决方案:

修改 URL 并在用户 ID 与 post 作者不匹配时重定向到自定义 403 页面。因此,如果试图查看 example.com/%taxonomy%/%private-post-slug% 的人将被重定向到 example.com/%分类学%/403

当前重定向代码:

​<?php

add_action( 'template_redirect', 'private_posts_redirect');

function private_posts_redirect() {
    $user = wp_get_current_user();
    $post = get_post();
    $author = $post->post_author;
    if( get_post_type() == 'custom-post-type'){
        if(!$user->ID == $author || !$user->ID == 1){
           $intendedtarget = $_SERVER['REQUEST_URI'];
           $intendedtargetpath = parse_url( $intendedtarget, PHP_URL_PATH );
           $intendedtargetslug = pathinfo( $intendedtargetpath, PATHINFO_BASENAME );
           $redirectslug = '403';
           $redirecturl = str_replace( $intendedtargetslug, $redirectslug, $intendedtarget);
           wp_redirect($redirect_url);
           exit;
        }
    }
}

当前问题:

我创建了一个以“403”作为 slug 的 403 页面,我只是不确定如何在以该 slug 结尾的任何页面上提供该模板页面的内容。

暂定方案:

add_action('init' '403_page')

function 403_page(){
    if(stristr($_SERVER['REQUEST_URI'],'403')){
        DO_SOMETHING
    }
}

我知道这只针对 post 作者,我已经为不属于我要隔离 post 的角色的用户提供了重定向。此外,我使用 Advanced Post Queries 插件只为作者提供他们的 posts,但这并不能阻止他们通过在 [=] 中输入随机数来查看其他 posts 54=] 并查看该用户独有的敏感 RFQ、报价和定价信息。

不确定这是否是唯一的问题,但这一行:

 if(!$user->ID == $author || !$user->ID == 1){

应该是:

 if($user->ID !== $author || $user->ID !== 1){

为了防止用户查看任何 he/she 不是作者的 post 文章,您应该首先获取 post 作者 ID,您可以获取作者 ID post 通过将以下几行添加到当前主题的 single.php 文件中:

global $post,$current_user;
$author_id = $post->post_author;

if($current_user->ID != $author_id && !current_user_can('administrator')){
// Do whatever you want to do here
exit;
}

注意: 前面的代码检查用户是否不是管理员,也不是当前 post 的作者,您可以使用 wp_safe_redirect() 或 PHP header() 函数将他们重定向到其他任何地方.

谢谢!