{ $data['avatar_urls'] = rest_get_avatar_urls( $user ); } if ( in_array( 'meta', $fields, true ) ) { $data['meta'] = $this->meta->get_value( $user->ID, $request ); } $context = ! empty( $request['context'] ) ? $request['context'] : 'embed'; $data = $this->add_additional_fields_to_object( $data, $request ); $data = $this->filter_response_by_context( $data, $context ); // Wrap the data in a response object. $response = rest_ensure_response( $data ); if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) { $response->add_links( $this->prepare_links( $user ) ); } /** * Filters user data returned from the REST API. * * @since 4.7.0 * * @param WP_REST_Response $response The response object. * @param WP_User $user User object used to create response. * @param WP_REST_Request $request Request object. */ return apply_filters( 'rest_prepare_user', $response, $user, $request ); } /** * Prepares links for the user request. * * @since 4.7.0 * * @param WP_User $user User object. * @return array Links for the given user. */ protected function prepare_links( $user ) { $links = array( 'self' => array( 'href' => rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $user->ID ) ), ), 'collection' => array( 'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ), ), ); return $links; } /** * Prepares a single user for creation or update. * * @since 4.7.0 * * @param WP_REST_Request $request Request object. * @return object User object. */ protected function prepare_item_for_database( $request ) { $prepared_user = new stdClass(); $schema = $this->get_item_schema(); // Required arguments. if ( isset( $request['email'] ) && ! empty( $schema['properties']['email'] ) ) { $prepared_user->user_email = $request['email']; } if ( isset( $request['username'] ) && ! empty( $schema['properties']['username'] ) ) { $prepared_user->user_login = $request['username']; } if ( isset( $request['password'] ) && ! empty( $schema['properties']['password'] ) ) { $prepared_user->user_pass = $request['password']; } // Optional arguments. if ( isset( $request['id'] ) ) { $prepared_user->ID = absint( $request['id'] ); } if ( isset( $request['name'] ) && ! empty( $schema['properties']['name'] ) ) { $prepared_user->display_name = $request['name']; } if ( isset( $request['first_name'] ) && ! empty( $schema['properties']['first_name'] ) ) { $prepared_user->first_name = $request['first_name']; } if ( isset( $request['last_name'] ) && ! empty( $schema['properties']['last_name'] ) ) { $prepared_user->last_name = $request['last_name']; } if ( isset( $request['nickname'] ) && ! empty( $schema['properties']['nickname'] ) ) { $prepared_user->nickname = $request['nickname']; } if ( isset( $request['slug'] ) && ! empty( $schema['properties']['slug'] ) ) { $prepared_user->user_nicename = $request['slug']; } if ( isset( $request['description'] ) && ! empty( $schema['properties']['description'] ) ) { $prepared_user->description = $request['description']; } if ( isset( $request['url'] ) && ! empty( $schema['properties']['url'] ) ) { $prepared_user->user_url = $request['url']; } if ( isset( $request['locale'] ) && ! empty( $schema['properties']['locale'] ) ) { $prepared_user->locale = $request['locale']; } // Setting roles will be handled outside of this function. if ( isset( $request['roles'] ) ) { $prepared_user->role = false; } /** * Filters user data before insertion via the REST API. * * @since 4.7.0 * * @param object $prepared_user User object. * @param WP_REST_Request $request Request object. */ return apply_filters( 'rest_pre_insert_user', $prepared_user, $request ); } /** * Determines if the current user is allowed to make the desired roles change. * * @since 4.7.0 * * @global WP_Roles $wp_roles WordPress role management object. * * @param int $user_id User ID. * @param array $roles New user roles. * @return true|WP_Error True if the current user is allowed to make the role change, * otherwise a WP_Error object. */ protected function check_role_update( $user_id, $roles ) { global $wp_roles; foreach ( $roles as $role ) { if ( ! isset( $wp_roles->role_objects[ $role ] ) ) { return new WP_Error( 'rest_user_invalid_role', /* translators: %s: Role key. */ sprintf( __( 'The role %s does not exist.' ), $role ), array( 'status' => 400 ) ); } $potential_role = $wp_roles->role_objects[ $role ]; /* * Don't let anyone with 'edit_users' (admins) edit their own role to something without it. * Multisite super admins can freely edit their blog roles -- they possess all caps. */ if ( ! ( is_multisite() && current_user_can( 'manage_sites' ) ) && get_current_user_id() === $user_id && ! $potential_role->has_cap( 'edit_users' ) ) { return new WP_Error( 'rest_user_invalid_role', __( 'Sorry, you are not allowed to give users that role.' ), array( 'status' => rest_authorization_required_code() ) ); } // Include user admin functions to get access to get_editable_roles(). require_once ABSPATH . 'wp-admin/includes/user.php'; // The new role must be editable by the logged-in user. $editable_roles = get_editable_roles(); if ( empty( $editable_roles[ $role ] ) ) { return new WP_Error( 'rest_user_invalid_role', __( 'Sorry, you are not allowed to give users that role.' ), array( 'status' => 403 ) ); } } return true; } /** * Check a username for the REST API. * * Performs a couple of checks like edit_user() in wp-admin/includes/user.php. * * @since 4.7.0 * * @param string $value The username submitted in the request. * @param WP_REST_Request $request Full details about the request. * @param string $param The parameter name. * @return string|WP_Error The sanitized username, if valid, otherwise an error. */ public function check_username( $value, $request, $param ) { $username = (string) $value; if ( ! validate_username( $username ) ) { return new WP_Error( 'rest_user_invalid_username', __( 'This username is invalid because it uses illegal characters. Please enter a valid username.' ), array( 'status' => 400 ) ); } /** This filter is documented in wp-includes/user.php */ $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); if ( in_array( strtolower( $username ), array_map( 'strtolower', $illegal_logins ), true ) ) { return new WP_Error( 'rest_user_invalid_username', __( 'Sorry, that username is not allowed.' ), array( 'status' => 400 ) ); } return $username; } /** * Check a user password for the REST API. * * Performs a couple of checks like edit_user() in wp-admin/includes/user.php. * * @since 4.7.0 * * @param string $value The password submitted in the request. * @param WP_REST_Request $request Full details about the request. * @param string $param The parameter name. * @return string|WP_Error The sanitized password, if valid, otherwise an error. */ public function check_user_password( #[\SensitiveParameter] $value, $request, $param ) { $password = (string) $value; if ( empty( $password ) ) { return new WP_Error( 'rest_user_invalid_password', __( 'Passwords cannot be empty.' ), array( 'status' => 400 ) ); } if ( str_contains( $password, '\\' ) ) { return new WP_Error( 'rest_user_invalid_password', sprintf( /* translators: %s: The '\' character. */ __( 'Passwords cannot contain the "%s" character.' ), '\\' ), array( 'status' => 400 ) ); } return $password; } /** * Retrieves the user's schema, conforming to JSON Schema. * * @since 4.7.0 * * @return array Item schema data. */ public function get_item_schema() { if ( $this->schema ) { return $this->add_additional_fields_schema( $this->schema ); } $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'user', 'type' => 'object', 'properties' => array( 'id' => array( 'description' => __( 'Unique identifier for the user.' ), 'type' => 'integer', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), 'username' => array( 'description' => __( 'Login name for the user.' ), 'type' => 'string', 'context' => array( 'edit' ), 'required' => true, 'arg_options' => array( 'sanitize_callback' => array( $this, 'check_username' ), ), ), 'name' => array( 'description' => __( 'Display name for the user.' ), 'type' => 'string', 'context' => array( 'embed', 'view', 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'first_name' => array( 'description' => __( 'First name for the user.' ), 'type' => 'string', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'last_name' => array( 'description' => __( 'Last name for the user.' ), 'type' => 'string', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'email' => array( 'description' => __( 'The email address for the user.' ), 'type' => 'string', 'format' => 'email', 'context' => array( 'edit' ), 'required' => true, ), 'url' => array( 'description' => __( 'URL of the user.' ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'embed', 'view', 'edit' ), ), 'description' => array( 'description' => __( 'Description of the user.' ), 'type' => 'string', 'context' => array( 'embed', 'view', 'edit' ), ), 'link' => array( 'description' => __( 'Author URL of the user.' ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), 'locale' => array( 'description' => __( 'Locale for the user.' ), 'type' => 'string', 'enum' => array_merge( array( '', 'en_US' ), get_available_languages() ), 'context' => array( 'edit' ), ), 'nickname' => array( 'description' => __( 'The nickname for the user.' ), 'type' => 'string', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'slug' => array( 'description' => __( 'An alphanumeric identifier for the user.' ), 'type' => 'string', 'context' => array( 'embed', 'view', 'edit' ), 'arg_options' => array( 'sanitize_callback' => array( $this, 'sanitize_slug' ), ), ), 'registered_date' => array( 'description' => __( 'Registration date for the user.' ), 'type' => 'string', 'format' => 'date-time', 'context' => array( 'edit' ), 'readonly' => true, ), 'roles' => array( 'description' => __( 'Roles assigned to the user.' ), 'type' => 'array', 'items' => array( 'type' => 'string', ), 'context' => array( 'edit' ), ), 'password' => array( 'description' => __( 'Password for the user (never included).' ), 'type' => 'string', 'context' => array(), // Password is never displayed. 'required' => true, 'arg_options' => array( 'sanitize_callback' => array( $this, 'check_user_password' ), ), ), 'capabilities' => array( 'description' => __( 'All capabilities assigned to the user.' ), 'type' => 'object', 'context' => array( 'edit' ), 'readonly' => true, ), 'extra_capabilities' => array( 'description' => __( 'Any extra capabilities assigned to the user.' ), 'type' => 'object', 'context' => array( 'edit' ), 'readonly' => true, ), ), ); if ( get_option( 'show_avatars' ) ) { $avatar_properties = array(); $avatar_sizes = rest_get_avatar_sizes(); foreach ( $avatar_sizes as $size ) { $avatar_properties[ $size ] = array( /* translators: %d: Avatar image size in pixels. */ 'description' => sprintf( __( 'Avatar URL with image size of %d pixels.' ), $size ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'embed', 'view', 'edit' ), ); } $schema['properties']['avatar_urls'] = array( 'description' => __( 'Avatar URLs for the user.' ), 'type' => 'object', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, 'properties' => $avatar_properties, ); } $schema['properties']['meta'] = $this->meta->get_field_schema(); $this->schema = $schema; return $this->add_additional_fields_schema( $this->schema ); } /** * Retrieves the query params for collections. * * @since 4.7.0 * * @return array Collection parameters. */ public function get_collection_params() { $query_params = parent::get_collection_params(); $query_params['context']['default'] = 'view'; $query_params['exclude'] = array( 'description' => __( 'Ensure result set excludes specific IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), ); $query_params['include'] = array( 'description' => __( 'Limit result set to specific IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), ); $query_params['offset'] = array( 'description' => __( 'Offset the result set by a specific number of items.' ), 'type' => 'integer', ); $query_params['order'] = array( 'default' => 'asc', 'description' => __( 'Order sort attribute ascending or descending.' ), 'enum' => array( 'asc', 'desc' ), 'type' => 'string', ); $query_params['orderby'] = array( 'default' => 'name', 'description' => __( 'Sort collection by user attribute.' ), 'enum' => array( 'id', 'include', 'name', 'registered_date', 'slug', 'include_slugs', 'email', 'url', ), 'type' => 'string', ); $query_params['slug'] = array( 'description' => __( 'Limit result set to users with one or more specific slugs.' ), 'type' => 'array', 'items' => array( 'type' => 'string', ), ); $query_params['roles'] = array( 'description' => __( 'Limit result set to users matching at least one specific role provided. Accepts csv list or single role.' ), 'type' => 'array', 'items' => array( 'type' => 'string', ), ); $query_params['capabilities'] = array( 'description' => __( 'Limit result set to users matching at least one specific capability provided. Accepts csv list or single capability.' ), 'type' => 'array', 'items' => array( 'type' => 'string', ), ); $query_params['who'] = array( 'description' => __( 'Limit result set to users who are considered authors.' ), 'type' => 'string', 'enum' => array( 'authors', ), ); $query_params['has_published_posts'] = array( 'description' => __( 'Limit result set to users who have published posts.' ), 'type' => array( 'boolean', 'array' ), 'items' => array( 'type' => 'string', 'enum' => get_post_types( array( 'show_in_rest' => true ), 'names' ), ), ); $query_params['search_columns'] = array( 'default' => array(), 'description' => __( 'Array of column names to be searched.' ), 'type' => 'array', 'items' => array( 'enum' => array( 'email', 'name', 'id', 'username', 'slug' ), 'type' => 'string', ), ); /** * Filters REST API collection parameters for the users controller. * * This filter registers the collection parameter, but does not map the * collection parameter to an internal WP_User_Query parameter. Use the * `rest_user_query` filter to set WP_User_Query arguments. * * @since 4.7.0 * * @param array $query_params JSON Schema-formatted collection parameters. */ return apply_filters( 'rest_user_collection_params', $query_params ); } } ashed via the REST API. * * Return false to disable trash support for the comment. * * @since 4.7.0 * * @param bool $supports_trash Whether the comment supports trashing. * @param WP_Comment $comment The comment object being considered for trashing support. */ $supports_trash = apply_filters( 'rest_comment_trashable', ( EMPTY_TRASH_DAYS > 0 ), $comment ); $request->set_param( 'context', 'edit' ); if ( $force ) { $previous = $this->prepare_item_for_response( $comment, $request ); $result = wp_delete_comment( $comment->comment_ID, true ); $response = new WP_REST_Response(); $response->set_data( array( 'deleted' => true, 'previous' => $previous->get_data(), ) ); } else { // If this type doesn't support trashing, error out. if ( ! $supports_trash ) { return new WP_Error( 'rest_trash_not_supported', /* translators: %s: force=true */ sprintf( __( "The comment does not support trashing. Set '%s' to delete." ), 'force=true' ), array( 'status' => 501 ) ); } if ( 'trash' === $comment->comment_approved ) { return new WP_Error( 'rest_already_trashed', __( 'The comment has already been trashed.' ), array( 'status' => 410 ) ); } $result = wp_trash_comment( $comment->comment_ID ); $comment = get_comment( $comment->comment_ID ); $response = $this->prepare_item_for_response( $comment, $request ); } if ( ! $result ) { return new WP_Error( 'rest_cannot_delete', __( 'The comment cannot be deleted.' ), array( 'status' => 500 ) ); } /** * Fires after a comment is deleted via the REST API. * * @since 4.7.0 * * @param WP_Comment $comment The deleted comment data. * @param WP_REST_Response $response The response returned from the API. * @param WP_REST_Request $request The request sent to the API. */ do_action( 'rest_delete_comment', $comment, $response, $request ); return $response; } /** * Prepares a single comment output for response. * * @since 4.7.0 * @since 5.9.0 Renamed `$comment` to `$item` to match parent class for PHP 8 named parameter support. * * @param WP_Comment $item Comment object. * @param WP_REST_Request $request Request object. * @return WP_REST_Response Response object. */ public function prepare_item_for_response( $item, $request ) { // Restores the more descriptive, specific name for use within this method. $comment = $item; // Don't prepare the response body for HEAD requests. if ( $request->is_method( 'HEAD' ) ) { /** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php */ return apply_filters( 'rest_prepare_comment', new WP_REST_Response( array() ), $comment, $request ); } $fields = $this->get_fields_for_response( $request ); $data = array(); if ( in_array( 'id', $fields, true ) ) { $data['id'] = (int) $comment->comment_ID; } if ( in_array( 'post', $fields, true ) ) { $data['post'] = (int) $comment->comment_post_ID; } if ( in_array( 'parent', $fields, true ) ) { $data['parent'] = (int) $comment->comment_parent; } if ( in_array( 'author', $fields, true ) ) { $data['author'] = (int) $comment->user_id; } if ( in_array( 'author_name', $fields, true ) ) { $data['author_name'] = $comment->comment_author; } if ( in_array( 'author_email', $fields, true ) ) { $data['author_email'] = $comment->comment_author_email; } if ( in_array( 'author_url', $fields, true ) ) { $data['author_url'] = $comment->comment_author_url; } if ( in_array( 'author_ip', $fields, true ) ) { $data['author_ip'] = $comment->comment_author_IP; } if ( in_array( 'author_user_agent', $fields, true ) ) { $data['author_user_agent'] = $comment->comment_agent; } if ( in_array( 'date', $fields, true ) ) { $data['date'] = mysql_to_rfc3339( $comment->comment_date ); } if ( in_array( 'date_gmt', $fields, true ) ) { $data['date_gmt'] = mysql_to_rfc3339( $comment->comment_date_gmt ); } if ( in_array( 'content', $fields, true ) ) { $data['content'] = array( /** This filter is documented in wp-includes/comment-template.php */ 'rendered' => apply_filters( 'comment_text', $comment->comment_content, $comment, array() ), 'raw' => $comment->comment_content, ); } if ( in_array( 'link', $fields, true ) ) { $data['link'] = get_comment_link( $comment ); } if ( in_array( 'status', $fields, true ) ) { $data['status'] = $this->prepare_status_response( $comment->comment_approved ); } if ( in_array( 'type', $fields, true ) ) { $data['type'] = get_comment_type( $comment->comment_ID ); } if ( in_array( 'author_avatar_urls', $fields, true ) ) { $data['author_avatar_urls'] = rest_get_avatar_urls( $comment ); } if ( in_array( 'meta', $fields, true ) ) { $data['meta'] = $this->meta->get_value( $comment->comment_ID, $request ); } $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; $data = $this->add_additional_fields_to_object( $data, $request ); $data = $this->filter_response_by_context( $data, $context ); // Wrap the data in a response object. $response = rest_ensure_response( $data ); if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) { $response->add_links( $this->prepare_links( $comment ) ); } /** * Filters a comment returned from the REST API. * * Allows modification of the comment right before it is returned. * * @since 4.7.0 * * @param WP_REST_Response $response The response object. * @param WP_Comment $comment The original comment object. * @param WP_REST_Request $request Request used to generate the response. */ return apply_filters( 'rest_prepare_comment', $response, $comment, $request ); } /** * Prepares links for the request. * * @since 4.7.0 * * @param WP_Comment $comment Comment object. * @return array Links for the given comment. */ protected function prepare_links( $comment ) { $links = array( 'self' => array( 'href' => rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $comment->comment_ID ) ), ), 'collection' => array( 'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ), ), ); if ( 0 !== (int) $comment->user_id ) { $links['author'] = array( 'href' => rest_url( 'wp/v2/users/' . $comment->user_id ), 'embeddable' => true, ); } if ( 0 !== (int) $comment->comment_post_ID ) { $post = get_post( $comment->comment_post_ID ); $post_route = rest_get_route_for_post( $post ); if ( ! empty( $post->ID ) && $post_route ) { $links['up'] = array( 'href' => rest_url( $post_route ), 'embeddable' => true, 'post_type' => $post->post_type, ); } } if ( 0 !== (int) $comment->comment_parent ) { $links['in-reply-to'] = array( 'href' => rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $comment->comment_parent ) ), 'embeddable' => true, ); } // Only grab one comment to verify the comment has children. $comment_children = $comment->get_children( array( 'count' => true, 'orderby' => 'none', 'type' => 'all', ) ); if ( ! empty( $comment_children ) ) { $args = array( 'parent' => $comment->comment_ID, ); $rest_url = add_query_arg( $args, rest_url( $this->namespace . '/' . $this->rest_base ) ); $links['children'] = array( 'href' => $rest_url, 'embeddable' => true, ); } // Embedding children for notes requires `type` and `status` inheritance. if ( isset( $links['children'] ) && 'note' === $comment->comment_type ) { $args = array( 'parent' => $comment->comment_ID, 'type' => $comment->comment_type, 'status' => 'all', ); $rest_url = add_query_arg( $args, rest_url( $this->namespace . '/' . $this->rest_base ) ); $links['children'] = array( 'href' => $rest_url, 'embeddable' => true, ); } return $links; } /** * Prepends internal property prefix to query parameters to match our response fields. * * @since 4.7.0 * * @param string $query_param Query parameter. * @return string The normalized query parameter. */ protected function normalize_query_param( $query_param ) { $prefix = 'comment_'; switch ( $query_param ) { case 'id': $normalized = $prefix . 'ID'; break; case 'post': $normalized = $prefix . 'post_ID'; break; case 'parent': $normalized = $prefix . 'parent'; break; case 'include': $normalized = 'comment__in'; break; default: $normalized = $prefix . $query_param; break; } return $normalized; } /** * Checks comment_approved to set comment status for single comment output. * * @since 4.7.0 * * @param string $comment_approved Comment status. * @return string Comment status. */ protected function prepare_status_response( $comment_approved ) { switch ( $comment_approved ) { case 'hold': case '0': $status = 'hold'; break; case 'approve': case '1': $status = 'approved'; break; case 'spam': case 'trash': default: $status = $comment_approved; break; } return $status; } /** * Prepares a single comment to be inserted into the database. * * @since 4.7.0 * * @param WP_REST_Request $request Request object. * @return array|WP_Error Prepared comment, otherwise WP_Error object. */ protected function prepare_item_for_database( $request ) { $prepared_comment = array(); /* * Allow the comment_content to be set via the 'content' or * the 'content.raw' properties of the Request object. */ if ( isset( $request['content'] ) && is_string( $request['content'] ) ) { $prepared_comment['comment_content'] = trim( $request['content'] ); } elseif ( isset( $request['content']['raw'] ) && is_string( $request['content']['raw'] ) ) { $prepared_comment['comment_content'] = trim( $request['content']['raw'] ); } if ( isset( $request['post'] ) ) { $prepared_comment['comment_post_ID'] = (int) $request['post']; } if ( isset( $request['parent'] ) ) { $prepared_comment['comment_parent'] = $request['parent']; } if ( isset( $request['author'] ) ) { $user = new WP_User( $request['author'] ); if ( $user->exists() ) { $prepared_comment['user_id'] = $user->ID; $prepared_comment['comment_author'] = $user->display_name; $prepared_comment['comment_author_email'] = $user->user_email; $prepared_comment['comment_author_url'] = $user->user_url; } else { return new WP_Error( 'rest_comment_author_invalid', __( 'Invalid comment author ID.' ), array( 'status' => 400 ) ); } } if ( isset( $request['author_name'] ) ) { $prepared_comment['comment_author'] = $request['author_name']; } if ( isset( $request['author_email'] ) ) { $prepared_comment['comment_author_email'] = $request['author_email']; } if ( isset( $request['author_url'] ) ) { $prepared_comment['comment_author_url'] = $request['author_url']; } if ( isset( $request['author_ip'] ) && current_user_can( 'moderate_comments' ) ) { $prepared_comment['comment_author_IP'] = $request['author_ip']; } elseif ( ! empty( $_SERVER['REMOTE_ADDR'] ) && rest_is_ip_address( $_SERVER['REMOTE_ADDR'] ) ) { $prepared_comment['comment_author_IP'] = $_SERVER['REMOTE_ADDR']; } else { $prepared_comment['comment_author_IP'] = '127.0.0.1'; } if ( ! empty( $request['author_user_agent'] ) ) { $prepared_comment['comment_agent'] = $request['author_user_agent']; } elseif ( $request->get_header( 'user_agent' ) ) { $prepared_comment['comment_agent'] = $request->get_header( 'user_agent' ); } if ( ! empty( $request['date'] ) ) { $date_data = rest_get_date_with_gmt( $request['date'] ); if ( ! empty( $date_data ) ) { list( $prepared_comment['comment_date'], $prepared_comment['comment_date_gmt'] ) = $date_data; } } elseif ( ! empty( $request['date_gmt'] ) ) { $date_data = rest_get_date_with_gmt( $request['date_gmt'], true ); if ( ! empty( $date_data ) ) { list( $prepared_comment['comment_date'], $prepared_comment['comment_date_gmt'] ) = $date_data; } } /** * Filters a comment added via the REST API after it is prepared for insertion into the database. * * Allows modification of the comment right after it is prepared for the database. * * @since 4.7.0 * * @param array $prepared_comment The prepared comment data for `wp_insert_comment`. * @param WP_REST_Request $request The current request. */ return apply_filters( 'rest_preprocess_comment', $prepared_comment, $request ); } /** * Retrieves the comment's schema, conforming to JSON Schema. * * @since 4.7.0 * * @return array */ public function get_item_schema() { if ( $this->schema ) { return $this->add_additional_fields_schema( $this->schema ); } $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'comment', 'type' => 'object', 'properties' => array( 'id' => array( 'description' => __( 'Unique identifier for the comment.' ), 'type' => 'integer', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'author' => array( 'description' => __( 'The ID of the user object, if author was a user.' ), 'type' => 'integer', 'context' => array( 'view', 'edit', 'embed' ), ), 'author_email' => array( 'description' => __( 'Email address for the comment author.' ), 'type' => 'string', 'format' => 'email', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => array( $this, 'check_comment_author_email' ), 'validate_callback' => null, // Skip built-in validation of 'email'. ), ), 'author_ip' => array( 'description' => __( 'IP address for the comment author.' ), 'type' => 'string', 'format' => 'ip', 'context' => array( 'edit' ), ), 'author_name' => array( 'description' => __( 'Display name for the comment author.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'author_url' => array( 'description' => __( 'URL for the comment author.' ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'view', 'edit', 'embed' ), ), 'author_user_agent' => array( 'description' => __( 'User agent for the comment author.' ), 'type' => 'string', 'context' => array( 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'content' => array( 'description' => __( 'The content for the comment.' ), 'type' => 'object', 'context' => array( 'view', 'edit', 'embed' ), 'arg_options' => array( 'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database(). 'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database(). ), 'properties' => array( 'raw' => array( 'description' => __( 'Content for the comment, as it exists in the database.' ), 'type' => 'string', 'context' => array( 'edit' ), ), 'rendered' => array( 'description' => __( 'HTML content for the comment, transformed for display.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), ), ), 'date' => array( 'description' => __( "The date the comment was published, in the site's timezone." ), 'type' => 'string', 'format' => 'date-time', 'context' => array( 'view', 'edit', 'embed' ), ), 'date_gmt' => array( 'description' => __( 'The date the comment was published, as GMT.' ), 'type' => 'string', 'format' => 'date-time', 'context' => array( 'view', 'edit' ), ), 'link' => array( 'description' => __( 'URL to the comment.' ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), 'parent' => array( 'description' => __( 'The ID for the parent of the comment.' ), 'type' => 'integer', 'context' => array( 'view', 'edit', 'embed' ), 'default' => 0, ), 'post' => array( 'description' => __( 'The ID of the associated post object.' ), 'type' => 'integer', 'context' => array( 'view', 'edit' ), 'default' => 0, ), 'status' => array( 'description' => __( 'State of the comment.' ), 'type' => 'string', 'context' => array( 'view', 'edit' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_key', ), ), 'type' => array( 'description' => __( 'Type of the comment.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, 'default' => 'comment', ), ), ); if ( get_option( 'show_avatars' ) ) { $avatar_properties = array(); $avatar_sizes = rest_get_avatar_sizes(); foreach ( $avatar_sizes as $size ) { $avatar_properties[ $size ] = array( /* translators: %d: Avatar image size in pixels. */ 'description' => sprintf( __( 'Avatar URL with image size of %d pixels.' ), $size ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'embed', 'view', 'edit' ), ); } $schema['properties']['author_avatar_urls'] = array( 'description' => __( 'Avatar URLs for the comment author.' ), 'type' => 'object', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, 'properties' => $avatar_properties, ); } $schema['properties']['meta'] = $this->meta->get_field_schema(); $this->schema = $schema; return $this->add_additional_fields_schema( $this->schema ); } /** * Retrieves the query params for collections. * * @since 4.7.0 * * @return array Comments collection parameters. */ public function get_collection_params() { $query_params = parent::get_collection_params(); $query_params['context']['default'] = 'view'; $query_params['after'] = array( 'description' => __( 'Limit response to comments published after a given ISO8601 compliant date.' ), 'type' => 'string', 'format' => 'date-time', ); $query_params['author'] = array( 'description' => __( 'Limit result set to comments assigned to specific user IDs. Requires authorization.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), ); $query_params['author_exclude'] = array( 'description' => __( 'Ensure result set excludes comments assigned to specific user IDs. Requires authorization.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), ); $query_params['author_email'] = array( 'default' => null, 'description' => __( 'Limit result set to that from a specific author email. Requires authorization.' ), 'format' => 'email', 'type' => 'string', ); $query_params['before'] = array( 'description' => __( 'Limit response to comments published before a given ISO8601 compliant date.' ), 'type' => 'string', 'format' => 'date-time', ); $query_params['exclude'] = array( 'description' => __( 'Ensure result set excludes specific IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), ); $query_params['include'] = array( 'description' => __( 'Limit result set to specific IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), 'default' => array(), ); $query_params['offset'] = array( 'description' => __( 'Offset the result set by a specific number of items.' ), 'type' => 'integer', ); $query_params['order'] = array( 'description' => __( 'Order sort attribute ascending or descending.' ), 'type' => 'string', 'default' => 'desc', 'enum' => array( 'asc', 'desc', ), ); $query_params['orderby'] = array( 'description' => __( 'Sort collection by comment attribute.' ), 'type' => 'string', 'default' => 'date_gmt', 'enum' => array( 'date', 'date_gmt', 'id', 'include', 'post', 'parent', 'type', ), ); $query_params['parent'] = array( 'default' => array(), 'description' => __( 'Limit result set to comments of specific parent IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), ); $query_params['parent_exclude'] = array( 'default' => array(), 'description' => __( 'Ensure result set excludes specific parent IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), ); $query_params['post'] = array( 'default' => array(), 'description' => __( 'Limit result set to comments assigned to specific post IDs.' ), 'type' => 'array', 'items' => array( 'type' => 'integer', ), ); $query_params['status'] = array( 'default' => 'approve', 'description' => __( 'Limit result set to comments assigned a specific status. Requires authorization.' ), 'sanitize_callback' => 'sanitize_key', 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); $query_params['type'] = array( 'default' => 'comment', 'description' => __( 'Limit result set to comments assigned a specific type. Requires authorization.' ), 'sanitize_callback' => 'sanitize_key', 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); $query_params['password'] = array( 'description' => __( 'The password for the post if it is password protected.' ), 'type' => 'string', ); /** * Filters REST API collection parameters for the comments controller. * * This filter registers the collection parameter, but does not map the * collection parameter to an internal WP_Comment_Query parameter. Use the * `rest_comment_query` filter to set WP_Comment_Query parameters. * * @since 4.7.0 * * @param array $query_params JSON Schema-formatted collection parameters. */ return apply_filters( 'rest_comment_collection_params', $query_params ); } /** * Sets the comment_status of a given comment object when creating or updating a comment. * * @since 4.7.0 * * @param string|int $new_status New comment status. * @param int $comment_id Comment ID. * @return bool Whether the status was changed. */ protected function handle_status_param( $new_status, $comment_id ) { $old_status = wp_get_comment_status( $comment_id ); if ( $new_status === $old_status ) { return false; } switch ( $new_status ) { case 'approved': case 'approve': case '1': $changed = wp_set_comment_status( $comment_id, 'approve' ); break; case 'hold': case '0': $changed = wp_set_comment_status( $comment_id, 'hold' ); break; case 'spam': $changed = wp_spam_comment( $comment_id ); break; case 'unspam': $changed = wp_unspam_comment( $comment_id ); break; case 'trash': $changed = wp_trash_comment( $comment_id ); break; case 'untrash': $changed = wp_untrash_comment( $comment_id ); break; default: $changed = false; break; } return $changed; } /** * Checks if the post can be read. * * Correctly handles posts with the inherit status. * * @since 4.7.0 * * @param WP_Post $post Post object. * @param WP_REST_Request $request Request data to check. * @return bool Whether post can be read. */ protected function check_read_post_permission( $post, $request ) { $post_type = get_post_type_object( $post->post_type ); // Return false if custom post type doesn't exist if ( ! $post_type ) { return false; } $posts_controller = $post_type->get_rest_controller(); /* * Ensure the posts controller is specifically a WP_REST_Posts_Controller instance * before using methods specific to that controller. */ if ( ! $posts_controller instanceof WP_REST_Posts_Controller ) { $posts_controller = new WP_REST_Posts_Controller( $post->post_type ); } $has_password_filter = false; // Only check password if a specific post was queried for or a single comment $requested_post = ! empty( $request['post'] ) && ( ! is_array( $request['post'] ) || 1 === count( $request['post'] ) ); $requested_comment = ! empty( $request['id'] ); if ( ( $requested_post || $requested_comment ) && $posts_controller->can_access_password_content( $post, $request ) ) { add_filter( 'post_password_required', '__return_false' ); $has_password_filter = true; } if ( post_password_required( $post ) ) { $result = current_user_can( 'edit_post', $post->ID ); } else { $result = $posts_controller->check_read_permission( $post ); } if ( $has_password_filter ) { remove_filter( 'post_password_required', '__return_false' ); } return $result; } /** * Checks if the comment can be read. * * @since 4.7.0 * * @param WP_Comment $comment Comment object. * @param WP_REST_Request $request Request data to check. * @return bool Whether the comment can be read. */ protected function check_read_permission( $comment, $request ) { if ( 'note' !== $comment->comment_type && ! empty( $comment->comment_post_ID ) ) { $post = get_post( $comment->comment_post_ID ); if ( $post ) { if ( $this->check_read_post_permission( $post, $request ) && 1 === (int) $comment->comment_approved ) { return true; } } } if ( 0 === get_current_user_id() ) { return false; } if ( empty( $comment->comment_post_ID ) && ! current_user_can( 'moderate_comments' ) ) { return false; } if ( ! empty( $comment->user_id ) && get_current_user_id() === (int) $comment->user_id ) { return true; } return current_user_can( 'edit_comment', $comment->comment_ID ); } /** * Checks if a comment can be edited or deleted. * * @since 4.7.0 * * @param WP_Comment $comment Comment object. * @return bool Whether the comment can be edited or deleted. */ protected function check_edit_permission( $comment ) { if ( 0 === (int) get_current_user_id() ) { return false; } if ( current_user_can( 'moderate_comments' ) ) { return true; } return current_user_can( 'edit_comment', $comment->comment_ID ); } /** * Checks a comment author email for validity. * * Accepts either a valid email address or empty string as a valid comment * author email address. Setting the comment author email to an empty * string is allowed when a comment is being updated. * * @since 4.7.0 * * @param string $value Author email value submitted. * @param WP_REST_Request $request Full details about the request. * @param string $param The parameter name. * @return string|WP_Error The sanitized email address, if valid, * otherwise an error. */ public function check_comment_author_email( $value, $request, $param ) { $email = (string) $value; if ( empty( $email ) ) { return $email; } $check_email = rest_validate_request_arg( $email, $request, $param ); if ( is_wp_error( $check_email ) ) { return $check_email; } return $email; } /** * If empty comments are not allowed, checks if the provided comment content is not empty. * * @since 5.6.0 * * @param array $prepared_comment The prepared comment data. * @return bool True if the content is allowed, false otherwise. */ protected function check_is_comment_content_allowed( $prepared_comment ) { if ( ! isset( $prepared_comment['comment_content'] ) ) { return true; } $check = wp_parse_args( $prepared_comment, array( 'comment_post_ID' => 0, 'comment_author' => null, 'comment_author_email' => null, 'comment_author_url' => null, 'comment_parent' => 0, 'user_id' => 0, ) ); /** This filter is documented in wp-includes/comment.php */ $allow_empty = apply_filters( 'allow_empty_comment', false, $check ); if ( $allow_empty ) { return true; } // Allow empty notes only when resolution metadata is valid. if ( isset( $check['comment_type'] ) && 'note' === $check['comment_type'] && isset( $check['meta']['_wp_note_status'] ) && in_array( $check['meta']['_wp_note_status'], array( 'resolved', 'reopen' ), true ) ) { return true; } /* * Do not allow a comment to be created with missing or empty * comment_content. See wp_handle_comment_submission(). */ return '' !== $check['comment_content']; } /** * Check if post type supports notes. * * @param string $post_type Post type name. * @return bool True if post type supports notes, false otherwise. */ private function check_post_type_supports_notes( $post_type ) { $supports = get_all_post_type_supports( $post_type ); if ( ! isset( $supports['editor'] ) ) { return false; } if ( ! is_array( $supports['editor'] ) ) { return false; } foreach ( $supports['editor'] as $item ) { if ( ! empty( $item['notes'] ) ) { return true; } } return false; } } Huawei Mate 20 book case – alibabatelecom
ADD ANYTHING HERE OR JUST REMOVE IT…
  • NEWSLETTER
  • CONTACT US
  • FAQs
alibabatelecom
Select category
  • Select category
  • Accessories
    • Mouse , Keyboard
    • phone card holder
    • Phone holder
    • Pop socket
    • Selfi
    • USB-SD card
  • brands
    • ACEFAST
    • AMA Book Case
    • AMA Extra pas Book Case
    • Anti shock
      • Iphone
    • Apple
    • Back case card holder
    • back case color
      • Luxury clear magnetic back case
    • BOROFONE
    • Fashion Case
    • Hoco
    • ideal of Sweden
    • KEY Book Case
    • kingston Memory
    • Magnet leather case
    • OG Tempered Glass
    • Samsung
  • Childeren toys
    • Car , Motor
  • Electronics
    • Adapters
    • Air Tag
    • Bluetooth Speaker
    • Cables
    • Car adapter , cables
    • Gaming
    • HDMI , converter
    • Headset , audio jack
    • Oudio Other
    • Wirless charger
  • Mobile , Ipad , watch cases
    • Ipad case
  • Mobile , Tab , Watch parts
    • Ipad
      • Ipad battery
      • Ipad charging port
      • Ipad display
    • Iphone
      • Iphone back camera
      • Iphone Back cover
      • Iphone battery
      • Iphone camera lens
      • Iphone charging port
      • Iphone display
      • Iphone earspeaker
      • Iphone front camera
      • Iphone loudspeaker
      • iphone parts
      • Iphone Simcard holder
    • Samsung
      • Main Flex
      • Power And Volume Flex Cable
      • Samsung back camera
      • Samsung back cover
      • Samsung battery
      • Samsung camera lens
      • Samsung charging port
      • Samsung display
      • Samsung earspeaker
      • Samsung front camera
      • Samsung LCD Flex
      • Samsung loudspeaker
      • Samsung Signal Antenna
      • Samsung Simcard holder
  • Mobile , Tablets Accessories
    • Apple
      • Apple Watch
        • Apple watch 3 serie 40mm
        • Apple watch 3 serie 42mm
        • Apple watch 4 serie 38mm
        • Apple watch 4 serie 42mm
        • Apple watch 5 serie 40mm
        • Apple watch 5 serie 44mm
        • Apple watch 6 serie 40mm
        • Apple watch 6 serie 44mm
        • Apple watch 7 serie 41mm
        • Apple watch 7 serie 45mm
        • Apple watch 8 serie 41mm
        • Apple watch 8 serie 45mm
        • Apple watch Ultra 49mm 1st Gen
      • IPad
        • iPad 10.2 7th Ge (2019)
        • iPad 10.2 8th Ge (2020)
        • iPad 10.2 9th Ge (2021)
        • iPad 10.9 (10th 2022)
        • iPad 11 (11Gen 2025 )
        • Ipad 3
        • Ipad 4
        • iPad 9.7 (5th 2017)
        • iPad 9.7 (6th 2018)
        • iPad Air (2013)
        • iPad Air 11 (2024)
        • iPad Air 11 (2025)
        • iPad Air 13 (2024)
        • iPad Air 13 (2025)
        • Ipad Air 2 (2014)
        • iPad Air 3rd Ge (2019)
        • iPad Air 4th Ge (2020)
        • iPad Air 5th Ge (2022)
        • ipad mini 4th Ge (2015)
        • ipad mini 5th Ge (2019)
        • ipad mini 6th Ge (2021)
        • iPad Pro 10.5 (2017)
        • iPad Pro 11 (1Gen 2018)
        • iPad Pro 11 (2 Gen: 2020)
        • iPad Pro 11 (3Gen 2021)
        • iPad Pro 11 (4 Gen: 2022)
        • iPad Pro 11 (5 Gen: 2024) M4
        • iPad Pro 12.9 (1nd 2015)
        • iPad Pro 12.9 (2nd 2017)
        • iPad Pro 12.9 (3nd 2018)
        • iPad Pro 12.9 (4nd 2020)
        • iPad Pro 12.9 (5nd 2021)
        • iPad Pro 12.9 (6nd 2022)
        • IPad Pro 13 (2024)(13-inch (M4)
        • iPad Pro 13 (2025)(13-inch (M5)
        • iPad Pro 9.7 (2016)
      • Iphone
        • iphone 11
        • iphone 11 pro
        • iphone 11 pro max
        • iphone 12
        • iphone 12 mini
        • iphone 12 pro
        • iphone 12 pro max
        • iphone 13
        • iphone 13 mini
        • iphone 13 pro
        • iphone 13 pro max
        • iphone 14
        • iphone 14 plus
        • iphone 14 pro
        • iphone 14 pro max
        • Iphone 15
        • Iphone 15 Plus
        • Iphone 15 Pro
        • Iphone 15 Pro Max
        • Iphone 16
        • Iphone 16 Plus
        • Iphone 16 Pro
        • Iphone 16 Pro Max
        • Iphone 16e
        • Iphone 17
        • Iphone 17 Air
        • Iphone 17 Pro
        • Iphone 17 Pro Max
        • Iphone 17e
        • iphone 5
        • iphone 5S
        • Iphone 6
        • iphone 6 plus
        • iphone 6s
        • iphone 6s plus
        • iphone 7
        • iphone 7 plus
        • iphone 8
        • iphone 8 plus
        • iphone SE
        • iphone SE 2020
        • Iphone SE 2022
        • iphone X
        • iphone XR
        • iphone XS
        • iphone XS max
    • google
      • Google Pixel 5
      • Google Pixel 5A
      • Google Pixel 6
      • Google Pixel 6 Pro
      • Google Pixel 6A
      • Google Pixel 7
      • Google Pixel 7 Pro
      • Google Pixel 7A
      • Google Pixel 8
      • Google Pixel 8 Pro
      • Google Pixel 8A
      • Google Pixel 9
      • Google Pixel 9 Pro
      • Google Pixel 9 Pro XL
    • Huawei
      • Huawei Honor Models
        • Huawei Honor 10
        • Huawei Honor 20
        • Huawei Honor 20 Lite
        • Huawei Honor 20 Pro
        • Huawei Honor 6
        • Huawei Honor 7
        • Huawei Honor 8
        • Huawei Honor 8 Lite
        • Huawei Honor 9
        • Huawei Honor View 10
        • Huawei Honor View 20
      • Huawei Mate Models
        • Huawei Mate 10
        • Huawei Mate 10 Lite
        • Huawei Mate 10 Pro
        • Huawei Mate 20
        • Huawei Mate 20 Lite
        • Huawei Mate 20 Pro
        • Huawei Mate 30
        • Huawei Mate 30 Lite
        • Huawei Mate 30 Pro
        • Huawei Mate 40
        • Huawei Mate 40 Pro
        • Huawei Mate 7
        • Huawei Mate 8
        • Huawei Mate 9
        • Huawei Mate 9 pro
      • Huawei P Models
        • Huawei P10
        • Huawei P10 Lite
        • Huawei P20
        • Huawei P20 Lite
        • Huawei P20 Lite 2019
        • Huawei P20 Pro
        • Huawei P30
        • Huawei P30 Lite
        • Huawei P30 Pro
        • Huawei P40
        • Huawei P40 Lite
        • Huawei P40 pro
        • Huawei P7
        • Huawei P8
        • Huawei P8 Lite
        • Huawei P9
        • Huawei P9 Lite
      • Huawei P smart Models
        • Huawei P smart
        • Huawei P smart 2019
        • Huawei P smart 2020
        • Huawei P smart 2021
        • Huawei P smart pro
        • Huawei P smart Z
    • Nokia
      • HMD Series
        • Nokia 2.4
        • Nokia 5.4
    • Samsung
      • Samsung A model
        • |Samsung A34 (A346)
        • Samsung A 57
        • Samsung A01
        • Samsung A02
        • samsung A02s
        • Samsung A03
        • Samsung A03s
        • Samsung A04s
        • Samsung A05S
        • Samsung A06
        • Samsung A07
        • Samsung A10
        • Samsung A10s
        • Samsung A11
        • Samsung A12
        • Samsung A13 4G
        • Samsung A13 5G
        • Samsung A14 4G
        • Samsung A14 5G
        • Samsung A15
        • Samsung A16 4G (A165F)
        • Samsung A16 5G (A166B)
        • Samsung A17
        • Samsung A20 (205F)
        • Samsung A20e (A202F)
        • Samsung A20s (A207F)
        • Samsung A21 (A215)
        • Samsung A21s (A217F)
        • Samsung A22 4G (A225F)
        • Samsung A22 5G (A226B)
        • Samsung A23 4G (SM-A236)
        • Samsung A23 5G (SM-A236)
        • Samsung A24 (A245F)
        • Samsung A25 (A256)
        • Samsung A26 (A266)
        • Samsung A27
        • Samsung A30 (A305F)
        • Samsung A30s (A307F)
        • Samsung A31 (A315F)
        • Samsung A32 4G (A325)
        • Samsung A32 5G (A326)
        • Samsung A33 5G (A336B)
        • Samsung A35 (A356)
        • Samsung A36 (A366)
        • Samsung A37
        • Samsung A40 (A405F)
        • Samsung A41 (A415F)
        • Samsung A42 (A426B)
        • Samsung A5 2015
        • Samsung A50 (A505F)
        • Samsung A50s
        • Samsung A51 (A515F)
        • Samsung A51 5G (A516B/DS)
        • Samsung A52 (A525F)
        • Samsung A52s (A528B)
        • Samsung A53 (A536B/DS)
        • Samsung A54 (A546B)
        • Samsung A55 (A556)
        • Samsung A56 (A566)
        • Samsung A60 (A606F)
        • Samsung A70 (A705F)
        • Samsung A71 5G (A716F)
        • Samsung A72 (A725)
        • Samsung A73
        • Samsung A80 (A805F)
        • Samsung A90 (A908F)
      • Samsung Buds case
      • Samsung note model
        • Samsung Note 10
        • Samsung Note 10 Lite
        • Samsung Note 10 plus
        • Samsung Note 20
        • Samsung Note 20 ultra
        • Samsung Note 8
        • Samsung Note 9
      • Samsung S model
        • Samsung s10
        • Samsung S10 lite
        • Samsung s10 plus
        • Samsung s10e
        • Samsung s20
        • Samsung s20 FE
        • Samsung s20 plus
        • Samsung s20 ultra
        • Samsung s21
        • Samsung s21 FE
        • Samsung s21 plus
        • Samsung s21 ultra
        • Samsung s22
        • Samsung s22 plus
        • Samsung s22 ultra
        • Samsung S23
        • Samsung S23 FE
        • Samsung S23 Plus
        • Samsung S23 Ultra
        • Samsung S24
        • Samsung S24 FE
        • Samsung S24 Plus
        • Samsung S24 Ultra
        • Samsung S25
        • Samsung S25 Edge
        • Samsung S25 FE
        • Samsung S25 Plus
        • Samsung S25 Ultra
        • Samsung S26
        • Samsung S26 Edge
        • Samsung S26 FE
        • Samsung S26 Plus
        • Samsung S26 Ultra
        • Samsung s4
        • Samsung s5
        • Samsung s6
        • Samsung s6 edge
        • Samsung s7
        • Samsung s7 edge
        • Samsung s8
        • Samsung s8 plus
        • Samsung s9
        • Samsung s9 plus
      • Samsung X cover model
        • Samsung x cover 3
        • Samsung x cover 4
        • Samsung x cover 4s
        • Samsung x cover 5
        • Samsung x cover 6 pro
        • Samsung X cover 7
        • Samsung x cover pro
      • Samsung Z Fold , Z flip models
        • Samsung Z Flip 3
        • Samsung Z Flip 4
        • Samsung Z Fold 3
        • Samsung Z Fold 4
  • Mobile, tablet , smart watches
    • Smart watches
  • Personal care, beauty and well-being
    • Hair dryer
    • Shaving and hair removal
  • Tempered Glass
    • Apple Watch
    • Ipad 3D
    • Iphone camera Lens
    • OG tempered Glass
      • Iphone
      • Samsung
    • Samsung camera lens
    • UV tempered Glass
      • Samsung
Login / Register
0 Wishlist
0 Compare
1 item / 299.00 kr
Menu
alibabatelecom
1 item / 299.00 kr
Browse Categories
  • Mobile, tablet , smart watches
    • Mobile
      • IOS Mobile
      • Android Mobile
      • Doro
    • Tablets
      • Ipad
      • Samsung TAB
    • Smart watches
Browse Categories
  • Apple
    • Iphone
      • Iphone 17 Pro Max
      • Iphone 17 Air
      • Iphone 17 Pro
      • Iphone 17e
      • Iphone 17
      • Iphone 16 Pro Max
      • Iphone 16 Plus
      • Iphone 16 Pro
      • Iphone 16e
      • Iphone 16
      • Iphone 15 Pro Max
      • Iphone 15 Plus
      • Iphone 15 Pro
      • Iphone 15
      • iphone 14 pro max
      • iphone 14 plus
      • iphone 14 pro
      • iphone 14
      • iphone 13 pro max
      • iphone 13 pro
      • iphone 13 mini
      • iphone 13
      • iphone 12 pro max
      • iphone 12 pro
      • iphone 12 mini
      • iphone 12
      • iphone 11 pro max
      • iphone 11 pro
      • iphone 11
      • iphone XS max
      • iphone XR
      • iphone XS
      • iphone X
      • iphone 8 plus
      • iphone 8
      • Iphone SE 2022
      • iphone SE 2020
      • iphone 7 plus
      • iphone 7
      • iphone 6s plus
      • iphone 6s
      • iphone 6 plus
      • Iphone 6
      • iphone SE
      • iphone 5S
      • iphone 5
    • IPad
      • iPad Pro 13 (2025)(13-inch (M5)
      • IPad Pro 13 (2024)(13-inch (M4)
      • iPad Pro 12.9 (6nd 2022)
      • iPad Pro 12.9 (5Gen 2021)
      • iPad Pro 12.9 (4Gen 2020)
      • iPad Pro 12.9 (3Gen 2018)
      • iPad Pro 12.9 (2Gen 2017)
      • iPad Pro 12.9 (1Gen 2015)
      • iPad Pro 11 (5 Gen: 2024) M4
      • iPad Pro 11 (4 Gen: 2022)
      • iPad Pro 11 (3Gen 2021)
      • iPad Pro 11 (2 Gen: 2020)
      • iPad Pro 11 (1Gen 2018)
      • iPad Pro 10.5 (2017)
      • iPad Pro 9.7 (2016)
      • iPad 10.9 (10th 2022)
      • iPad 10.2 9th Ge (2021)
      • iPad 10.2 8th Ge (2020)
      • iPad 10.2 7th Ge (2019)
      • iPad 9.7 (6th 2018)
      • iPad 9.7 (5th 2017)
      • iPad Air 13 (2024)
      • iPad Air 11 (2024) M2
      • iPad Air 5th Ge (2022)
      • iPad Air 4th Ge (2020)
      • iPad Air 3rd Ge (2019)
      • Ipad Air 2 (2014)
      • iPad Air (2013)
      • Ipad 4
      • Ipad 3
      • Ipad 2
      • Ipad mini 7th Ge (2023)
      • ipad mini 6th Ge (2021)
      • ipad mini 5th Ge (2019)
      • ipad mini 4th Ge (2015)
      • ipad mini 3rd Ge (2014)
      • ipad mini 2 (2013)
    • Apple Watch
      • Apple watch Ultra 49mm 2st Gen
      • Apple watch Ultra 49mm 1st Gen
      • Apple watch 9 serie 45mm
      • Apple watch 9 serie 41mm
      • Apple watch 8 serie 45mm
      • Apple watch 8 serie 41mm
      • Apple watch 7 serie 45mm
      • Apple watch 7 serie 41mm
      • Apple watch 6 serie 44mm
      • Apple watch 6 serie 40mm
      • Apple watch SE 2022 serie 44mm
      • Apple watch SE 2022 serie 40mm
      • Apple watch SE serie 44mm
      • Apple watch SE serie 40mm
      • Apple watch 5 serie 44mm
      • Apple watch 5 serie 40mm
      • Apple watch 4 serie 42mm
      • Apple watch 4 serie 38mm
      • Apple watch 3 serie 42mm
      • Apple watch 3 serie 40mm
    • AirPods
      • AirPods Pro (2st generation)
      • AirPods Pro (1st generation)
      • AirPods 4 (4st generation)
      • AirPods 3 (3st generation)
      • AirPods 2 (2st generation)
      • AirPods 1 (1st generation)
Browse Categories
  • Motorola
    • Moto G Models
      • Moto G200
      • Moto G100
      • Moto G85
      • Moto G84
      • Moto G82
      • Moto G75
      • Moto G73
      • Moto G72
      • Moto G71 5G
      • Moto G64
      • Moto G62
      • Moto G60s
      • Moto G60
      • Moto G56
      • Moto G55
      • Moto G54 Power
      • Moto G54
      • Moto G53
      • Moto G52
      • Moto G51 5G
      • Moto G50 5G
      • Moto G50 4G
      • Moto G45
      • Moto G42
      • Moto G41
      • Moto G35
      • Moto G34
      • Moto G32
      • Moto G31
      • Moto G30
      • Moto G24
      • Moto G23
      • Moto G22
      • Moto G20
      • Moto G15
      • Moto G14
      • Moto G13
      • Moto G10 play
      • Moto G10
      • Moto G Power (2021)
    • Moto E Models
      • Moto E40
      • Motorola Moto E32s
      • Motorola Moto E32
      • Motorola Moto E30
      • Motorola Moto E22
      • Motorola Moto E22i
      • Motorola Moto E20
      • Motorola Moto E14
      • Motorola Moto E15
      • Motorola Moto E13
Browse Categories
  • Accessories
    • Mouse , Keyboard
    • touch pen
    • Phone holder
    • phone card holder
    • Pop socket
    • USB-SD card
    • Selfi
Browse Categories
  • Samsung
    • Samsung S model
      • Samsung S26 Ultra
      • Samsung S26 Plus
      • Samsung S26 Edge
      • Samsung S26 FE
      • Samsung S26
      • Samsung S25 Ultra
      • Samsung S25 Plus
      • Samsung S25 Edge
      • Samsung S25 FE
      • Samsung S25
      • Samsung S24 Ultra
      • Samsung S24 Plus
      • Samsung S24 FE
      • Samsung S24
      • Samsung S23 Ultra
      • Samsung S23 Plus
      • Samsung S23 FE
      • Samsung S23
      • Samsung s22 ultra
      • Samsung s22 plus
      • Samsung s22
      • Samsung s21 ultra
      • Samsung s21 plus
      • Samsung s21 FE
      • Samsung s21
      • Samsung s20 ultra
      • Samsung s20 plus
      • Samsung s20 FE
      • Samsung s20
      • Samsung s10 plus
      • Samsung S10 lite
      • Samsung s10e
      • Samsung s10
      • Samsung s9 plus
      • Samsung s9
      • Samsung s8 plus
      • Samsung s8
      • Samsung s7 edge
      • Samsung s7
      • Samsung s6 edge
      • Samsung s6
      • Samsung s5
      • Samsung s4
    • Samsung A model,
      • Samsung A90 (A908F)
      • Samsung A80 (A805F)
      • Samsung A73
      • Samsung A50 (A505F)
      • Samsung A72 (A725)
      • Samsung A71 5G (A716F)
      • Samsung A71 (A715F)
      • Samsung A70 (A705F)
      • Samsung A60 (A606F)
      • Samsung A56 (A566)
      • Samsung A55 (A556)
      • Samsung A54 (A546B)
      • Samsung A53 (A536B/DS)
      • Samsung A52s (A528B)
      • Samsung A52 (A525F)
      • Samsung A51 5G (A516B/DS)
      • Samsung A51 (A515F)
      • Samsung A50s
      • Samsung A42 (A426B)
      • Samsung A41 (A415F)
      • Samsung A40 (A405F)
      • Samsung A36 (A366)
      • Samsung A35 (A356)
      • |Samsung A34 (A346)
      • Samsung A33 5G (A336B)
      • Samsung A32 5G (A326)
      • Samsung A32 4G (A325)
      • Samsung A31 (A315F)
      • Samsung A30s (A307F)
      • Samsung A30 (A305F)
      • Samsung A26 (A266)
      • Samsung A25 (A256)
      • Samsung A24 (A245F)
      • Samsung A23 5G (SM-A236)
      • Samsung A23 4G (SM-A236)
      • Samsung A22 5G (A226B)
      • Samsung A22 4G (A225F)
      • Samsung A21s (A217F)
      • Samsung A21 (A215)
      • Samsung A20e (A202F)
      • Samsung A17
      • Samsung A16 5G (A166B)
      • Samsung A16 4G (A165F)
      • Samsung A15
      • Samsung A14 5G
      • Samsung A14 4G
      • Samsung A13 5G
      • Samsung A13 4G
      • Samsung A12
      • Samsung A11
      • Samsung A10s
      • Samsung A10
      • Samsung A07
      • Samsung A06
      • Samsung A05S
      • Samsung A04s
      • Samsung A03s
      • Samsung A03
      • samsung A02s
      • Samsung A02
      • Samsung A01
    • Samsung note model
      • Samsung Note 20 ultra
      • Samsung Note 20
      • Samsung Note 10 plus
      • Samsung Note 10 Lite
      • Samsung Note 10
      • Samsung Note 9
      • Samsung Note 8
      • Samsung Note 5
      • Samsung Note 4
    • Samsung X cover model
      • Samsung X cover 7
      • Samsung x cover 6 pro
      • Samsung x cover pro
      • Samsung x cover 5
      • Samsung x cover 4s
      • Samsung x cover 4
      • Samsung x cover 3
    • Samsung Z Fold , Z flip models
      • Samsung Z flip 7
      • Samsung Z flip 6
      • Samsung Z flip 5
      • Samsung Z Flip 4
      • Samsung Z Flip 3
      • Samsung Z fold 7
      • Samsung Z fold 7 FE
      • Samsung Z fold 6
      • Samsung Z fold 5
      • Samsung Z Fold 4
      • Samsung Z Fold 3
  • Samsung TAB models
  • Samsung TAB A series
  • Samsung TAB S Series
  • Samsung TAB E series
Browse Categories
  • Personal care, beauty and well-being
    • Hair dryer
    • Shaving and hair removal
Browse Categories
  • Huawei
    • Huawei P Models
      • Huawei P40 pro
      • Huawei P40 Lite
      • Huawei P40
      • Huawei P30 Pro
      • Huawei P30 Lite
      • Huawei P30
      • Huawei P20 Pro
      • Huawei P20 Lite 2019
      • Huawei P20 Lite
      • Huawei P20
      • Huawei P10 Lite
      • Huawei P10
      • Huawei P9 Lite
      • Huawei P9
      • Huawei P8 Lite
      • Huawei P8
      • Huawei P7
    • Huawei Mate Models
      • Huawei Mate 40 Pro
      • Huawei Mate 40
      • Huawei Mate 30 Pro
      • Huawei Mate 30 Lite
      • Huawei Mate 30
      • Huawei Mate 20 Pro
      • Huawei Mate 20 Lite
      • Huawei Mate 20
      • Huawei Mate 10 Pro
      • Huawei Mate 10 Lite
      • Huawei Mate 10
      • Huawei Mate 9 pro
      • Huawei Mate 9
      • Huawei Mate 8
      • Huawei Mate 7
    • Huawei P smart Models
      • Huawei P smart 2021
      • Huawei P smart 2020
      • Huawei P smart 2019
      • Huawei P smart pro
      • Huawei P smart Z
    • Huawei Honor Models
      • Huawei Honor 20 Pro
      • Huawei Honor 20 Lite
      • Huawei Honor View 20
      • Huawei Honor 20
      • Huawei Honor View 10
      • Huawei Honor 10
      • Huawei Honor 9
      • Huawei Honor 8 Lite
      • Huawei Honor 8
      • Huawei Honor 7
      • Huawei Honor 6
Browse Categories
  • Electronics
    • Headset , audio jack
    • Adapters
    • Cables
    • Car adapter , cables
    • Wirless charger
    • Bluetooth Speaker
    • HDMI , converter
    • Oudio Other
    • Gaming
    • Internet cables
    • Power bank
Browse Categories
  • Tempered Glass
    • OG tempered Glass
      • Iphone
      • Samsung
    • UV tempered Glass
      • Samsung
      • Huawei
    • Iphone camera Lens
    • Samsung camera lens
    • Ipad 3D
    • Samsung TAB
    • Apple Watch
    • Samsung watch
Browse Categories
  • Childeren toys
    • Car , Motor
Reparation
  • Home
  • Electronics
  • Mobile, tablet , smart watches
  • Repare Phone Price
  • Accessories
  • Tempered Glass
View cart “Iphone 13 Pro book case” has been added to your cart.
Click to enlarge
HomeMobile , Tablets AccessoriesHuaweiHuawei Mate ModelsHuawei Mate 20 Huawei Mate 20 book case
Previous product
Huawei mate 20 book case 299.00 kr
Back to products
Next product
Huawei mate 10 pro book case 299.00 kr

Huawei Mate 20 book case

299.00 kr

AMA book case  is the high-quality faux premuim case with built-in stand function and inside pockets for cards and documents.

inside of the case is silicone and it is not going broke when you lose your phone

It combines elegant colours and is equipped with a hard shell to ensure the stability and protection of your Smartphone.

Color

Brown

Huawei Mate series

Huawei mate 20

30 in stock

Compare
Add to wishlist
SKU: Kh49576488 Categories: AMA Book Case, Huawei, Huawei Mate 20, Huawei P Models, Huawei P40 Lite Tag: huawei mate 20
  • Description
  • Shipping & Delivery
Description

AMA book case  is the high-quality faux premuim case with built-in stand function and inside pockets for cards and documents.

inside of the case is silicone and it is not going broke when you lose your phone

It combines elegant colours and is equipped with a hard shell to ensure the stability and protection of your Smartphone.

Shipping & Delivery

MAECENAS IACULIS

Vestibulum curae torquent diam diam commodo parturient penatibus nunc dui adipiscing convallis bulum parturient suspendisse parturient a.Parturient in parturient scelerisque nibh lectus quam a natoque adipiscing a vestibulum hendrerit et pharetra fames nunc natoque dui.

ADIPISCING CONVALLIS BULUM

  • Vestibulum penatibus nunc dui adipiscing convallis bulum parturient suspendisse.
  • Abitur parturient praesent lectus quam a natoque adipiscing a vestibulum hendre.
  • Diam parturient dictumst parturient scelerisque nibh lectus.

Scelerisque adipiscing bibendum sem vestibulum et in a a a purus lectus faucibus lobortis tincidunt purus lectus nisl class eros.Condimentum a et ullamcorper dictumst mus et tristique elementum nam inceptos hac parturient scelerisque vestibulum amet elit ut volutpat.

Related products

Placeholder
Placeholder
Compare
Quick view
Add to wishlist
Close

Iphone 13 book case

26 left in stock
299.00 kr
Add to cart
Compare
Quick view
Add to wishlist
Close

Samsung A90 AMA book case

25 left in stock
299.00 kr
Add to cart
Placeholder
Placeholder
Compare
Quick view
Add to wishlist
Close

Iphone 13 Pro book case

28 left in stock
299.00 kr
Add to cart
Compare
Quick view
Add to wishlist
Close

Samsung S23 Ultra AMA book case

24 left in stock
299.00 kr
Add to cart
Compare
Quick view
Add to wishlist
Close

Samsung S23 AMA book case

17 left in stock
299.00 kr
Add to cart
Compare
Quick view
Add to wishlist
Close

Samsung A90 AMA book case

26 left in stock
299.00 kr
Add to cart
Compare
Quick view
Add to wishlist
Close

Samsung S23 Plus AMA book case

26 left in stock
299.00 kr
Add to cart
Compare
Quick view
Add to wishlist
Close

Samsung A90 AMA book case

25 left in stock
299.00 kr
Add to cart
Samsung
OG
Luxury clear magnetic
IDEAL OF SWEDEN
Hoco
Gorilla Anti-Shock
Fashion
Celly Hello world
BOROFONE
Apple
AMA Extra pas
AMA
Adidas

Vi startet reisen vår i 2017, da etterspørselen etter reparasjoner og reservedeler til mobiltelefoner og nettbrett økte betraktelig. Alibaba Telecom AS åpnet sin første butikk på AMFI sentrum i Larvik og videre åpnet nye avdelinger i forskjellige byer. Alibaba Telecom AS ble en av de største leverandøren i Norden, med et stort lager på mer enn 100 000 høykvalitetsprodukter. .

Storgata 107, 3921 Porsgrunn, Norway
Phone: (0047) 48473337
Phone: (0047) 41201616
Recent Posts
  • Protected: drammen
    December 12, 2022 No Comments
  • Protected: stathelle
    December 12, 2022 No Comments
Useful links
  • ALIBABA TELECOM
  • Electronics
  • Accessories
  • Contact Us
  • Abuot US
Footer Menu
  • Home
  • reparation
  • faq
  • Contact Us
  • abute us
  • Shop
Hinet.co 2022 All rights of this website belong to alibabatelecom
payments
  • Home
  • Electronics
  • Mobile, tablet , smart watches
  • Repare Phone Price
  • Accessories
  • Tempered Glass
Shopping cart
close
Select your currency
NOK Norwegian krone
USD United States (US) dollar
EUR Euro

Sign in

close

Lost your password?

No account yet?

Create an Account