Title: wp_ajax_add_meta
Published: April 25, 2014
Last modified: May 20, 2026

---

# wp_ajax_add_meta()

## In this article

 * [Source](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#wp--skip-link--target)

Handles adding meta via AJAX.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#source)󠁿

    ```php
    function wp_ajax_add_meta() {
    	check_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' );
    	$count   = 0;
    	$post_id = (int) $_POST['post_id'];
    	$post    = get_post( $post_id );

    	if ( isset( $_POST['metakeyselect'] ) || isset( $_POST['metakeyinput'] ) ) {
    		if ( ! current_user_can( 'edit_post', $post_id ) ) {
    			wp_die( -1 );
    		}

    		if ( isset( $_POST['metakeyselect'] ) && '#NONE#' === $_POST['metakeyselect'] && empty( $_POST['metakeyinput'] ) ) {
    			wp_die( 1 );
    		}

    		// If the post is an autodraft, save the post as a draft and then attempt to save the meta.
    		if ( 'auto-draft' === $post->post_status ) {
    			$post_data                = array();
    			$post_data['action']      = 'draft'; // Warning fix.
    			$post_data['post_ID']     = $post_id;
    			$post_data['post_type']   = $post->post_type;
    			$post_data['post_status'] = 'draft';
    			$now                      = time();

    			$post_data['post_title'] = sprintf(
    				/* translators: 1: Post creation date, 2: Post creation time. */
    				__( 'Draft created on %1$s at %2$s' ),
    				gmdate( __( 'F j, Y' ), $now ),
    				gmdate( __( 'g:i a' ), $now )
    			);

    			$post_id = edit_post( $post_data );

    			if ( $post_id ) {
    				if ( is_wp_error( $post_id ) ) {
    					$response = new WP_Ajax_Response(
    						array(
    							'what' => 'meta',
    							'data' => $post_id,
    						)
    					);
    					$response->send();
    				}

    				$meta_id = add_meta( $post_id );

    				if ( ! $meta_id ) {
    					wp_die( __( 'Please provide a custom field value.' ) );
    				}
    			} else {
    				wp_die( 0 );
    			}
    		} else {
    			$meta_id = add_meta( $post_id );

    			if ( ! $meta_id ) {
    				wp_die( __( 'Please provide a custom field value.' ) );
    			}
    		}

    		$meta    = get_metadata_by_mid( 'post', $meta_id );
    		$post_id = (int) $meta->post_id;
    		$meta    = get_object_vars( $meta );

    		$response = new WP_Ajax_Response(
    			array(
    				'what'         => 'meta',
    				'id'           => $meta_id,
    				'data'         => _list_meta_row( $meta, $count ),
    				'position'     => 1,
    				'supplemental' => array( 'postid' => $post_id ),
    			)
    		);
    	} else { // Update?
    		$meta_id = (int) key( $_POST['meta'] );
    		$key     = wp_unslash( $_POST['meta'][ $meta_id ]['key'] );
    		$value   = wp_unslash( $_POST['meta'][ $meta_id ]['value'] );

    		if ( '' === trim( $key ) ) {
    			wp_die( __( 'Please provide a custom field name.' ) );
    		}

    		$meta = get_metadata_by_mid( 'post', $meta_id );

    		if ( ! $meta ) {
    			wp_die( 0 ); // If meta doesn't exist.
    		}

    		if (
    			is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) ||
    			! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) ||
    			! current_user_can( 'edit_post_meta', $meta->post_id, $key )
    		) {
    			wp_die( -1 );
    		}

    		if ( $meta->meta_value !== $value || $meta->meta_key !== $key ) {
    			$update_result = update_metadata_by_mid( 'post', $meta_id, $value, $key );

    			if ( ! $update_result ) {
    				wp_die( 0 ); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
    			}
    		}

    		$response = new WP_Ajax_Response(
    			array(
    				'what'         => 'meta',
    				'id'           => $meta_id,
    				'old_id'       => $meta_id,
    				'data'         => _list_meta_row(
    					array(
    						'meta_key'   => $key,
    						'meta_value' => $value,
    						'meta_id'    => $meta_id,
    					),
    					$c
    				),
    				'position'     => 0,
    				'supplemental' => array( 'postid' => $meta->post_id ),
    			)
    		);
    	}

    	$response->send();
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/ajax-actions.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.0/src/wp-admin/includes/ajax-actions.php#L1617)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.0/src/wp-admin/includes/ajax-actions.php#L1617-L1741)

## 󠀁[Related](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#related)󠁿

| Uses | Description | 
| [_list_meta_row()](https://developer.wordpress.org/reference/functions/_list_meta_row/)`wp-admin/includes/template.php` |

Outputs a single row of public meta data in the Custom Fields meta box.

  | 
| [add_meta()](https://developer.wordpress.org/reference/functions/add_meta/)`wp-admin/includes/post.php` |

Adds post meta data defined in the `$_POST` superglobal for a post with given ID.

  | 
| [edit_post()](https://developer.wordpress.org/reference/functions/edit_post/)`wp-admin/includes/post.php` |

Updates an existing post with values provided in `$_POST`.

  | 
| [WP_Ajax_Response::__construct()](https://developer.wordpress.org/reference/classes/wp_ajax_response/__construct/)`wp-includes/class-wp-ajax-response.php` |

Constructor – Passes args to [WP_Ajax_Response::add()](https://developer.wordpress.org/reference/classes/wp_ajax_response/add/).

  | 
| [is_protected_meta()](https://developer.wordpress.org/reference/functions/is_protected_meta/)`wp-includes/meta.php` |

Determines whether a meta key is considered protected.

  | 
| [get_metadata_by_mid()](https://developer.wordpress.org/reference/functions/get_metadata_by_mid/)`wp-includes/meta.php` |

Retrieves metadata by meta ID.

  | 
| [update_metadata_by_mid()](https://developer.wordpress.org/reference/functions/update_metadata_by_mid/)`wp-includes/meta.php` |

Updates metadata by meta ID.

  | 
| [current_user_can()](https://developer.wordpress.org/reference/functions/current_user_can/)`wp-includes/capabilities.php` |

Returns whether the current user has the specified capability.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [wp_unslash()](https://developer.wordpress.org/reference/functions/wp_unslash/)`wp-includes/formatting.php` |

Removes slashes from a string or recursively removes slashes from strings within an array.

  | 
| [check_ajax_referer()](https://developer.wordpress.org/reference/functions/check_ajax_referer/)`wp-includes/pluggable.php` |

Verifies the Ajax request to prevent processing requests external of the blog.

  | 
| [wp_die()](https://developer.wordpress.org/reference/functions/wp_die/)`wp-includes/functions.php` |

Kills WordPress execution and displays HTML page with an error message.

  | 
| [get_post()](https://developer.wordpress.org/reference/functions/get_post/)`wp-includes/post.php` |

Retrieves post data given a post ID or post object.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  |

[Show 9 more](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/wp_ajax_add_meta/?output_format=md#changelog)󠁿

| Version | Description | 
| [3.1.0](https://developer.wordpress.org/reference/since/3.1.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_ajax_add_meta%2F)
before being able to contribute a note or feedback.