/** * REST API: WP_REST_Attachments_Controller class * * @package WordPress * @subpackage REST_API * @since 4.7.0 */ /** * Core controller used to access attachments via the REST API. * * @since 4.7.0 * * @see WP_REST_Posts_Controller */ class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller { /** * Whether the controller supports batching. * * @since 5.9.0 * @var false */ protected $allow_batch = false; /** * Registers the routes for attachments. * * @since 5.3.0 * * @see register_rest_route() */ public function register_routes() { parent::register_routes(); register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/post-process', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'post_process_item' ), 'permission_callback' => array( $this, 'post_process_item_permissions_check' ), 'args' => array( 'id' => array( 'description' => __( 'Unique identifier for the attachment.' ), 'type' => 'integer', ), 'action' => array( 'type' => 'string', 'enum' => array( 'create-image-subsizes' ), 'required' => true, ), ), ) ); register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/edit', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'edit_media_item' ), 'permission_callback' => array( $this, 'edit_media_item_permissions_check' ), 'args' => $this->get_edit_media_item_args(), ) ); } /** * Determines the allowed query_vars for a get_items() response and * prepares for WP_Query. * * @since 4.7.0 * * @param array $prepared_args Optional. Array of prepared arguments. Default empty array. * @param WP_REST_Request $request Optional. Request to prepare items for. * @return array Array of query arguments. */ protected function prepare_items_query( $prepared_args = array(), $request = null ) { $query_args = parent::prepare_items_query( $prepared_args, $request ); if ( empty( $query_args['post_status'] ) ) { $query_args['post_status'] = 'inherit'; } $media_types = $this->get_media_types(); if ( ! empty( $request['media_type'] ) && isset( $media_types[ $request['media_type'] ] ) ) { $query_args['post_mime_type'] = $media_types[ $request['media_type'] ]; } if ( ! empty( $request['mime_type'] ) ) { $parts = explode( '/', $request['mime_type'] ); if ( isset( $media_types[ $parts[0] ] ) && in_array( $request['mime_type'], $media_types[ $parts[0] ], true ) ) { $query_args['post_mime_type'] = $request['mime_type']; } } // Filter query clauses to include filenames. if ( isset( $query_args['s'] ) ) { add_filter( 'wp_allow_query_attachment_by_filename', '__return_true' ); } return $query_args; } /** * Checks if a given request has access to create an attachment. * * @since 4.7.0 * * @param WP_REST_Request $request Full details about the request. * @return true|WP_Error Boolean true if the attachment may be created, or a WP_Error if not. */ public function create_item_permissions_check( $request ) { $ret = parent::create_item_permissions_check( $request ); if ( ! $ret || is_wp_error( $ret ) ) { return $ret; } if ( ! current_user_can( 'upload_files' ) ) { return new WP_Error( 'rest_cannot_create', __( 'Sorry, you are not allowed to upload media on this site.' ), array( 'status' => 400 ) ); } // Attaching media to a post requires ability to edit said post. if ( ! empty( $request['post'] ) && ! current_user_can( 'edit_post', (int) $request['post'] ) ) { return new WP_Error( 'rest_cannot_edit', __( 'Sorry, you are not allowed to upload media to this post.' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * Creates a single attachment. * * @since 4.7.0 * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure. */ public function create_item( $request ) { if ( ! empty( $request['post'] ) && in_array( get_post_type( $request['post'] ), array( 'revision', 'attachment' ), true ) ) { return new WP_Error( 'rest_invalid_param', __( 'Invalid parent type.' ), array( 'status' => 400 ) ); } $insert = $this->insert_attachment( $request ); if ( is_wp_error( $insert ) ) { return $insert; } $schema = $this->get_item_schema(); // Extract by name. $attachment_id = $insert['attachment_id']; $file = $insert['file']; if ( isset( $request['alt_text'] ) ) { update_post_meta( $attachment_id, '_wp_attachment_image_alt', sanitize_text_field( $request['alt_text'] ) ); } if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) { $thumbnail_update = $this->handle_featured_media( $request['featured_media'], $attachment_id ); if ( is_wp_error( $thumbnail_update ) ) { return $thumbnail_update; } } if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) { $meta_update = $this->meta->update_value( $request['meta'], $attachment_id ); if ( is_wp_error( $meta_update ) ) { return $meta_update; } } $attachment = get_post( $attachment_id ); $fields_update = $this->update_additional_fields_for_object( $attachment, $request ); if ( is_wp_error( $fields_update ) ) { return $fields_update; } $terms_update = $this->handle_terms( $attachment_id, $request ); if ( is_wp_error( $terms_update ) ) { return $terms_update; } $request->set_param( 'context', 'edit' ); /** * Fires after a single attachment is completely created or updated via the REST API. * * @since 5.0.0 * * @param WP_Post $attachment Inserted or updated attachment object. * @param WP_REST_Request $request Request object. * @param bool $creating True when creating an attachment, false when updating. */ do_action( 'rest_after_insert_attachment', $attachment, $request, true ); wp_after_insert_post( $attachment, false, null ); if ( wp_is_serving_rest_request() ) { /* * Set a custom header with the attachment_id. * Used by the browser/client to resume creating image sub-sizes after a PHP fatal error. */ header( 'X-WP-Upload-Attachment-ID: ' . $attachment_id ); } // Include media and image functions to get access to wp_generate_attachment_metadata(). require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; /* * Post-process the upload (create image sub-sizes, make PDF thumbnails, etc.) and insert attachment meta. * At this point the server may run out of resources and post-processing of uploaded images may fail. */ wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) ); $response = $this->prepare_item_for_response( $attachment, $request ); $response = rest_ensure_response( $response ); $response->set_status( 201 ); $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $attachment_id ) ) ); return $response; } /** * Inserts the attachment post in the database. Does not update the attachment meta. * * @since 5.3.0 * * @param WP_REST_Request $request * @return array|WP_Error */ protected function insert_attachment( $request ) { // Get the file via $_FILES or raw data. $files = $request->get_file_params(); $headers = $request->get_headers(); $time = null; // Matches logic in media_handle_upload(). if ( ! empty( $request['post'] ) ) { $post = get_post( $request['post'] ); // The post date doesn't usually matter for pages, so don't backdate this upload. if ( $post && 'page' !== $post->post_type && substr( $post->post_date, 0, 4 ) > 0 ) { $time = $post->post_date; } } if ( ! empty( $files ) ) { $file = $this->upload_from_file( $files, $headers, $time ); } else { $file = $this->upload_from_data( $request->get_body(), $headers, $time ); } if ( is_wp_error( $file ) ) { return $file; } $name = wp_basename( $file['file'] ); $name_parts = pathinfo( $name ); $name = trim( substr( $name, 0, -( 1 + strlen( $name_parts['extension'] ) ) ) ); $url = $file['url']; $type = $file['type']; $file = $file['file']; // Include image functions to get access to wp_read_image_metadata(). require_once ABSPATH . 'wp-admin/includes/image.php'; // Use image exif/iptc data for title and caption defaults if possible. $image_meta = wp_read_image_metadata( $file ); if ( ! empty( $image_meta ) ) { if ( empty( $request['title'] ) && trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { $request['title'] = $image_meta['title']; } if ( empty( $request['caption'] ) && trim( $image_meta['caption'] ) ) { $request['caption'] = $image_meta['caption']; } } $attachment = $this->prepare_item_for_database( $request ); $attachment->post_mime_type = $type; $attachment->guid = $url; // If the title was not set, use the original filename. if ( empty( $attachment->post_title ) && ! empty( $files['file']['name'] ) ) { // Remove the file extension (after the last `.`) $tmp_title = substr( $files['file']['name'], 0, strrpos( $files['file']['name'], '.' ) ); if ( ! empty( $tmp_title ) ) { $attachment->post_title = $tmp_title; } } // Fall back to the original approach. if ( empty( $attachment->post_title ) ) { $attachment->post_title = preg_replace( '/\.[^.]+$/', '', wp_basename( $file ) ); } // $post_parent is inherited from $attachment['post_parent']. $id = wp_insert_attachment( wp_slash( (array) $attachment ), $file, 0, true, false ); if ( is_wp_error( $id ) ) { if ( 'db_update_error' === $id->get_error_code() ) { $id->add_data( array( 'status' => 500 ) ); } else { $id->add_data( array( 'status' => 400 ) ); } return $id; } $attachment = get_post( $id ); /** * Fires after a single attachment is created or updated via the REST API. * * @since 4.7.0 * * @param WP_Post $attachment Inserted or updated attachment * object. * @param WP_REST_Request $request The request sent to the API. * @param bool $creating True when creating an attachment, false when updating. */ do_action( 'rest_insert_attachment', $attachment, $request, true ); return array( 'attachment_id' => $id, 'file' => $file, ); } /** * Determines the featured media based on a request param. * * @since 6.5.0 * * @param int $featured_media Featured Media ID. * @param int $post_id Post ID. * @return bool|WP_Error Whether the post thumbnail was successfully deleted, otherwise WP_Error. */ protected function handle_featured_media( $featured_media, $post_id ) { $post_type = get_post_type( $post_id ); $thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ); // Similar check as in wp_insert_post(). if ( ! $thumbnail_support && get_post_mime_type( $post_id ) ) { if ( wp_attachment_is( 'audio', $post_id ) ) { $thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' ); } elseif ( wp_attachment_is( 'video', $post_id ) ) { $thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' ); } } if ( $thumbnail_support ) { return parent::handle_featured_media( $featured_media, $post_id ); } return new WP_Error( 'rest_no_featured_media', sprintf( /* translators: %s: attachment mime type */ __( 'This site does not support post thumbnails on attachments with MIME type %s.' ), get_post_mime_type( $post_id ) ), array( 'status' => 400 ) ); } /** * Updates a single attachment. * * @since 4.7.0 * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure. */ public function update_item( $request ) { if ( ! empty( $request['post'] ) && in_array( get_post_type( $request['post'] ), array( 'revision', 'attachment' ), true ) ) { return new WP_Error( 'rest_invalid_param', __( 'Invalid parent type.' ), array( 'status' => 400 ) ); } $attachment_before = get_post( $request['id'] ); $response = parent::update_item( $request ); if ( is_wp_error( $response ) ) { return $response; } $response = rest_ensure_response( $response ); $data = $response->get_data(); if ( isset( $request['alt_text'] ) ) { update_post_meta( $data['id'], '_wp_attachment_image_alt', $request['alt_text'] ); } $attachment = get_post( $request['id'] ); if ( ! empty( $schema['properties']['featured_media'] ) && isset( $request['featured_media'] ) ) { $thumbnail_update = $this->handle_featured_media( $request['featured_media'], $attachment->ID ); if ( is_wp_error( $thumbnail_update ) ) { return $thumbnail_update; } } $fields_update = $this->update_additional_fields_for_object( $attachment, $request ); if ( is_wp_error( $fields_update ) ) { return $fields_update; } $request->set_param( 'context', 'edit' ); /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php */ do_action( 'rest_after_insert_attachment', $attachment, $request, false ); wp_after_insert_post( $attachment, true, $attachment_before ); $response = $this->prepare_item_for_response( $attachment, $request ); $response = rest_ensure_response( $response ); return $response; } /** * Performs post processing on an attachment. * * @since 5.3.0 * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure. */ public function post_process_item( $request ) { switch ( $request['action'] ) { case 'create-image-subsizes': require_once ABSPATH . 'wp-admin/includes/image.php'; wp_update_image_subsizes( $request['id'] ); break; } $request['context'] = 'edit'; return $this->prepare_item_for_response( get_post( $request['id'] ), $request ); } /** * Checks if a given request can perform post processing on an attachment. * * @since 5.3.0 * * @param WP_REST_Request $request Full details about the request. * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise. */ public function post_process_item_permissions_check( $request ) { return $this->update_item_permissions_check( $request ); } /** * Checks if a given request has access to editing media. * * @since 5.5.0 * * @param WP_REST_Request $request Full details about the request. * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function edit_media_item_permissions_check( $request ) { if ( ! current_user_can( 'upload_files' ) ) { return new WP_Error( 'rest_cannot_edit_image', __( 'Sorry, you are not allowed to upload media on this site.' ), array( 'status' => rest_authorization_required_code() ) ); } return $this->update_item_permissions_check( $request ); } /** * Applies edits to a media item and creates a new attachment record. * * @since 5.5.0 * * @param WP_REST_Request $request Full details about the request. * @return WP_REST_Response|WP_Error Response object on success, WP_Error object on failure. */ public function edit_media_item( $request ) { require_once ABSPATH . 'wp-admin/includes/image.php'; $attachment_id = $request['id']; // This also confirms the attachment is an image. $image_file = wp_get_original_image_path( $attachment_id ); $image_meta = wp_get_attachment_metadata( $attachment_id ); if ( ! $image_meta || ! $image_file || ! wp_image_file_matches_image_meta( $request['src'], $image_meta, $attachment_id ) ) { return new WP_Error( 'rest_unknown_attachment', __( 'Unable to get meta information for file.' ), array( 'status' => 404 ) ); } $supported_types = array( 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/avif' ); $mime_type = get_post_mime_type( $attachment_id ); if ( ! in_array( $mime_type, $supported_types, true ) ) { return new WP_Error( 'rest_cannot_edit_file_type', __( 'This type of file cannot be edited.' ), array( 'status' => 400 ) ); } // The `modifiers` param takes precedence over the older format. if ( isset( $request['modifiers'] ) ) { $modifiers = $request['modifiers']; } else { $modifiers = array(); if ( ! empty( $request['rotation'] ) ) { $modifiers[] = array( 'type' => 'rotate', 'args' => array( 'angle' => $request['rotation'], ), ); } if ( isset( $request['x'], $request['y'], $request['width'], $request['height'] ) ) { $modifiers[] = array( 'type' => 'crop', 'args' => array( 'left' => $request['x'], 'top' => $request['y'], 'width' => $request['width'], 'height' => $request['height'], ), ); } if ( 0 === count( $modifiers ) ) { return new WP_Error( 'rest_image_not_edited', __( 'The image was not edited. Edit the image before applying the changes.' ), array( 'status' => 400 ) ); } } /* * If the file doesn't exist, attempt a URL fopen on the src link. * This can occur with certain file replication plugins. * Keep the original file path to get a modified name later. */ $image_file_to_edit = $image_file; if ( ! file_exists( $image_file_to_edit ) ) { $image_file_to_edit = _load_image_to_edit_path( $attachment_id ); } $image_editor = wp_get_image_editor( $image_file_to_edit ); if ( is_wp_error( $image_editor ) ) { return new WP_Error( 'rest_unknown_image_file_type', __( 'Unable to edit this image.' ), array( 'status' => 500 ) ); } foreach ( $modifiers as $modifier ) { $args = $modifier['args']; switch ( $modifier['type'] ) { case 'rotate': // Rotation direction: clockwise vs. counter clockwise. $rotate = 0 - $args['angle']; if ( 0 !== $rotate ) { $result = $image_editor->rotate( $rotate ); if ( is_wp_error( $result ) ) { return new WP_Error( 'rest_image_rotation_failed', __( 'Unable to rotate this image.' ), array( 'status' => 500 ) ); } } break; case 'crop': $size = $image_editor->get_size(); $crop_x = (int) round( ( $size['width'] * $args['left'] ) / 100.0 ); $crop_y = (int) round( ( $size['height'] * $args['top'] ) / 100.0 ); $width = (int) round( ( $size['width'] * $args['width'] ) / 100.0 ); $height = (int) round( ( $size['height'] * $args['height'] ) / 100.0 ); if ( $size['width'] !== $width || $size['height'] !== $height ) { $result = $image_editor->crop( $crop_x, $crop_y, $width, $height ); if ( is_wp_error( $result ) ) { return new WP_Error( 'rest_image_crop_failed', __( 'Unable to crop this image.' ), array( 'status' => 500 ) ); } } break; } } // Calculate the file name. $image_ext = pathinfo( $image_file, PATHINFO_EXTENSION ); $image_name = wp_basename( $image_file, ".{$image_ext}" ); /* * Do not append multiple `-edited` to the file name. * The user may be editing a previously edited image. */ if ( preg_match( '/-edited(-\d+)?$/', $image_name ) ) { // Remove any `-1`, `-2`, etc. `wp_unique_filename()` will add the proper number. $image_name = preg_replace( '/-edited(-\d+)?$/', '-edited', $image_name ); } else { // Append `-edited` before the extension. $image_name .= '-edited'; } $filename = "{$image_name}.{$image_ext}"; // Create the uploads sub-directory if needed. $uploads = wp_upload_dir(); // Make the file name unique in the (new) upload directory. $filename = wp_unique_filename( $uploads['path'], $filename ); // Save to disk. $saved = $image_editor->save( $uploads['path'] . "/$filename" ); if ( is_wp_error( $saved ) ) { return $saved; } // Create new attachment post. $new_attachment_post = array( 'post_mime_type' => $saved['mime-type'], 'guid' => $uploads['url'] . "/$filename", 'post_title' => $image_name, 'post_content' => '', ); // Copy post_content, post_excerpt, and post_title from the edited image's attachment post. $attachment_post = get_post( $attachment_id ); if ( $attachment_post ) { $new_attachment_post['post_content'] = $attachment_post->post_content; $new_attachment_post['post_excerpt'] = $attachment_post->post_excerpt; $new_attachment_post['post_title'] = $attachment_post->post_title; } $new_attachment_id = wp_insert_attachment( wp_slash( $new_attachment_post ), $saved['path'], 0, true ); if ( is_wp_error( $new_attachment_id ) ) { if ( 'db_update_error' === $new_attachment_id->get_error_code() ) { $new_attachment_id->add_data( array( 'status' => 500 ) ); } else { $new_attachment_id->add_data( array( 'status' => 400 ) ); } return $new_attachment_id; } // Copy the image alt text from the edited image. $image_alt = get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ); if ( ! empty( $image_alt ) ) { // update_post_meta() expects slashed. update_post_meta( $new_attachment_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) ); } if ( wp_is_serving_rest_request() ) { /* * Set a custom header with the attachment_id. * Used by the browser/client to resume creating image sub-sizes after a PHP fatal error. */ header( 'X-WP-Upload-Attachment-ID: ' . $new_attachment_id ); } // Generate image sub-sizes and meta. $new_image_meta = wp_generate_attachment_metadata( $new_attachment_id, $saved['path'] ); // Copy the EXIF metadata from the original attachment if not generated for the edited image. if ( isset( $image_meta['image_meta'] ) && isset( $new_image_meta['image_meta'] ) && is_array( $new_image_meta['image_meta'] ) ) { // Merge but skip empty values. foreach ( (array) $image_meta['image_meta'] as $key => $value ) { if ( empty( $new_image_meta['image_meta'][ $key ] ) && ! empty( $value ) ) { $new_image_meta['image_meta'][ $key ] = $value; } } } // Reset orientation. At this point the image is edited and orientation is correct. if ( ! empty( $new_image_meta['image_meta']['orientation'] ) ) { $new_image_meta['image_meta']['orientation'] = 1; } // The attachment_id may change if the site is exported and imported. $new_image_meta['parent_image'] = array( 'attachment_id' => $attachment_id, // Path to the originally uploaded image file relative to the uploads directory. 'file' => _wp_relative_upload_path( $image_file ), ); /** * Filters the meta data for the new image created by editing an existing image. * * @since 5.5.0 * * @param array $new_image_meta Meta data for the new image. * @param int $new_attachment_id Attachment post ID for the new image. * @param int $attachment_id Attachment post ID for the edited (parent) image. */ $new_image_meta = apply_filters( 'wp_edited_image_metadata', $new_image_meta, $new_attachment_id, $attachment_id ); wp_update_attachment_metadata( $new_attachment_id, $new_image_meta ); $response = $this->prepare_item_for_response( get_post( $new_attachment_id ), $request ); $response->set_status( 201 ); $response->header( 'Location', rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $new_attachment_id ) ) ); return $response; } /** * Prepares a single attachment for create or update. * * @since 4.7.0 * * @param WP_REST_Request $request Request object. * @return stdClass|WP_Error Post object. */ protected function prepare_item_for_database( $request ) { $prepared_attachment = parent::prepare_item_for_database( $request ); // Attachment caption (post_excerpt internally). if ( isset( $request['caption'] ) ) { if ( is_string( $request['caption'] ) ) { $prepared_attachment->post_excerpt = $request['caption']; } elseif ( isset( $request['caption']['raw'] ) ) { $prepared_attachment->post_excerpt = $request['caption']['raw']; } } // Attachment description (post_content internally). if ( isset( $request['description'] ) ) { if ( is_string( $request['description'] ) ) { $prepared_attachment->post_content = $request['description']; } elseif ( isset( $request['description']['raw'] ) ) { $prepared_attachment->post_content = $request['description']['raw']; } } if ( isset( $request['post'] ) ) { $prepared_attachment->post_parent = (int) $request['post']; } return $prepared_attachment; } /** * Prepares a single attachment output for response. * * @since 4.7.0 * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support. * * @param WP_Post $item Attachment 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. $post = $item; $response = parent::prepare_item_for_response( $post, $request ); $fields = $this->get_fields_for_response( $request ); $data = $response->get_data(); if ( in_array( 'description', $fields, true ) ) { $data['description'] = array( 'raw' => $post->post_content, /** This filter is documented in wp-includes/post-template.php */ 'rendered' => apply_filters( 'the_content', $post->post_content ), ); } if ( in_array( 'caption', $fields, true ) ) { /** This filter is documented in wp-includes/post-template.php */ $caption = apply_filters( 'get_the_excerpt', $post->post_excerpt, $post ); /** This filter is documented in wp-includes/post-template.php */ $caption = apply_filters( 'the_excerpt', $caption ); $data['caption'] = array( 'raw' => $post->post_excerpt, 'rendered' => $caption, ); } if ( in_array( 'alt_text', $fields, true ) ) { $data['alt_text'] = get_post_meta( $post->ID, '_wp_attachment_image_alt', true ); } if ( in_array( 'media_type', $fields, true ) ) { $data['media_type'] = wp_attachment_is_image( $post->ID ) ? 'image' : 'file'; } if ( in_array( 'mime_type', $fields, true ) ) { $data['mime_type'] = $post->post_mime_type; } if ( in_array( 'media_details', $fields, true ) ) { $data['media_details'] = wp_get_attachment_metadata( $post->ID ); // Ensure empty details is an empty object. if ( empty( $data['media_details'] ) ) { $data['media_details'] = new stdClass(); } elseif ( ! empty( $data['media_details']['sizes'] ) ) { foreach ( $data['media_details']['sizes'] as $size => &$size_data ) { if ( isset( $size_data['mime-type'] ) ) { $size_data['mime_type'] = $size_data['mime-type']; unset( $size_data['mime-type'] ); } // Use the same method image_downsize() does. $image_src = wp_get_attachment_image_src( $post->ID, $size ); if ( ! $image_src ) { continue; } $size_data['source_url'] = $image_src[0]; } $full_src = wp_get_attachment_image_src( $post->ID, 'full' ); if ( ! empty( $full_src ) ) { $data['media_details']['sizes']['full'] = array( 'file' => wp_basename( $full_src[0] ), 'width' => $full_src[1], 'height' => $full_src[2], 'mime_type' => $post->post_mime_type, 'source_url' => $full_src[0], ); } } else { $data['media_details']['sizes'] = new stdClass(); } } if ( in_array( 'post', $fields, true ) ) { $data['post'] = ! empty( $post->post_parent ) ? (int) $post->post_parent : null; } if ( in_array( 'source_url', $fields, true ) ) { $data['source_url'] = wp_get_attachment_url( $post->ID ); } if ( in_array( 'missing_image_sizes', $fields, true ) ) { require_once ABSPATH . 'wp-admin/includes/image.php'; $data['missing_image_sizes'] = array_keys( wp_get_missing_image_subsizes( $post->ID ) ); } $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; $data = $this->filter_response_by_context( $data, $context ); $links = $response->get_links(); // Wrap the data in a response object. $response = rest_ensure_response( $data ); foreach ( $links as $rel => $rel_links ) { foreach ( $rel_links as $link ) { $response->add_link( $rel, $link['href'], $link['attributes'] ); } } /** * Filters an attachment returned from the REST API. * * Allows modification of the attachment right before it is returned. * * @since 4.7.0 * * @param WP_REST_Response $response The response object. * @param WP_Post $post The original attachment post. * @param WP_REST_Request $request Request used to generate the response. */ return apply_filters( 'rest_prepare_attachment', $response, $post, $request ); } /** * Retrieves the attachment's schema, conforming to JSON Schema. * * @since 4.7.0 * * @return array Item schema as an array. */ public function get_item_schema() { if ( $this->schema ) { return $this->add_additional_fields_schema( $this->schema ); } $schema = parent::get_item_schema(); $schema['properties']['alt_text'] = array( 'description' => __( 'Alternative text to display when attachment is not displayed.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ); $schema['properties']['caption'] = array( 'description' => __( 'The attachment caption.' ), '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' => __( 'Caption for the attachment, as it exists in the database.' ), 'type' => 'string', 'context' => array( 'edit' ), ), 'rendered' => array( 'description' => __( 'HTML caption for the attachment, transformed for display.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ), ), ); $schema['properties']['description'] = array( 'description' => __( 'The attachment description.' ), 'type' => 'object', 'context' => array( 'view', 'edit' ), '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' => __( 'Description for the attachment, as it exists in the database.' ), 'type' => 'string', 'context' => array( 'edit' ), ), 'rendered' => array( 'description' => __( 'HTML description for the attachment, transformed for display.' ), 'type' => 'string', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), ), ); $schema['properties']['media_type'] = array( 'description' => __( 'Attachment type.' ), 'type' => 'string', 'enum' => array( 'image', 'file' ), 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ); $schema['properties']['mime_type'] = array( 'description' => __( 'The attachment MIME type.' ), 'type' => 'string', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ); $schema['properties']['media_details'] = array( 'description' => __( 'Details about the media file, specific to its type.' ), 'type' => 'object', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ); $schema['properties']['post'] = array( 'description' => __( 'The ID for the associated post of the attachment.' ), 'type' => 'integer', 'context' => array( 'view', 'edit' ), ); $schema['properties']['source_url'] = array( 'description' => __( 'URL to the original attachment file.' ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'view', 'edit', 'embed' ), 'readonly' => true, ); $schema['properties']['missing_image_sizes'] = array( 'description' => __( 'List of the missing image sizes of the attachment.' ), 'type' => 'array', 'items' => array( 'type' => 'string' ), 'context' => array( 'edit' ), 'readonly' => true, ); unset( $schema['properties']['password'] ); $this->schema = $schema; return $this->add_additional_fields_schema( $this->schema ); } /** * Handles an upload via raw POST data. * * @since 4.7.0 * @since 6.6.0 Added the `$time` parameter. * * @param string $data Supplied file data. * @param array $headers HTTP headers from the request. * @param string|null $time Optional. Time formatted in 'yyyy/mm'. Default null. * @return array|WP_Error Data from wp_handle_sideload(). */ protected function upload_from_data( $data, $headers, $time = null ) { if ( empty( $data ) ) { return new WP_Error( 'rest_upload_no_data', __( 'No data supplied.' ), array( 'status' => 400 ) ); } if ( empty( $headers['content_type'] ) ) { return new WP_Error( 'rest_upload_no_content_type', __( 'No Content-Type supplied.' ), array( 'status' => 400 ) ); } if ( empty( $headers['content_disposition'] ) ) { return new WP_Error( 'rest_upload_no_content_disposition', __( 'No Content-Disposition supplied.' ), array( 'status' => 400 ) ); } $filename = self::get_filename_from_disposition( $headers['content_disposition'] ); if ( empty( $filename ) ) { return new WP_Error( 'rest_upload_invalid_disposition', __( 'Invalid Content-Disposition supplied. Content-Disposition needs to be formatted as `attachment; filename="image.png"` or similar.' ), array( 'status' => 400 ) ); } if ( ! empty( $headers['content_md5'] ) ) { $content_md5 = array_shift( $headers['content_md5'] ); $expected = trim( $content_md5 ); $actual = md5( $data ); if ( $expected !== $actual ) { return new WP_Error( 'rest_upload_hash_mismatch', __( 'Content hash did not match expected.' ), array( 'status' => 412 ) ); } } // Get the content-type. $type = array_shift( $headers['content_type'] ); // Include filesystem functions to get access to wp_tempnam() and wp_handle_sideload(). require_once ABSPATH . 'wp-admin/includes/file.php'; // Save the file. $tmpfname = wp_tempnam( $filename ); $fp = fopen( $tmpfname, 'w+' ); if ( ! $fp ) { return new WP_Error( 'rest_upload_file_error', __( 'Could not open file handle.' ), array( 'status' => 500 ) ); } fwrite( $fp, $data ); fclose( $fp ); // Now, sideload it in. $file_data = array( 'error' => null, 'tmp_name' => $tmpfname, 'name' => $filename, 'type' => $type, ); $size_check = self::check_upload_size( $file_data ); if ( is_wp_error( $size_check ) ) { return $size_check; } $overrides = array( 'test_form' => false, ); $sideloaded = wp_handle_sideload( $file_data, $overrides, $time ); if ( isset( $sideloaded['error'] ) ) { @unlink( $tmpfname ); return new WP_Error( 'rest_upload_sideload_error', $sideloaded['error'], array( 'status' => 500 ) ); } return $sideloaded; } /** * Parses filename from a Content-Disposition header value. * * As per RFC6266: * * content-disposition = "Content-Disposition" ":" * disposition-type *( ";" disposition-parm ) * * disposition-type = "inline" | "attachment" | disp-ext-type * ; case-insensitive * disp-ext-type = token * * disposition-parm = filename-parm | disp-ext-parm * * filename-parm = "filename" "=" value * | "filename*" "=" ext-value * * disp-ext-parm = token "=" value * | ext-token "=" ext-value * ext-token = * * @since 4.7.0 * * @link https://tools.ietf.org/html/rfc2388 * @link https://tools.ietf.org/html/rfc6266 * * @param string[] $disposition_header List of Content-Disposition header values. * @return string|null Filename if available, or null if not found. */ public static function get_filename_from_disposition( $disposition_header ) { // Get the filename. $filename = null; foreach ( $disposition_header as $value ) { $value = trim( $value ); if ( ! str_contains( $value, ';' ) ) { continue; } list( $type, $attr_parts ) = explode( ';', $value, 2 ); $attr_parts = explode( ';', $attr_parts ); $attributes = array(); foreach ( $attr_parts as $part ) { if ( ! str_contains( $part, '=' ) ) { continue; } list( $key, $value ) = explode( '=', $part, 2 ); $attributes[ trim( $key ) ] = trim( $value ); } if ( empty( $attributes['filename'] ) ) { continue; } $filename = trim( $attributes['filename'] ); // Unquote quoted filename, but after trimming. if ( str_starts_with( $filename, '"' ) && str_ends_with( $filename, '"' ) ) { $filename = substr( $filename, 1, -1 ); } } return $filename; } /** * Retrieves the query params for collections of attachments. * * @since 4.7.0 * * @return array Query parameters for the attachment collection as an array. */ public function get_collection_params() { $params = parent::get_collection_params(); $params['status']['default'] = 'inherit'; $params['status']['items']['enum'] = array( 'inherit', 'private', 'trash' ); $media_types = $this->get_media_types(); $params['media_type'] = array( 'default' => null, 'description' => __( 'Limit result set to attachments of a particular media type.' ), 'type' => 'string', 'enum' => array_keys( $media_types ), ); $params['mime_type'] = array( 'default' => null, 'description' => __( 'Limit result set to attachments of a particular MIME type.' ), 'type' => 'string', ); return $params; } /** * Handles an upload via multipart/form-data ($_FILES). * * @since 4.7.0 * @since 6.6.0 Added the `$time` parameter. * * @param array $files Data from the `$_FILES` superglobal. * @param array $headers HTTP headers from the request. * @param string|null $time Optional. Time formatted in 'yyyy/mm'. Default null. * @return array|WP_Error Data from wp_handle_upload(). */ protected function upload_from_file( $files, $headers, $time = null ) { if ( empty( $files ) ) { return new WP_Error( 'rest_upload_no_data', __( 'No data supplied.' ), array( 'status' => 400 ) ); } // Verify hash, if given. if ( ! empty( $headers['content_md5'] ) ) { $content_md5 = array_shift( $headers['content_md5'] ); $expected = trim( $content_md5 ); $actual = md5_file( $files['file']['tmp_name'] ); if ( $expected !== $actual ) { return new WP_Error( 'rest_upload_hash_mismatch', __( 'Content hash did not match expected.' ), array( 'status' => 412 ) ); } } // Pass off to WP to handle the actual upload. $overrides = array( 'test_form' => false, ); // Bypasses is_uploaded_file() when running unit tests. if ( defined( 'DIR_TESTDATA' ) && DIR_TESTDATA ) { $overrides['action'] = 'wp_handle_mock_upload'; } $size_check = self::check_upload_size( $files['file'] ); if ( is_wp_error( $size_check ) ) { return $size_check; } // Include filesystem functions to get access to wp_handle_upload(). require_once ABSPATH . 'wp-admin/includes/file.php'; $file = wp_handle_upload( $files['file'], $overrides, $time ); if ( isset( $file['error'] ) ) { return new WP_Error( 'rest_upload_unknown_error', $file['error'], array( 'status' => 500 ) ); } return $file; } /** * Retrieves the supported media types. * * Media types are considered the MIME type category. * * @since 4.7.0 * * @return array Array of supported media types. */ protected function get_media_types() { $media_types = array(); foreach ( get_allowed_mime_types() as $mime_type ) { $parts = explode( '/', $mime_type ); if ( ! isset( $media_types[ $parts[0] ] ) ) { $media_types[ $parts[0] ] = array(); } $media_types[ $parts[0] ][] = $mime_type; } return $media_types; } /** * Determine if uploaded file exceeds space quota on multisite. * * Replicates check_upload_size(). * * @since 4.9.8 * * @param array $file $_FILES array for a given file. * @return true|WP_Error True if can upload, error for errors. */ protected function check_upload_size( $file ) { if ( ! is_multisite() ) { return true; } if ( get_site_option( 'upload_space_check_disabled' ) ) { return true; } $space_left = get_upload_space_available(); $file_size = filesize( $file['tmp_name'] ); if ( $space_left < $file_size ) { return new WP_Error( 'rest_upload_limited_space', /* translators: %s: Required disk space in kilobytes. */ sprintf( __( 'Not enough space to upload. %s KB needed.' ), number_format( ( $file_size - $space_left ) / KB_IN_BYTES ) ), array( 'status' => 400 ) ); } if ( $file_size > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) { return new WP_Error( 'rest_upload_file_too_big', /* translators: %s: Maximum allowed file size in kilobytes. */ sprintf( __( 'This file is too big. Files must be less than %s KB in size.' ), get_site_option( 'fileupload_maxk', 1500 ) ), array( 'status' => 400 ) ); } // Include multisite admin functions to get access to upload_is_user_over_quota(). require_once ABSPATH . 'wp-admin/includes/ms.php'; if ( upload_is_user_over_quota( false ) ) { return new WP_Error( 'rest_upload_user_quota_exceeded', __( 'You have used your space quota. Please delete files before uploading.' ), array( 'status' => 400 ) ); } return true; } /** * Gets the request args for the edit item route. * * @since 5.5.0 * * @return array */ protected function get_edit_media_item_args() { return array( 'src' => array( 'description' => __( 'URL to the edited image file.' ), 'type' => 'string', 'format' => 'uri', 'required' => true, ), 'modifiers' => array( 'description' => __( 'Array of image edits.' ), 'type' => 'array', 'minItems' => 1, 'items' => array( 'description' => __( 'Image edit.' ), 'type' => 'object', 'required' => array( 'type', 'args', ), 'oneOf' => array( array( 'title' => __( 'Rotation' ), 'properties' => array( 'type' => array( 'description' => __( 'Rotation type.' ), 'type' => 'string', 'enum' => array( 'rotate' ), ), 'args' => array( 'description' => __( 'Rotation arguments.' ), 'type' => 'object', 'required' => array( 'angle', ), 'properties' => array( 'angle' => array( 'description' => __( 'Angle to rotate clockwise in degrees.' ), 'type' => 'number', ), ), ), ), ), array( 'title' => __( 'Crop' ), 'properties' => array( 'type' => array( 'description' => __( 'Crop type.' ), 'type' => 'string', 'enum' => array( 'crop' ), ), 'args' => array( 'description' => __( 'Crop arguments.' ), 'type' => 'object', 'required' => array( 'left', 'top', 'width', 'height', ), 'properties' => array( 'left' => array( 'description' => __( 'Horizontal position from the left to begin the crop as a percentage of the image width.' ), 'type' => 'number', ), 'top' => array( 'description' => __( 'Vertical position from the top to begin the crop as a percentage of the image height.' ), 'type' => 'number', ), 'width' => array( 'description' => __( 'Width of the crop as a percentage of the image width.' ), 'type' => 'number', ), 'height' => array( 'description' => __( 'Height of the crop as a percentage of the image height.' ), 'type' => 'number', ), ), ), ), ), ), ), ), 'rotation' => array( 'description' => __( 'The amount to rotate the image clockwise in degrees. DEPRECATED: Use `modifiers` instead.' ), 'type' => 'integer', 'minimum' => 0, 'exclusiveMinimum' => true, 'maximum' => 360, 'exclusiveMaximum' => true, ), 'x' => array( 'description' => __( 'As a percentage of the image, the x position to start the crop from. DEPRECATED: Use `modifiers` instead.' ), 'type' => 'number', 'minimum' => 0, 'maximum' => 100, ), 'y' => array( 'description' => __( 'As a percentage of the image, the y position to start the crop from. DEPRECATED: Use `modifiers` instead.' ), 'type' => 'number', 'minimum' => 0, 'maximum' => 100, ), 'width' => array( 'description' => __( 'As a percentage of the image, the width to crop the image to. DEPRECATED: Use `modifiers` instead.' ), 'type' => 'number', 'minimum' => 0, 'maximum' => 100, ), 'height' => array( 'description' => __( 'As a percentage of the image, the height to crop the image to. DEPRECATED: Use `modifiers` instead.' ), 'type' => 'number', 'minimum' => 0, 'maximum' => 100, ), ); } } 纳玛瓦利 – Sanathan Dharm Veda https://sanatandharmveda.com Sun, 03 Nov 2024 10:52:51 +0000 en-US hourly 1 https://wordpress.org/?v=6.6.5 https://sanatandharmveda.com/wp-content/uploads/2024/05/cropped-cropped-pexels-himeshmehtaa25-3519190-32x32.jpg 纳玛瓦利 – Sanathan Dharm Veda https://sanatandharmveda.com 32 32 苏布拉马尼亚·阿什托塔拉·萨塔·纳马瓦利 https://sanatandharmveda.com/%e8%8b%8f%e5%b8%83%e6%8b%89%e9%a9%ac%e5%b0%bc%e4%ba%9a%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e8%90%a8%e5%a1%94%c2%b7%e7%ba%b3%e9%a9%ac%e7%93%a6%e5%88%a9/ https://sanatandharmveda.com/%e8%8b%8f%e5%b8%83%e6%8b%89%e9%a9%ac%e5%b0%bc%e4%ba%9a%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e8%90%a8%e5%a1%94%c2%b7%e7%ba%b3%e9%a9%ac%e7%93%a6%e5%88%a9/#respond Sat, 02 Nov 2024 07:01:55 +0000 https://sanatandharmveda.com/?p=6510 苏布拉马尼亚·阿什托塔拉·萨塔·纳马瓦利

《苏布拉马尼亚阿什托塔拉萨塔纳玛瓦利》是一首献给苏布拉马尼亚神(又名穆鲁甘、卡尔提克亚或斯坎达)的赞美诗,包含 108 个名字,颂扬他的神圣属性、美德和力量。人们相信虔诚地念诵这些名字可以祈求他的祝福,保护人们远离负面情绪,并带来力量和勇气。

苏布拉马尼亚·阿什托塔拉·萨塔·纳马瓦利是一部敬奉苏布拉马尼亚神(也称为穆尔甘、卡尔提克耶或斯坎达)的受人尊敬的108个名字的列表。苏布拉马尼亚被尊崇为湿婆神和帕尔瓦蒂女神的儿子。苏布拉马尼亚神通常被描绘为一位年轻、勇敢而光辉的神灵,体现了力量、智慧和纯洁。这个名字串(名称的花环)中的每个名字都强调了这位神灵的独特品质、特征或成就,使其成为信徒强有力的虔诚诵念。

Subrahmanya Swamy

名字的意义

苏布拉马尼亚·阿什托塔拉·萨塔·纳马瓦利中的每个名字都指代了苏布拉马尼亚神的神圣个性和他在宇宙中的角色的独特方面。例如,斯坎达描绘自己为一位与邪恶势力作斗争的战士。

善穆卡的六个面孔代表着在六个方向上的绝对智慧和保护。

古哈(Guhaya)指的是他的隐秘、隐蔽的举止,因为“古哈”意为“洞穴”或“秘密”。

石基瓦哈那(Shikhivahana)强调了他与孔雀的联系,象征着骄傲和自我的消灭。

这些名字还涉及到他的关系,例如法拉内特拉·苏塔(Phalanetra Suta,三眼湿婆之子)和乌玛·苏塔(Uma Suta,乌玛或帕尔瓦蒂之子),展现了他深厚的家庭纽带,强调了他在神圣家庭中的地位。

诵读《阿什托塔拉·萨塔·纳马瓦利》的好处

信徒们相信,吟诵或冥想这 108 个名字可以:

激发勇气和力量:作为一位战士神,苏布拉马尼亚神赐予人们克服恐惧和面对挑战的勇气。

净化身心:许多名字颂扬着他的纯洁和美德,吟诵这些名字可以促进内心的洁净和纪律。

  1. Om 斯坎达耶
    Om 古哈耶
    Om 珊穆卡耶
    Om 法拉内特拉苏塔耶
    Om 普拉巴韦
    Om 平伽拉耶
    Om 克里蒂卡苏纳维
    Om 西基维哈那耶
    Om 双眼特拉耶
    Om 加贾那那耶

  1. Om 十二手耶
    Om 力量持有者耶
    Om 星星之母耶
    Om 乌玛之子耶
    Om 勇敢者耶
    Om 知识赐予者耶
    Om 孙子耶
    Om 二手耶
    Om 斯瓦米纳塔耶
    Om 风之神耶

  1. Om 母亲之信徒耶
    Om 灰烬之神耶
    Om 沙拉瓦诺德巴瓦耶
    Om 圣洁化身耶
    Om 大力量者耶
    Om 福德持有者耶
    Om 布拉赫曼耶
    Om 师父耶
    Om 神之主耶
    Om 所有神灵之赞美者耶

  1. Om 信徒之主耶
    Om 乌玛之子耶
    Om 力量之承载者耶
    Om 瓦利苏那瓦尔耶
    Om 火焰之生者耶
    Om 毗沙卡耶
    Om 声音之主耶
    Om 时间之主耶
    Om 信徒所愿之给予者耶
    Om 库马拉导师耶

  1. Om 完全充实者耶
    Om 帕尔瓦蒂之爱子耶
    Om 古鲁古哈耶
    Om 诸灵之主耶
    Om 苏布拉马尼亚耶
    Om 超越者耶
    Om 布尔维奇尼什瓦拉之兄弟耶
    Om 所有知识的智者耶
    Om 安全之源耶
    Om 永恒果实之给予者耶

  1. Om 四臂者耶
    Om 四面者耶
    Om 施予者耶
    Om 自然者耶
    Om 施予幸福者耶
    Om 瓦萨耶
    Om 驱使者耶
    Om 梵天耶
    Om 永恒快乐者耶
    Om 至高灵魂耶

  1. Om 纯净者耶
    Om 智慧赐予者耶
    Om 智者者耶
    Om 伟大者耶
    Om 勇敢者耶
    Om 被崇敬的勇者耶
    Om 坚韧者耶
    Om 慈悲者耶
    Om 喜悦者耶
    Om 贤者耶

  1. Om 罗刹结束者耶
    Om 众神之主耶
    Om 经典讲述者耶
    Om 吠陀与吠陀附属者耶
    Om 太阳系中心者耶
    Om 与黑暗结合的太阳光辉者耶
    Om 大鲁德拉之象征耶
    Om 经典与记忆之保佑者耶
    Om 成就万物者耶
    Om 圣者珊穆卡耶

  1. Om 成就意愿者耶
    Om 孙子之爱者耶
    Om 诸神之言耶
    Om 神秘目光者耶
    Om 无所不见者耶
    Om 威猛光辉者耶
    Om 形象多变者耶
    Om 黑暗之主耶
    Om 轮回之光辉者耶
    Om 持叉者耶

  1. Om 持杵者耶
    Om 幸运者耶
    Om 愤怒化身者耶
    Om 众生所爱者耶
    Om 财富之主耶
    Om 具有美德者耶
    Om 无所不见者耶
    Om 各种经典知识者耶
    Om 言语之力者耶
    Om 秘密之者耶

  1. Om 苏加拉耶
    Om 巴拉耶
    Om 瓦塔维加耶
    Om 布贾安加布希沙耶
    Om 玛哈巴拉耶
    Om 信仰保护者耶
    Om 穆尼什瓦耶
    Om 梵天的光辉耶

诵读这些名字是一种强有力的崇拜形式,可以召唤苏布拉马尼亚神的祝福和保护。如果您希望以特定格式将这些内容添加到您的网站,或者需要关于《名录》的其他帮助,请告诉我。

### 崇拜中的使用:

在苏布拉马尼亚的普贾或像泰普萨姆这样的节日中,信徒们吟诵《阿什托塔拉·萨塔·纳马瓦利》以敬奉和寻求神灵的祝福。这种诵读也可以成为一种日常的修行,尤其是在星期二,这一天对穆鲁甘神是神圣的。通过献花、点灯或在吟诵每个名字时冥想每个属性,可以进一步增强这种实践。

《阿什托塔拉·萨塔·纳马瓦利》为信徒们提供了一种美好的方式来与苏布拉马尼亚的本质相连接,激励他们在生活中体现勇气、正义和智慧的品质。

]]>
https://sanatandharmveda.com/%e8%8b%8f%e5%b8%83%e6%8b%89%e9%a9%ac%e5%b0%bc%e4%ba%9a%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e8%90%a8%e5%a1%94%c2%b7%e7%ba%b3%e9%a9%ac%e7%93%a6%e5%88%a9/feed/ 0
哈努曼的 108 个名字 – 哈努曼·阿什托塔拉·沙塔纳玛瓦利 https://sanatandharmveda.com/%e5%93%88%e5%8a%aa%e6%9b%bc%e7%9a%84-108-%e4%b8%aa%e5%90%8d%e5%ad%97-%e5%93%88%e5%8a%aa%e6%9b%bc%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e6%b2%99%e5%a1%94%e7%ba%b3%e7%8e%9b/ https://sanatandharmveda.com/%e5%93%88%e5%8a%aa%e6%9b%bc%e7%9a%84-108-%e4%b8%aa%e5%90%8d%e5%ad%97-%e5%93%88%e5%8a%aa%e6%9b%bc%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e6%b2%99%e5%a1%94%e7%ba%b3%e7%8e%9b/#respond Fri, 25 Oct 2024 15:17:44 +0000 https://sanatandharmveda.com/?p=6000 哈努曼的 108 个名字 – 哈努曼·阿什托塔拉·沙塔纳玛瓦利

哈努曼·阿什托塔拉·沙塔纳玛瓦利


Hanuman Ashtottara Shatanamavali

哈努曼吟诵

哈努曼的名字为信徒提供了一个赋权渠道,使他们能够与他非凡的毅力和决心建立联系,从而面对和克服挑战。

他的存在是建设性鼓励的源泉,培养了坚定的信念、奉献精神和对持久原则的承诺所产生的力量。

这些名字突出了哈努曼阿什托塔拉·沙塔纳玛瓦利的各种属性——智慧、勇敢、忠诚和同情心——邀请信徒在自己的生活中培养这些美德。

精神意义:念诵这些名字为信徒提供了一条通往和平、力量和保护的道路。这种做法是仪式、祈祷和个人冥想不可或缺的一部分。

属性:这些名字颂扬了哈努曼的多种品质,提醒信徒在日常生活中积极努力体现这些美德。

1. 唵 阿贾尼亚 南摩
2. 唵 玛哈维尔 南摩
3. 唵 哈努马特 南摩
4. 唵 马鲁塔塔玛贾亚 南摩
5. 唵 达特瓦知识 赐予者 南摩
6. 唵 西塔女神 印信 赐予者 南摩
7. 唵 阿索卡森林 处 南摩
8. 唵 所有幻影 造访者 南摩
9. 唵 所有束缚 解脱者 南摩
10. 唵 保护者 学者 南摩

11. 唵 般维迪亚-普里哈拉亚 南摩
12. 唵 帕拉索维亚 毁灭南摩
13. 唵 帕拉曼特拉 尼拉卡尔特雷 南摩
14. 唵 帕拉延特拉 普拉贝德哈卡亚 南摩
15. 唵 萨尔瓦格拉哈 毁灭南摩
16. 唵 毕玛森娜 帮助者 南摩
17. 唵 萨尔瓦杜卡 哈拉亚 南摩
18. 唵 萨尔瓦洛卡 查林娜 南摩
19. 唵 玛诺贾瓦亚 南摩
20. 唵 帕里贾塔-杜鲁姆尔斯塔亚 南摩

21. 唵 所有咒语 体现者 南摩
22. 唵 所有教义 体现者 南摩
23. 唵 所有工具 本质者 南摩
24. 唵 猴王 南摩
25. 唵 大身 南摩
26. 唵 所有疾病 消除者 南摩
27. 唵 主人 南摩
28. 唵 小孩的成功 赐予者 南摩
29. 唵 所有知识 财富 赐予者 南摩
30. 唵 猴军 队长 南摩

31. 唵 未来的四面者 南摩
32. 唵 小男孩 学者 南摩
33. 唵 宝石耳环 光辉者 南摩
34. 唵 持有移动之火 灯光闪耀者 南摩
35. 唵 幻术知识 真理者 南摩
36. 唵 伟大的力量 勇士 南摩
37. 唵 监狱中 解脱者 南摩
38. 唵 莎姆卡拉的束缚 解脱者 南摩
39. 唵 海的主宰 南摩
40. 唵 智慧者 南摩

41. 唵 拉玛的使者 南摩
42. 唵 荣耀者 南摩
43. 唵 猴子 南摩
44. 唵 凯萨里的儿子 南摩
45. 唵 解救西塔痛苦者 南摩
46. 唵 从安贞娜的子嗣 南摩
47. 唵 如太阳般明亮者 南摩
48. 唵 吸引维比萨那的 南摩
49. 唵 杀死十头蛇的 南摩
50. 唵 拉克什曼的生命赐予者 南摩

51. 唵 金刚的化身 南摩
52. 唵 大光明者 南摩
53. 唵 长生者 南摩
54. 唵 拉玛的信徒 南摩
55. 唵 消灭恶鬼的 南摩
56. 唵 不可摧毁者 南摩
57. 唵 黄金般的南摩
58. 唵 五面相的南摩
59. 唵 大修行者 南摩
60. 唵 摧毁兰卡的 南摩

61. 唵 尊贵者 南摩
62. 唵 狮子的生命毁灭者 南摩
63. 唵 甘达马达那山的 南摩
64. 唵 兰卡之毁灭者 南摩
65. 唵 苏格里瓦的顾问 南摩
66. 唵 勇敢者 南摩
67. 唵 太阳 南摩
68. 唵 消灭恶鬼的 南摩
69. 唵 被神灵崇拜的 南摩
70. 唵 大光辉者 南摩

71. 唵 拉玛珠宝给予者 南摩
72. 唵 恋爱化身者 南摩
73. 唵 媚眼者 南摩
74. 唵 尊贵的玛纳卡神 南摩
75. 唵 被卡巴利所庇护的日轮 南摩
76. 唵 胜利掌控者 南摩
77. 唵 拉玛与苏格里瓦的合一者 南摩
78. 唵 玛希拉瓦那的消灭者 南摩
79. 唵 透明者 南摩
80. 唵 语言之神 南摩

81. 唵 新颖智慧者 南摩
82. 唵 四方神 南摩
83. 唵 可怜之人 南摩
84. 唵 伟大者 南摩
85. 唵 信徒的宠爱者 南摩
86. 唵 复苏之蛇的救赎者 南摩
87. 唵 纯洁者 南摩
88. 唵 语言专家 南摩
89. 唵 忍耐者 南摩
90. 唵 卡拉涅米的消灭者 南摩

91. 唵 哈里玛尔卡塔-玛尔卡塔 南摩
92. 唵 达姆塔 南摩
93. 唵 善静者 南摩
94. 唵 快乐心者 南摩
95. 唵 六瓣花酒醉者 南摩
96. 唵 瑜伽士 南摩
97. 唵 拉玛故事的乐趣者 南摩
98. 唵 希塔寻找的智者 南摩
99. 唵 金刚刀南摩
100. 唵 金刚爪 南摩

101. 唵 鲁德拉维尔亚·萨穆德巴瓦 南摩
102. 唵 印德拉吉特·普拉希塔·阿莫伽·梵天神剑·维尼瓦拉卡 南摩
103. 唵 普尔达德瓦贾阿格拉·萨姆瓦西内 南摩
104. 唵 沙尔潘贾拉·贝达卡 南摩
105. 唵 达萨·巴哈维 南摩
106. 唵 洛卡·普贾亚 南摩
107. 唵 贾姆巴瓦特·普里提·瓦尔达纳 南摩
108. 唵 希塔·萨梅塔·斯里·拉玛·巴达·塞瓦·杜兰达哈 南摩

文化重要性:此文本在哈努曼诞辰节(庆祝哈努曼诞辰)和其他纪念他的重大宗教仪式中发挥着至关重要的作用。

虔诚实践:许多信徒参与哈努曼阿什托塔拉·沙塔纳玛瓦利,寻求祝福,以坚定他们应对所遇到的挑战和困难的决心。

]]>
https://sanatandharmveda.com/%e5%93%88%e5%8a%aa%e6%9b%bc%e7%9a%84-108-%e4%b8%aa%e5%90%8d%e5%ad%97-%e5%93%88%e5%8a%aa%e6%9b%bc%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e6%b2%99%e5%a1%94%e7%ba%b3%e7%8e%9b/feed/ 0
甘尼萨神圣交响曲:维纳亚卡·阿什托塔拉·沙塔纳玛瓦利 https://sanatandharmveda.com/%e7%94%98%e5%b0%bc%e8%90%a8%e7%a5%9e%e5%9c%a3%e4%ba%a4%e5%93%8d%e6%9b%b2%ef%bc%9a%e7%bb%b4%e7%ba%b3%e4%ba%9a%e5%8d%a1%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e6%b2%99%e5%a1%94/ https://sanatandharmveda.com/%e7%94%98%e5%b0%bc%e8%90%a8%e7%a5%9e%e5%9c%a3%e4%ba%a4%e5%93%8d%e6%9b%b2%ef%bc%9a%e7%bb%b4%e7%ba%b3%e4%ba%9a%e5%8d%a1%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e6%b2%99%e5%a1%94/#respond Thu, 10 Oct 2024 11:03:43 +0000 https://sanatandharmveda.com/?p=5052 甘尼萨神圣交响曲:维纳亚卡·阿什托塔拉·沙塔纳玛瓦利

维纳亚卡·阿什托塔拉·沙塔纳玛瓦利 是献给象头神的 108 个神圣名字的集合,象头神是深受人们喜爱的障碍消除者和成功预兆。每个名字都体现了一种独特的属性,反映了这位受人尊敬的神灵的无数品质。人们相信,念诵这些咒语可以祈求神灵的祝福、智慧和繁荣,指引修行者走上精神之旅。

维纳亚卡·阿什托塔拉·沙塔纳玛瓦利

嗡律那亞那瑪
奧姆·維格納拉賈亞·納瑪
唵高里普特拉亞那瑪
奧姆·加內什瓦拉亞·納瑪
唵斯坎達格拉賈亞納瑪
唵阿維亞亞納瑪
奧姆·普塔亞·納瑪
奧姆·達克沙亞·納瑪
唵薩德拉薩亞納瑪
唵·德維賈普里亞亞·納瑪

唵阿格尼加爾巴奇德納瑪
唵·因德拉斯里普拉達亞·納瑪
唵·瓦尼普拉達亞·納瑪
唵悉地維達亞卡那瑪
唵 杜魯塔瓦哈納亞納瑪
唵阿內卡丹塔亞納瑪
唵·蘭博達拉亞·納瑪
奧姆·埃卡丹塔亞·納瑪
奧姆·維格納哈特·納瑪
奧姆·加加卡納·納瑪

奧姆·蘇拉普里亞·納瑪
奧姆·薩杜卡拉·納瑪
奧姆·奎普拉·普拉薩迪納·納瑪
奧姆·杜姆拉克塔夫·納瑪
唵達摩達拉那瑪
唵丹提納瑪
唵欽塔納沙克蒂納瑪
唵桑卡特·莫查納·納瑪
奧姆·西迪卡拉·納瑪
唵蘭巴穆卡亞納瑪

奧姆·埃卡什林加·納瑪
奧姆·沙克蒂·西達耶·納瑪
唵蘇穆卡納瑪
唵舒邦卡拉那瑪
唵那拉亞那沙瑪那亞那瑪
奧姆·帕穆卡·納瑪
奧姆·加納帕塔耶·納瑪
唵維吉納內什瓦拉亞納瑪
奧姆·馬霍達拉·納瑪
奧姆·蘇卡達·納瑪

唵·斯圖拉·穆哈·納瑪
唵甘尼薩那瑪
奧姆·巴拉昌德拉·納瑪
唵薩瓦舒巴·卡拉姆·納瑪
唵舒巴卡拉亞納瑪
唵卡利亞納卡特納瑪
奧姆·瓦拉達亞·納瑪
唵·尼提阿南達亞·納瑪
唵曼陀羅智納瑪
奧姆·里迪·西達耶·納瑪

奧姆·烏瑪蘇塔亞·納瑪
唵·潘查瓦克特拉亞·納瑪
奧姆·舒巴帕達亞·納瑪
唵普拉提什蒂塔亞納瑪
奧姆·維格納哈特·納瑪
奧姆·瓦拉達穆爾塔耶·納瑪
奧姆·查圖布賈亞·納瑪
唵悉地達那瑪
奧姆·克里丹塔亞·納瑪
唵·布瓦內什瓦拉·納瑪

奧姆·巴克塔瓦薩拉·納瑪
奧姆·加賈納納亞·納瑪
奧克謝特拉帕拉耶納瑪
奧姆·巴維亞穆爾塔耶·納瑪
唵法身那瑪
唵·安卡拉亞·納瑪
奧姆·阿米亞特曼·納瑪
奧姆·阿基拉南達·納瑪
唵·巴克提亞·納瑪
奧姆·特喬瑪亞·納瑪

唵·查圖維達亞·納瑪
奧姆·尼基拉沙克提·納瑪
奧姆·維什瓦魯帕亞·納瑪
奧姆·桑托沙亞·納瑪
唵帕巴薩卡亞納瑪
奧姆·帕拉梅什瓦拉亞·納瑪
唵·賈加迪什瓦拉·納瑪
奧姆·巴克塔瓦拉達·納瑪
唵香蒂·普拉達亞·納瑪
唵洛卡·卡利亞納亞·納瑪

奧姆·瓦薩拉瓦薩拉亞·納瑪
奧姆·伊什瓦里亞·納瑪
唵阿南達瑪雅納瑪
奧姆·查圖爾丹塔亞·納瑪
奧姆·阿迪亞特瑪·西德哈耶·納瑪
奧姆·普拉尚蒂·納瑪
唵·尼提亞姆克塔·納瑪
奧姆·里迪卡拉·納瑪
奧姆·維什瓦·萬達納亞·納瑪
奧姆·維什瓦·沙克蒂·納瑪

唵 消除障碍者 南无
奧姆·查圖瓦納·納瑪
唵維迪亞瓦達卡亞納瑪
唵舒博迪伽耶納瑪
奧姆·德維傑什瓦拉·納瑪
唵阿南達‧塔努‧納瑪
唵婆羅門那瑪
唵·巴克提·達塔亞·納瑪
奧姆·帕穆卡亞·納瑪
奧姆·查圖布賈亞·納瑪

唵阿什瓦魯德拉亞納瑪
唵蘇裡亞瓦爾納亞納瑪
唵帕拉帕拉亞納瑪
唵·普納布拉瑪亞·納瑪
奧姆·阿克肖比亞·納瑪
奧姆·希坎迪亞·納瑪
奧姆·沙什瓦塔亞·納瑪
奧姆·哈里達亞·納瑪

擁抱甘尼薩的祝福

背誦 维纳亚卡·阿什托塔拉·沙塔纳玛瓦利 是與甘尼薩勳爵的神聖能量聯繫的有效方式。每一個咒語都提醒著他無邊的慈悲、智慧和力量。當奉獻者念誦這些名字時,他們會為自己的生活帶來祝福,尋求克服挑戰和擁抱新開始的指導。

]]>
https://sanatandharmveda.com/%e7%94%98%e5%b0%bc%e8%90%a8%e7%a5%9e%e5%9c%a3%e4%ba%a4%e5%93%8d%e6%9b%b2%ef%bc%9a%e7%bb%b4%e7%ba%b3%e4%ba%9a%e5%8d%a1%c2%b7%e9%98%bf%e4%bb%80%e6%89%98%e5%a1%94%e6%8b%89%c2%b7%e6%b2%99%e5%a1%94/feed/ 0