user.php (6683B)
1 <?php 2 namespace Elementor; 3 4 use Elementor\Core\Common\Modules\Ajax\Module as Ajax; 5 6 if ( ! defined( 'ABSPATH' ) ) { 7 exit; // Exit if accessed directly. 8 } 9 10 /** 11 * Elementor user. 12 * 13 * Elementor user handler class is responsible for checking if the user can edit 14 * with Elementor and displaying different admin notices. 15 * 16 * @since 1.0.0 17 */ 18 class User { 19 20 /** 21 * The admin notices key. 22 */ 23 const ADMIN_NOTICES_KEY = 'elementor_admin_notices'; 24 25 const INTRODUCTION_KEY = 'elementor_introduction'; 26 27 const BETA_TESTER_META_KEY = 'elementor_beta_tester'; 28 29 /** 30 * API URL. 31 * 32 * Holds the URL of the Beta Tester Opt-in API. 33 * 34 * @since 1.0.0 35 * @access private 36 * 37 * @var string API URL. 38 */ 39 const BETA_TESTER_API_URL = 'https://my.elementor.com/api/v1/beta_tester/'; 40 41 /** 42 * Init. 43 * 44 * Initialize Elementor user. 45 * 46 * @since 1.0.0 47 * @access public 48 * @static 49 */ 50 public static function init() { 51 add_action( 'wp_ajax_elementor_set_admin_notice_viewed', [ __CLASS__, 'ajax_set_admin_notice_viewed' ] ); 52 add_action( 'admin_post_elementor_set_admin_notice_viewed', [ __CLASS__, 'ajax_set_admin_notice_viewed' ] ); 53 54 add_action( 'elementor/ajax/register_actions', [ __CLASS__, 'register_ajax_actions' ] ); 55 } 56 57 /** 58 * @since 2.1.0 59 * @access public 60 * @static 61 */ 62 public static function register_ajax_actions( Ajax $ajax ) { 63 $ajax->register_ajax_action( 'introduction_viewed', [ __CLASS__, 'set_introduction_viewed' ] ); 64 $ajax->register_ajax_action( 'beta_tester_signup', [ __CLASS__, 'register_as_beta_tester' ] ); 65 } 66 67 /** 68 * Is current user can edit. 69 * 70 * Whether the current user can edit the post. 71 * 72 * @since 1.0.0 73 * @access public 74 * @static 75 * 76 * @param int $post_id Optional. The post ID. Default is `0`. 77 * 78 * @return bool Whether the current user can edit the post. 79 */ 80 public static function is_current_user_can_edit( $post_id = 0 ) { 81 $post = get_post( $post_id ); 82 83 if ( ! $post ) { 84 return false; 85 } 86 87 if ( 'trash' === get_post_status( $post_id ) ) { 88 return false; 89 } 90 91 if ( ! self::is_current_user_can_edit_post_type( $post->post_type ) ) { 92 return false; 93 } 94 95 $post_type_object = get_post_type_object( $post->post_type ); 96 97 if ( ! isset( $post_type_object->cap->edit_post ) ) { 98 return false; 99 } 100 101 $edit_cap = $post_type_object->cap->edit_post; 102 if ( ! current_user_can( $edit_cap, $post_id ) ) { 103 return false; 104 } 105 106 if ( intval( get_option( 'page_for_posts' ) ) === $post_id ) { 107 return false; 108 } 109 110 return true; 111 } 112 113 /** 114 * Is current user can access elementor. 115 * 116 * Whether the current user role is not excluded by Elementor Settings. 117 * 118 * @since 2.1.7 119 * @access public 120 * @static 121 * 122 * @return bool True if can access, False otherwise. 123 */ 124 public static function is_current_user_in_editing_black_list() { 125 $user = wp_get_current_user(); 126 $exclude_roles = get_option( 'elementor_exclude_user_roles', [] ); 127 128 $compare_roles = array_intersect( $user->roles, $exclude_roles ); 129 if ( ! empty( $compare_roles ) ) { 130 return false; 131 } 132 133 return true; 134 } 135 136 /** 137 * Is current user can edit post type. 138 * 139 * Whether the current user can edit the given post type. 140 * 141 * @since 1.9.0 142 * @access public 143 * @static 144 * 145 * @param string $post_type the post type slug to check. 146 * 147 * @return bool True if can edit, False otherwise. 148 */ 149 public static function is_current_user_can_edit_post_type( $post_type ) { 150 if ( ! self::is_current_user_in_editing_black_list() ) { 151 return false; 152 } 153 154 if ( ! Utils::is_post_type_support( $post_type ) ) { 155 return false; 156 } 157 158 $post_type_object = get_post_type_object( $post_type ); 159 160 if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) { 161 return false; 162 } 163 164 return true; 165 } 166 167 /** 168 * Get user notices. 169 * 170 * Retrieve the list of notices for the current user. 171 * 172 * @since 2.0.0 173 * @access private 174 * @static 175 * 176 * @return array A list of user notices. 177 */ 178 private static function get_user_notices() { 179 return get_user_meta( get_current_user_id(), self::ADMIN_NOTICES_KEY, true ); 180 } 181 182 /** 183 * Is user notice viewed. 184 * 185 * Whether the notice was viewed by the user. 186 * 187 * @since 1.0.0 188 * @access public 189 * @static 190 * 191 * @param int $notice_id The notice ID. 192 * 193 * @return bool Whether the notice was viewed by the user. 194 */ 195 public static function is_user_notice_viewed( $notice_id ) { 196 $notices = self::get_user_notices(); 197 198 if ( empty( $notices ) || empty( $notices[ $notice_id ] ) ) { 199 return false; 200 } 201 202 return true; 203 } 204 205 /** 206 * Set admin notice as viewed. 207 * 208 * Flag the user admin notice as viewed using an authenticated ajax request. 209 * 210 * Fired by `wp_ajax_elementor_set_admin_notice_viewed` action. 211 * 212 * @since 1.0.0 213 * @access public 214 * @static 215 */ 216 public static function ajax_set_admin_notice_viewed() { 217 if ( empty( $_REQUEST['notice_id'] ) ) { 218 wp_die(); 219 } 220 221 $notices = self::get_user_notices(); 222 if ( empty( $notices ) ) { 223 $notices = []; 224 } 225 226 $notices[ $_REQUEST['notice_id'] ] = 'true'; 227 update_user_meta( get_current_user_id(), self::ADMIN_NOTICES_KEY, $notices ); 228 229 if ( ! wp_doing_ajax() ) { 230 wp_safe_redirect( admin_url() ); 231 die; 232 } 233 234 wp_die(); 235 } 236 237 /** 238 * @since 2.1.0 239 * @access public 240 * @static 241 */ 242 public static function set_introduction_viewed( array $data ) { 243 $user_introduction_meta = self::get_introduction_meta(); 244 245 $user_introduction_meta[ $data['introductionKey'] ] = true; 246 247 update_user_meta( get_current_user_id(), self::INTRODUCTION_KEY, $user_introduction_meta ); 248 } 249 250 public static function register_as_beta_tester( array $data ) { 251 update_user_meta( get_current_user_id(), self::BETA_TESTER_META_KEY, true ); 252 $response = wp_safe_remote_post( 253 self::BETA_TESTER_API_URL, 254 [ 255 'timeout' => 25, 256 'body' => [ 257 'api_version' => ELEMENTOR_VERSION, 258 'site_lang' => get_bloginfo( 'language' ), 259 'beta_tester_email' => $data['betaTesterEmail'], 260 ], 261 ] 262 ); 263 264 $response_code = (int) wp_remote_retrieve_response_code( $response ); 265 266 if ( 200 === $response_code ) { 267 self::set_introduction_viewed( [ 268 'introductionKey' => Beta_Testers::BETA_TESTER_SIGNUP, 269 ] ); 270 } 271 } 272 273 /** 274 * @param string $key 275 * 276 * @return array|mixed|string 277 * @since 2.1.0 278 * @access public 279 * @static 280 */ 281 public static function get_introduction_meta( $key = '' ) { 282 $user_introduction_meta = get_user_meta( get_current_user_id(), self::INTRODUCTION_KEY, true ); 283 284 if ( ! $user_introduction_meta ) { 285 $user_introduction_meta = []; 286 } 287 288 if ( $key ) { 289 return empty( $user_introduction_meta[ $key ] ) ? '' : $user_introduction_meta[ $key ]; 290 } 291 292 return $user_introduction_meta; 293 } 294 }