将特定个人主页限制为特定用户

时间:2020-04-20 作者:Vins

每个用户在注册期间都选择了一个名为profile\\u url的用户元。在用户创建之后,将创建一个带有该slug的页面并将其设置为私有(该页面的作者是管理员)。前端仪表板中的用户可以将此页面设置为公共或私有。当页面是私有的时,所有者用户无法看到它。

我想让所有者用户可以看到私有页面。

想到的唯一方法是添加功能,例如:

$ user = new WP_User ($ user_id);
$ user-> add_cap (\'read_private_pages\');
但是我想指定页面id,我不知道这是否可行。

非常感谢。

2 个回复
最合适的回答,由SO网友:Antti Koskinen 整理而成

我猜你在用wp_insert_post() 为用户创建专用页。函数返回所创建页面的ID。您可以将此ID用作授予用户的自定义功能的一部分。

// create the new $user

// create private page
$private_page_id = wp_insert_post( $postarr, $wp_error = false ); // returns id on success, 0 on failure
if ( $private_page_id ) {
  // grant custom cap
  $user->add_cap("can_access_{$private_page_id}", true);
}
当用户尝试访问专用页时,请使用user_has_cap 筛选以检查用户是否具有所需的自定义cap并动态授予私有页面读取能力。

add_filter(\'user_has_cap\', \'user_can_access\', 10, 4);
function user_can_access($allcaps, $caps, $args, $user) {
  $object = get_queried_object();
  // make sure we\'re on a post
  if ( ! is_a($object, \'WP_Post\') ) {
    return $allcaps;
  }
  // it should be a private page post 
  if ( \'page\' !== $object->post_type || \'private\' !== $object->post_status ) {
    return $allcaps;
  }
  // does the user have the required access cap?
  $can_access = \'can_access_\' . $object->ID;
  if ( isset( $allcaps[$can_access] ) && true === $allcaps[$can_access] ) {
    // if so, allow user to access the private content
    $allcaps[\'read_private_pages\'] = true;
  }
  return $allcaps;
}

SO网友:joshmoto

New answer

好的,另一种方法是使用WP\\u查询。

您可以创建一个名为Profile 并创建一个名为page-profile.php

然后使用下面的代码获取当前用户页面数据(假设您只是保存帖子名称,而不是元中的完整用户url)

// if user is not logged in then return or redirect to login page
if(!is_user_logged_in()) wp_safe_redirect(wp_login_url());

// get the user id
$user_id = get_current_user_id();

// get the current user profile url
$profile_url = get_user_meta($user_id, \'profile_url\');

// page query args
$args = [
    \'post_status\' => [\'publish\',\'private\'],
    \'pagename\' => $profile_url
];

// create the query
$page = new WP_Query( $args );

get_header();

?>

<?php if ( $page->have_posts() ): ?>

    <?php while($page->have_posts()): $page->the_post() ?>

        <?php the_title()?>

    <?php endwhile; ?>

<?php endif; ?>

<?php

get_footer();

这意味着用户将始终访问urlhttp://yoursite.com/profile 查看他们的页面。

使用者pagename 如果页面未使用name 如果在WP查询中自定义帖子类型。

相关推荐

Published pages missing

wordpress中缺少所有已发布的页面。他们仍然在我的网站(chrisjscambler.com)上在线,例如,我的家、研究和教学都在网上活跃;但它们无法在wordpress中编辑。直到最近,他们都在那里!有什么建议吗?