get_post_meta( int $post_id, string $key = '', bool $single = false ): mixed
- Since
- 1.5.0
- Source
wp-includes/post.php:2750
Read a post's custom field with get_post_meta(); pass true as the third argument to get one value instead of an array of every value for the key. Omitting $key returns all meta for the post. A missing key yields an empty string (single) or an empty array, and non-serialized scalars are returned as strings.
Compatibility
- WordPress
- since 1.5.0
- PHP
- 7.4–8.6-dev
- 6.7.7
- 6.8.8
- 6.9.7
- 7.0.4
- 7.1.0
Present in every tracked release (6.7.7 to 7.1.0), and compiles on PHP 7.4 through 8.6-dev.
Parameters
$post_idint- Post ID.
$keystringoptional- The meta key to retrieve. By default, returns data for all keys. Default empty.Default:
'' $singlebooloptional- Whether to return a single value.
This parameter has no effect if$keyis not specified.
Default false.Default:false
Return value
mixed- An array of values if
$singleis false.
The value of the meta field if$singleis true.
False for an invalid$post_id(non-numeric, zero, or negative value).
An empty array if a valid but non-existing post ID is passed and$singleis false.
An empty string if a valid but non-existing post ID is passed and$singleis true.
Note: Non-serialized values are returned as strings:
- false values are returned as empty strings ('')
- true values are returned as '1'
- numbers (both integer and float) are returned as strings Arrays and objects retain their original type.
Code examples
Every example is editable and runs in a real WordPress booted in your browser by WordPress Playground. Press Run, then edit the code: clicking away re-runs it. Nothing is sent anywhere until you do.
Get a single custom field value
Passing true for $single returns the value itself rather than an array of every row.
$price = get_post_meta( 2, 'price', true );
if ( '' !== $price ) {
echo 'Price: ', esc_html( $price );
} else {
echo 'That post has no price set.';
}A missing key returns an empty string with $single true, and an empty array without it.
Read every value stored under one key
A key can hold many rows; omitting $single gives you all of them in the order they were stored.
delete_post_meta( 3, 'ticket_url' );
add_post_meta( 3, 'ticket_url', 'https://example.com/early-bird' );
add_post_meta( 3, 'ticket_url', 'https://example.com/general' );
$urls = get_post_meta( 3, 'ticket_url' );
print_r( $urls );add_post_meta() appends a row; update_post_meta() replaces one.
Performance profile
How much work a call to get_post_meta() does, and what it touches: the algorithmic scaling, the Zend instruction count per call across PHP versions, the hooks it hands control to, and the core code that calls it. Measured from the compiled opcodes, not a stopwatch, so every number is identical on any machine running the same PHP version, and every function in core is ranked by cost.
- Cost class
- Trivial
- Scaling
- Constant
- Instructions
- 10
- Plugin surface
- None
- Called by
- 50
Touches nothing outside its own arguments.
No loop in the body: the same number of instructions runs whatever you pass in.
Executed per call on PHP 8.5. The body compiles to 10.
Nothing here hands control to plugin code.
50 places in core call this, so the cost is paid more often than your own code shows.
What one call costs · 1 distinct outcome
One number would be a lie: the work depends on which branch runs. These are every distinct cost get_post_meta() can have, taken from its control-flow graph on PHP 8.5.
| When | Instructions | Calls it makes |
|---|---|---|
| always | 10 | get_metadata() |
Across PHP versions
Compiles the same on PHP 7.4, 8.1, 8.2, 8.3, 8.4, 8.5 and 8.6-dev: 10 instructions, 10 executed per call, 0 branches. The work does not change between versions.
An instruction is not a fixed amount of time, so a matching count is not necessarily the same speed; what it rules out is a difference in the work itself.
Uses · 1
- get_metadata()Retrieves the value of a metadata field for the specified object type and ID.
Used by · 50
- Custom_Image_Header::get_uploaded_header_images()Gets the previously uploaded header images.
- WP_Customize_Manager::import_theme_starter_content()Imports theme starter content into the customized state.
- WP_Customize_Manager::refresh_changeset_lock()Refreshes changeset lock with the current time if current user edited the changeset before.
- WP_Customize_Manager::set_changeset_lock()Marks the changeset post as being currently edited by the current user.
- WP_Customize_Nav_Menus::save_nav_menus_created_posts()Publishes the auto-draft posts that were created for nav menu items.
- WP_Embed::shortcode()The do_shortcode() callback function.
- WP_Post::__get()Getter.
- WP_Privacy_Policy_Content::_policy_page_updated()Updates the cached policy info when the policy page is updated.
- WP_Privacy_Policy_Content::get_suggested_policy_text()Checks for updated, added or removed privacy policy information from plugins.
- WP_Privacy_Policy_Content::text_change_check()Performs a quick check to determine whether any privacy info has changed.
- WP_REST_Attachments_Controller::edit_media_item()Applies edits to a media item and creates a new attachment record.
- WP_REST_Attachments_Controller::get_sideloaded_file_names()Returns the file names which a finalize request may store for an attachment.
Show all 50
- WP_REST_Attachments_Controller::prepare_item_for_response()Prepares a single attachment output for response.
- WP_User_Request::__construct()Constructor.
- _block_bindings_post_meta_get_value()Gets value for Post Meta source.
- _build_block_template_result_from_post()Builds a unified template object based a post Object.
- _wp_before_delete_font_face()Deletes associated font files when a font face is deleted.
- _wp_copy_post_meta()Copy post meta for the given key from one post to another.
- _wp_menu_item_classes_by_context()Adds the class property classes for the current context, if applicable.
- _wp_preview_meta_filter()Filters preview post meta retrieval to get values from the autosave.
- _wp_privacy_send_erasure_fulfillment_notification()Notifies the user when their erasure request is fulfilled.
- _wp_privacy_send_request_confirmation_notification()Notifies the site administrator via email when a request is confirmed.
- apply_block_hooks_to_content_from_post_object()Run the Block Hooks algorithm on a post object's content.
- edit_form_image_editor()Displays the image and editor in the post editor
- edit_post()Updates an existing post with values provided in `$_POST`.
- get_attached_file()Retrieves attached file path based on attachment ID.
- get_attachment_fields_to_edit()Retrieves the attachment fields to edit form fields.
- get_custom_logo()Returns a custom logo, linked to home unless the theme supports removing the link on the home page.
- get_header_image_tag()Creates image tag markup for a custom header image.
- get_media_states()Retrieves an array of media states from an attachment.
- get_page_template_slug()Gets the specific template filename for a given post.
- get_post_custom()Retrieves post meta fields, based on post ID.
- get_post_states()Retrieves an array of post states from a post.
- get_post_status()Retrieves the post status based on the post ID.
- get_post_thumbnail_id()Retrieves the post thumbnail ID.
- get_the_modified_author()Retrieves the author who last edited the current post.
- get_uploaded_header_images()Gets the header images uploaded for the active theme.
- inject_ignored_hooked_blocks_metadata_attributes()Inject ignoredHookedBlocks metadata attributes into a template or template part.
- map_meta_cap()Maps a capability to the primitive capabilities required of the given user to satisfy the capability being checked.
- media_upload_form_handler()Handles form submissions for the legacy media uploader.
- post_submit_meta_box()Displays post submit form fields.
- post_thumbnail_meta_box()Displays post thumbnail meta box.
- render_block_core_cover()Renders the `core/cover` block on server.
- render_block_core_footnotes()Renders the `core/footnotes` block on the server.
- render_block_core_media_text()Renders the `core/media-text` block on server.
- update_ignored_hooked_blocks_postmeta()Updates the wp_postmeta with the list of ignored hooked blocks where the inner blocks are stored as post content.
- update_menu_item_cache()Updates post and term caches for all linked objects for a list of menu items.
- upgrade_160()Execute changes made in WordPress 2.0.
- wp_ajax_crop_image()Handles cropping an image via AJAX.
- wp_ajax_save_attachment()Handles updating attachment attributes via AJAX.
Source code
function get_post_meta( $post_id, $key = '', $single = false ) { return get_metadata( 'post', $post_id, $key, $single );}Changelog
Introduced in 1.5.0. Unchanged from 6.7.7 through 7.1.0.
Signature, return type and hooks compared across 5 parsed releases.
About this page
- Parsed data
- Generated from the wordpress-develop 7.1.0 tag, from
src/wp-includes/post.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it. - Corrections
- Something wrong on this page? Report it and it gets fixed in the next regeneration.