| 1 |
<?php |
| 2 |
/** |
| 3 |
* @package Restrict User Access |
| 4 |
* @author Joachim Jensen <joachim@dev.institute> |
| 5 |
* @license GPLv3 |
| 6 |
* @copyright 2024 by Joachim Jensen |
| 7 |
*/ |
| 8 |
|
| 9 |
/** |
| 10 |
* @since 1.1 |
| 11 |
* @param WP_User|int|null $user null or omit for current user |
| 12 |
* @return RUA_User_Interface |
| 13 |
*/ |
| 14 |
function rua_get_user($user = null) |
| 15 |
{ |
| 16 |
if (is_null($user) && is_user_logged_in()) { |
| 17 |
$user = wp_get_current_user(); |
| 18 |
} |
| 19 |
|
| 20 |
if (!($user instanceof WP_User)) { |
| 21 |
$user = new WP_User($user); |
| 22 |
} |
| 23 |
|
| 24 |
return new RUA_User($user); |
| 25 |
} |
| 26 |
|
| 27 |
/** |
| 28 |
* @since 2.1 |
| 29 |
* @param WP_Post|int $post |
| 30 |
* @return RUA_Level_Interface |
| 31 |
* @throws Exception |
| 32 |
*/ |
| 33 |
function rua_get_level($post) |
| 34 |
{ |
| 35 |
if (is_numeric($post)) { |
| 36 |
$post = WP_Post::get_instance($post); |
| 37 |
} |
| 38 |
|
| 39 |
if (!($post instanceof WP_Post)) { |
| 40 |
throw new Exception(); |
| 41 |
} |
| 42 |
|
| 43 |
return new RUA_Level($post); |
| 44 |
} |
| 45 |
|
| 46 |
/** |
| 47 |
* @since 2.1 |
| 48 |
* @param RUA_Level_Interface|WP_Post|int $level |
| 49 |
* @param RUA_User_Interface|WP_User|int|null $user null or omit for current user |
| 50 |
* @return RUA_User_Level_Interface |
| 51 |
* @throws Exception |
| 52 |
*/ |
| 53 |
function rua_get_user_level($level, $user = null) |
| 54 |
{ |
| 55 |
_deprecated_function(__FUNCTION__, '2.5', 'rua_get_user_levels()'); |
| 56 |
|
| 57 |
if (!($level instanceof RUA_Level_Interface)) { |
| 58 |
$level = rua_get_level($level); |
| 59 |
} |
| 60 |
if (!($user instanceof RUA_User_Interface)) { |
| 61 |
$user = rua_get_user($user); |
| 62 |
} |
| 63 |
return $user->level_memberships()->get($level->get_id()); |
| 64 |
} |
| 65 |
|
| 66 |
/** |
| 67 |
* @param RUA_User_Interface|WP_User|int|null $user null or omit for current user |
| 68 |
* @return RUA_Collection |
| 69 |
*/ |
| 70 |
function rua_get_user_levels($user) |
| 71 |
{ |
| 72 |
if (!($user instanceof RUA_User_Interface)) { |
| 73 |
$user = rua_get_user($user); |
| 74 |
} |
| 75 |
|
| 76 |
$user_levels = new RUA_Collection(); |
| 77 |
if($user->get_id() === 0) { |
| 78 |
return $user_levels; |
| 79 |
} |
| 80 |
|
| 81 |
$entities = _rua_get_comments([ |
| 82 |
'user_id' => $user->get_id() |
| 83 |
]); |
| 84 |
|
| 85 |
foreach ($entities as $entity) { |
| 86 |
$user_level = new RUA_User_Level($entity); |
| 87 |
$user_level->refresh(); |
| 88 |
$user_levels->put($user_level->get_level_id(), $user_level); |
| 89 |
} |
| 90 |
return $user_levels; |
| 91 |
} |
| 92 |
|
| 93 |
/** |
| 94 |
* @param RUA_Level_Interface|WP_Post|int $level |
| 95 |
* @param array $query |
| 96 |
* @return RUA_Collection |
| 97 |
* @throws Exception |
| 98 |
*/ |
| 99 |
function rua_get_level_members($level, $query = []) |
| 100 |
{ |
| 101 |
if (!($level instanceof RUA_Level_Interface)) { |
| 102 |
$level = rua_get_level($level); |
| 103 |
} |
| 104 |
|
| 105 |
$query['post_id'] = $level->get_id(); |
| 106 |
$entities = _rua_get_comments($query); |
| 107 |
|
| 108 |
$user_levels = new RUA_Collection(); |
| 109 |
foreach ($entities as $entity) { |
| 110 |
$user_level = new RUA_User_Level($entity); |
| 111 |
$user_level->refresh(); |
| 112 |
$user_levels->put($user_level->get_user_id(), $user_level); |
| 113 |
} |
| 114 |
return $user_levels; |
| 115 |
} |
| 116 |
|
| 117 |
/** |
| 118 |
* @since 0.9 |
| 119 |
* @param string $name |
| 120 |
* @return WP_Post|bool |
| 121 |
*/ |
| 122 |
function rua_get_level_by_name($name) |
| 123 |
{ |
| 124 |
return RUA_App::instance()->level_manager->get_level_by_name($name); |
| 125 |
} |
| 126 |
|
| 127 |
/** |
| 128 |
* @since 0.13 |
| 129 |
* @param int $level_id |
| 130 |
* @param bool $hierarchical |
| 131 |
* @return array |
| 132 |
*/ |
| 133 |
function rua_get_level_caps($level_id, $hierarchical = false) |
| 134 |
{ |
| 135 |
$levels = [$level_id]; |
| 136 |
if ($hierarchical) { |
| 137 |
$levels = array_merge($levels, get_post_ancestors((int) $level_id)); |
| 138 |
$levels = array_reverse($levels); |
| 139 |
} |
| 140 |
$caps = RUA_App::instance()->level_manager->get_levels_caps($levels); |
| 141 |
return $caps; |
| 142 |
} |
| 143 |
|
| 144 |
/** |
| 145 |
* @internal |
| 146 |
* @param $args |
| 147 |
* @return int|int[]|WP_Comment[] |
| 148 |
*/ |
| 149 |
function _rua_get_comments($args) |
| 150 |
{ |
| 151 |
$args = array_merge([ |
| 152 |
'status' => [RUA_User_Level::STATUS_ACTIVE, RUA_User_Level::STATUS_EXPIRED], |
| 153 |
'orderby' => false, |
| 154 |
//ensures polylang and other plugins dont add filters |
| 155 |
'post__in' => array_keys(RUA_App::instance()->get_levels()) |
| 156 |
], $args); |
| 157 |
$args['type'] = RUA_User_Level::ENTITY_TYPE; |
| 158 |
|
| 159 |
add_filter('wpml_is_comment_query_filtered', '__return_false', PHP_INT_MAX); |
| 160 |
$comments = get_comments($args); |
| 161 |
remove_filter('wpml_is_comment_query_filtered', '__return_false', PHP_INT_MAX); |
| 162 |
return $comments; |
| 163 |
} |
| 164 |
|