An open API service indexing awesome lists of open source software.

https://github.com/wp-cli/entity-command

Manage WordPress comments, menus, options, posts, sites, terms, and users.
https://github.com/wp-cli/entity-command

cli comment entity hacktoberfest menu meta network option page post session site taxonomy term user wordpress wp-cli wp-cli-package

Last synced: about 1 month ago
JSON representation

Manage WordPress comments, menus, options, posts, sites, terms, and users.

Awesome Lists containing this project

README

          

wp-cli/entity-command
=====================

Manage WordPress comments, menus, options, posts, sites, terms, and users.

[![Testing](https://github.com/wp-cli/entity-command/actions/workflows/testing.yml/badge.svg)](https://github.com/wp-cli/entity-command/actions/workflows/testing.yml) [![Code Coverage](https://codecov.io/gh/wp-cli/entity-command/branch/main/graph/badge.svg)](https://codecov.io/gh/wp-cli/entity-command/tree/main)

Quick links: [Using](#using) | [Installing](#installing) | [Contributing](#contributing) | [Support](#support)

## Using

This package implements the following commands:

### wp comment

Creates, updates, deletes, and moderates comments.

~~~
wp comment
~~~

**EXAMPLES**

# Create a new comment.
$ wp comment create --comment_post_ID=15 --comment_content="hello blog" --comment_author="wp-cli"
Success: Created comment 932.

# Update an existing comment.
$ wp comment update 123 --comment_author='That Guy'
Success: Updated comment 123.

# Delete an existing comment.
$ wp comment delete 1337 --force
Success: Deleted comment 1337.

# Trash all spam comments.
$ wp comment delete $(wp comment list --status=spam --format=ids)
Success: Trashed comment 264.
Success: Trashed comment 262.

# Create a note for a block (WordPress 6.9+).
$ wp comment create --comment_post_ID=15 --comment_content="This block needs revision" --comment_author="editor" --comment_type="note"
Success: Created comment 945.

# List notes for a specific post (WordPress 6.9+).
$ wp comment list --type=note --post_id=15
+------------+---------------------+----------------------------------+
| comment_ID | comment_date | comment_content |
+------------+---------------------+----------------------------------+
| 945 | 2024-11-10 14:30:00 | This block needs revision |
+------------+---------------------+----------------------------------+

# Reply to a note (WordPress 6.9+).
$ wp comment create --comment_post_ID=15 --comment_content="Updated per feedback" --comment_author="editor" --comment_type="note" --comment_parent=945
Success: Created comment 946.

# Resolve a note by adding a comment with status meta (WordPress 6.9+).
$ wp comment create --comment_post_ID=15 --comment_content="Resolving" --comment_author="editor" --comment_type="note" --comment_parent=945 --porcelain
947
$ wp comment meta add 947 _wp_note_status resolved
Success: Added custom field.

# Reopen a resolved note (WordPress 6.9+).
$ wp comment create --comment_post_ID=15 --comment_content="Reopening for further review" --comment_author="editor" --comment_type="note" --comment_parent=945 --porcelain
948
$ wp comment meta add 948 _wp_note_status reopen
Success: Added custom field.

### wp comment approve

Approves a comment.

~~~
wp comment approve ...
~~~

**OPTIONS**

...
The IDs of the comments to approve.

**EXAMPLES**

# Approve comment.
$ wp comment approve 1337
Success: Approved comment 1337.

### wp comment count

Counts comments, on whole blog or on a given post.

~~~
wp comment count []
~~~

**OPTIONS**

[]
The ID of the post to count comments in.

**EXAMPLES**

# Count comments on whole blog.
$ wp comment count
approved: 33
spam: 3
trash: 1
post-trashed: 0
all: 34
moderated: 1
total_comments: 37

# Count comments in a post.
$ wp comment count 42
approved: 19
spam: 0
trash: 0
post-trashed: 0
all: 19
moderated: 0
total_comments: 19

### wp comment create

Creates a new comment.

~~~
wp comment create [--=] [--porcelain]
~~~

**OPTIONS**

[--=]
Associative args for the new comment. See wp_insert_comment().

[--porcelain]
Output just the new comment id.

**EXAMPLES**

# Create comment.
$ wp comment create --comment_post_ID=15 --comment_content="hello blog" --comment_author="wp-cli"
Success: Created comment 932.

# Create a note (WordPress 6.9+).
$ wp comment create --comment_post_ID=15 --comment_content="This block needs revision" --comment_author="editor" --comment_type="note"
Success: Created comment 933.

### wp comment delete

Deletes a comment.

~~~
wp comment delete ... [--force]
~~~

**OPTIONS**

...
One or more IDs of comments to delete.

[--force]
Skip the trash bin.

**EXAMPLES**

# Delete comment.
$ wp comment delete 1337 --force
Success: Deleted comment 1337.

# Delete multiple comments.
$ wp comment delete 1337 2341 --force
Success: Deleted comment 1337.
Success: Deleted comment 2341.

### wp comment exists

Verifies whether a comment exists.

~~~
wp comment exists
~~~

Displays a success message if the comment does exist.

**OPTIONS**


The ID of the comment to check.

**EXAMPLES**

# Check whether comment exists.
$ wp comment exists 1337
Success: Comment with ID 1337 exists.

### wp comment generate

Generates some number of new dummy comments.

~~~
wp comment generate [--count=] [--post_id=] [--format=]
~~~

Creates a specified number of new comments with dummy data.

**OPTIONS**

[--count=]
How many comments to generate?
---
default: 100
---

[--post_id=]
Assign comments to a specific post.

[--format=]
Render output in a particular format.
---
default: progress
options:
- progress
- ids
---

**EXAMPLES**

# Generate comments for the given post.
$ wp comment generate --format=ids --count=3 --post_id=123
138 139 140

# Add meta to every generated comment.
$ wp comment generate --format=ids --count=3 | xargs -d ' ' -I % wp comment meta add % foo bar
Success: Added custom field.
Success: Added custom field.
Success: Added custom field.

### wp comment get

Gets the data of a single comment.

~~~
wp comment get [--field=] [--fields=] [--format=]
~~~

**OPTIONS**


The comment to get.

[--field=]
Instead of returning the whole comment, returns the value of a single field.

[--fields=]
Limit the output to specific fields. Defaults to all fields.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
---

**EXAMPLES**

# Get comment.
$ wp comment get 21 --field=content
Thanks for all the comments, everyone!

### wp comment list

Gets a list of comments.

~~~
wp comment list [--=] [--field=] [--fields=] [--format=]
~~~

Display comments based on all arguments supported by
[WP_Comment_Query()](https://developer.wordpress.org/reference/classes/WP_Comment_Query/__construct/).

**OPTIONS**

[--=]
One or more args to pass to WP_Comment_Query.

[--field=]
Prints the value of a single field for each comment.

[--fields=]
Limit the output to specific object fields.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- ids
- csv
- json
- count
- yaml
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each comment:

* comment_ID
* comment_post_ID
* comment_date
* comment_approved
* comment_author
* comment_author_email

These fields are optionally available:

* comment_author_url
* comment_author_IP
* comment_date_gmt
* comment_content
* comment_karma
* comment_agent
* comment_type
* comment_parent
* user_id
* url

**EXAMPLES**

# List comment IDs.
$ wp comment list --field=ID
22
23
24

# List comments of a post.
$ wp comment list --post_id=1 --fields=ID,comment_date,comment_author
+------------+---------------------+----------------+
| comment_ID | comment_date | comment_author |
+------------+---------------------+----------------+
| 1 | 2015-06-20 09:00:10 | Mr WordPress |
+------------+---------------------+----------------+

# List approved comments.
$ wp comment list --number=3 --status=approve --fields=ID,comment_date,comment_author
+------------+---------------------+----------------+
| comment_ID | comment_date | comment_author |
+------------+---------------------+----------------+
| 1 | 2015-06-20 09:00:10 | Mr WordPress |
| 30 | 2013-03-14 12:35:07 | John Doe |
| 29 | 2013-03-14 11:56:08 | Jane Doe |
+------------+---------------------+----------------+

# List unapproved comments.
$ wp comment list --number=3 --status=hold --fields=ID,comment_date,comment_author
+------------+---------------------+----------------+
| comment_ID | comment_date | comment_author |
+------------+---------------------+----------------+
| 8 | 2023-11-10 13:13:06 | John Doe |
| 7 | 2023-11-10 13:09:55 | Mr WordPress |
| 9 | 2023-11-10 11:22:31 | Jane Doe |
+------------+---------------------+----------------+

# List comments marked as spam.
$ wp comment list --status=spam --fields=ID,comment_date,comment_author
+------------+---------------------+----------------+
| comment_ID | comment_date | comment_author |
+------------+---------------------+----------------+
| 2 | 2023-11-10 11:22:31 | Jane Doe |
+------------+---------------------+----------------+

# List comments in trash.
$ wp comment list --status=trash --fields=ID,comment_date,comment_author
+------------+---------------------+----------------+
| comment_ID | comment_date | comment_author |
+------------+---------------------+----------------+
| 3 | 2023-11-10 11:22:31 | John Doe |
+------------+---------------------+----------------+

# List notes for a specific post (WordPress 6.9+).
$ wp comment list --type=note --post_id=15 --fields=ID,comment_date,comment_content
+------------+---------------------+----------------------------------+
| comment_ID | comment_date | comment_content |
+------------+---------------------+----------------------------------+
| 10 | 2024-11-10 14:30:00 | This block needs revision |
| 11 | 2024-11-10 15:45:00 | Updated per feedback |
+------------+---------------------+----------------------------------+

### wp comment meta

Adds, updates, deletes, and lists comment custom fields.

~~~
wp comment meta
~~~

**EXAMPLES**

# Set comment meta
$ wp comment meta set 123 description "Mary is a WordPress developer."
Success: Updated custom field 'description'.

# Get comment meta
$ wp comment meta get 123 description
Mary is a WordPress developer.

# Update comment meta
$ wp comment meta update 123 description "Mary is an awesome WordPress developer."
Success: Updated custom field 'description'.

# Delete comment meta
$ wp comment meta delete 123 description
Success: Deleted custom field.

### wp comment meta add

Add a meta field.

~~~
wp comment meta add [] [--format=]
~~~

**OPTIONS**


The ID of the object.


The name of the meta field to create.

[]
The value of the meta field. If omitted, the value is read from STDIN.

[--format=]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp comment meta delete

Delete a meta field.

~~~
wp comment meta delete [] [] [--all]
~~~

**OPTIONS**


The ID of the object.

[]
The name of the meta field to delete.

[]
The value to delete. If omitted, all rows with key will deleted.

[--all]
Delete all meta for the object.

### wp comment meta get

Get meta field value.

~~~
wp comment meta get [--single] [--format=]
~~~

**OPTIONS**


The ID of the object.


The name of the meta field to get.

[--single]
Whether to return a single value.

[--format=]
Get value in a particular format.
---
default: var_export
options:
- var_export
- json
- yaml
---

### wp comment meta list

List all metadata associated with an object.

~~~
wp comment meta list [--keys=] [--fields=] [--format=] [--orderby=] [--order=] [--unserialize]
~~~

**OPTIONS**


ID for the object.

[--keys=]
Limit output to metadata of specific keys.

[--fields=]
Limit the output to specific row fields. Defaults to id,meta_key,meta_value.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
- count
---

[--orderby=]
Set orderby which field.
---
default: id
options:
- id
- meta_key
- meta_value
---

[--order=]
Set ascending or descending order.
---
default: asc
options:
- asc
- desc
---

[--unserialize]
Unserialize meta_value output.

### wp comment meta patch

Update a nested value for a meta field.

~~~
wp comment meta patch ... [] [--format=]
~~~

**OPTIONS**


Patch action to perform.
---
options:
- insert
- update
- delete
---


The ID of the object.


The name of the meta field to update.

...
The name(s) of the keys within the value to locate the value to patch.

[]
The new value. If omitted, the value is read from STDIN.

[--format=]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp comment meta pluck

Get a nested value from a meta field.

~~~
wp comment meta pluck ... [--format=]
~~~

**OPTIONS**


The ID of the object.


The name of the meta field to get.

...
The name(s) of the keys within the value to locate the value to pluck.

[--format=]
The output format of the value.
---
default: plaintext
options:
- plaintext
- json
- yaml

### wp comment meta update

Update a meta field.

~~~
wp comment meta update [] [--format=]
~~~

**Alias:** `set`

**OPTIONS**


The ID of the object.


The name of the meta field to update.

[]
The new value. If omitted, the value is read from STDIN.

[--format=]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp comment recount

Recalculates the comment_count value for one or more posts.

~~~
wp comment recount ...
~~~

**OPTIONS**

...
IDs for one or more posts to update.

**EXAMPLES**

# Recount comment for the post.
$ wp comment recount 123
Updated post 123 comment count to 67.

### wp comment spam

Marks a comment as spam.

~~~
wp comment spam ...
~~~

**OPTIONS**

...
The IDs of the comments to mark as spam.

**EXAMPLES**

# Spam comment.
$ wp comment spam 1337
Success: Marked as spam comment 1337.

### wp comment status

Gets the status of a comment.

~~~
wp comment status
~~~

**OPTIONS**


The ID of the comment to check.

**EXAMPLES**

# Get status of comment.
$ wp comment status 1337
approved

### wp comment trash

Trashes a comment.

~~~
wp comment trash ...
~~~

**OPTIONS**

...
The IDs of the comments to trash.

**EXAMPLES**

# Trash comment.
$ wp comment trash 1337
Success: Trashed comment 1337.

### wp comment unapprove

Unapproves a comment.

~~~
wp comment unapprove ...
~~~

**OPTIONS**

...
The IDs of the comments to unapprove.

**EXAMPLES**

# Unapprove comment.
$ wp comment unapprove 1337
Success: Unapproved comment 1337.

### wp comment unspam

Unmarks a comment as spam.

~~~
wp comment unspam ...
~~~

**OPTIONS**

...
The IDs of the comments to unmark as spam.

**EXAMPLES**

# Unspam comment.
$ wp comment unspam 1337
Success: Unspammed comment 1337.

### wp comment untrash

Untrashes a comment.

~~~
wp comment untrash ...
~~~

**OPTIONS**

...
The IDs of the comments to untrash.

**EXAMPLES**

# Untrash comment.
$ wp comment untrash 1337
Success: Untrashed comment 1337.

### wp comment update

Updates one or more comments.

~~~
wp comment update ... --=
~~~

**OPTIONS**

...
One or more IDs of comments to update.

--=
One or more fields to update. See wp_update_comment().

**EXAMPLES**

# Update comment.
$ wp comment update 123 --comment_author='That Guy'
Success: Updated comment 123.

### wp font

Manages WordPress fonts.

~~~
wp font
~~~

**EXAMPLES**

# List all font collections
$ wp font collection list

# Install a font family from a collection
$ wp font family install google-fonts inter

# List installed font families
$ wp post list --post_type=wp_font_family

# List installed font faces
$ wp post list --post_type=wp_font_face

### wp font collection

Manages font collections.

~~~
wp font collection
~~~

Font collections are predefined sets of fonts that can be used in WordPress.
Collections are registered by WordPress core or themes and cannot be created
or deleted via the command line.

**EXAMPLES**

# List all font collections
$ wp font collection list
+------------------+-------------------+---------+
| slug | name | count |
+------------------+-------------------+---------+
| google-fonts | Google Fonts | 1500 |
+------------------+-------------------+---------+

# Get details about a specific font collection
$ wp font collection get google-fonts
+-------+------------------+
| Field | Value |
+-------+------------------+
| slug | google-fonts |
| name | Google Fonts |
+-------+------------------+

### wp font collection get

Gets details about a registered font collection.

~~~
wp font collection get [--field=] [--fields=] [--format=]
~~~

**OPTIONS**


Font collection slug.

[--field=]
Instead of returning the whole collection, returns the value of a single field.

[--fields=]
Limit the output to specific fields. Defaults to all fields.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
---

**AVAILABLE FIELDS**

These fields will be displayed by default for the specified collection:

* slug
* name
* description
* categories

**EXAMPLES**

# Get details of a specific collection
$ wp font collection get google-fonts
+-------+------------------+
| Field | Value |
+-------+------------------+
| slug | google-fonts |
| name | Google Fonts |
+-------+------------------+

# Get the name field only
$ wp font collection get google-fonts --field=name
Google Fonts

### wp font collection is-registered

Checks if a font collection is registered.

~~~
wp font collection is-registered
~~~

**OPTIONS**


Font collection slug.

**EXAMPLES**

# Bash script for checking if a font collection is registered, with fallback.

if wp font collection is-registered google-fonts 2>/dev/null; then
# Font collection is registered. Do something.
else
# Fallback if collection is not registered.
fi

### wp font collection list

Lists registered font collections.

~~~
wp font collection list [--field=] [--fields=] [--format=]
~~~

**OPTIONS**

[--field=]
Prints the value of a single field for each collection.

[--fields=]
Limit the output to specific collection fields.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- count
- yaml
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each collection:

* slug
* name
* description
* categories

**EXAMPLES**

# List all font collections
$ wp font collection list
+------------------+-------------------+
| slug | name |
+------------------+-------------------+
| google-fonts | Google Fonts |
+------------------+-------------------+

# List collections in JSON format
$ wp font collection list --format=json
[{"slug":"google-fonts","name":"Google Fonts"}]

### wp font collection list-categories

Lists categories in a collection.

~~~
wp font collection list-categories [--field=] [--fields=] [--format=]
~~~

**OPTIONS**


Font collection slug.

[--field=]
Prints the value of a single field for each category.

[--fields=]
Limit the output to specific category fields.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- count
- yaml
---

**AVAILABLE FIELDS**

* slug
* name

**EXAMPLES**

# List all categories in a collection
$ wp font collection list-categories google-fonts
+-------------+--------------+
| slug | name |
+-------------+--------------+
| sans-serif | Sans Serif |
| display | Display |
+-------------+--------------+

### wp font collection list-families

Lists font families in a collection.

~~~
wp font collection list-families [--category=] [--field=] [--fields=] [--format=]
~~~

**OPTIONS**


Font collection slug.

[--category=]
Filter by category slug.

[--field=]
Prints the value of a single field for each family.

[--fields=]
Limit the output to specific family fields.

[--format=]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- count
- yaml
---

**AVAILABLE FIELDS**

* slug
* name
* fontFamily
* categories
* preview

**EXAMPLES**

# List all font families in a collection
$ wp font collection list-families google-fonts

# List font families in a specific category
$ wp font collection list-families google-fonts --category=sans-serif

### wp font face

Manages font faces.

~~~
wp font face
~~~

To list, get, create, update or delete font faces, use `wp post` with
`--post_type=wp_font_face`.

**EXAMPLES**

# Install a font face for an existing family
$ wp font face install 42 --src="https://example.com/font.woff2" --font-weight=700
Success: Created font face 43.

# List installed font faces
$ wp post list --post_type=wp_font_face

### wp font face install

Installs a font face.

~~~
wp font face install --src= [--font-family=] [--font-style=] [--font-weight=<weight>] [--font-display=<display>] [--porcelain]
~~~

Creates a new font face post with the specified settings.

**OPTIONS**

<family-id>
Font family ID.

--src=<src>
Font face source URL or file path.

[--font-family=<family>]
CSS font-family value.

[--font-style=<style>]
CSS font-style value (e.g., normal, italic).
---
default: normal
---

[--font-weight=<weight>]
CSS font-weight value (e.g., 400, 700).
---
default: 400
---

[--font-display=<display>]
CSS font-display value.

[--porcelain]
Output just the new font face ID.

**EXAMPLES**

# Install a font face
$ wp font face install 42 --src="https://example.com/font.woff2" --font-weight=700 --font-style=normal
Success: Created font face 43.

# Install a font face with porcelain output
$ wp font face install 42 --src="font.woff2" --porcelain
44

### wp font family

Manages font families.

~~~
wp font family
~~~

To list, get, create, update or delete font families, use `wp post` with
`--post_type=wp_font_family`.

**EXAMPLES**

# Install a font family from a collection
$ wp font family install google-fonts inter
Success: Installed font family "Inter" (ID: 42) with 9 font faces.

# List installed font families
$ wp post list --post_type=wp_font_family

### wp font family install

Installs a font family from a collection.

~~~
wp font family install <collection> <family> [--porcelain]
~~~

Retrieves a font family from a collection and creates the wp_font_family post
along with all associated font faces.

**OPTIONS**

<collection>
Font collection slug.

<family>
Font family slug from the collection.

[--porcelain]
Output just the new font family ID.

**EXAMPLES**

# Install a font family from a collection
$ wp font family install google-fonts inter
Success: Installed font family "Inter" (ID: 42) with 9 font faces.

# Install and get the family ID
$ wp font family install google-fonts roboto --porcelain
43

### wp menu

Lists, creates, assigns, and deletes the active theme's navigation menus.

~~~
wp menu
~~~

See the [Navigation Menus](https://developer.wordpress.org/themes/functionality/navigation-menus/) reference in the Theme Handbook.

**EXAMPLES**

# Create a new menu
$ wp menu create "My Menu"
Success: Created menu 200.

# List existing menus
$ wp menu list
+---------+----------+----------+-----------+-------+
| term_id | name | slug | locations | count |
+---------+----------+----------+-----------+-------+
| 200 | My Menu | my-menu | | 0 |
| 177 | Top Menu | top-menu | primary | 7 |
+---------+----------+----------+-----------+-------+

# Create a new menu link item
$ wp menu item add-custom my-menu Apple http://apple.com --porcelain
1922

# Assign the 'my-menu' menu to the 'primary' location
$ wp menu location assign my-menu primary
Success: Assigned location primary to menu my-menu.

### wp menu create

Creates a new menu.

~~~
wp menu create <menu-name> [--porcelain]
~~~

**OPTIONS**

<menu-name>
A descriptive name for the menu.

[--porcelain]
Output just the new menu id.

**EXAMPLES**

$ wp menu create "My Menu"
Success: Created menu 200.

### wp menu delete

Deletes one or more menus.

~~~
wp menu delete <menu>...
~~~

**OPTIONS**

<menu>...
The name, slug, or term ID for the menu(s).

**EXAMPLES**

$ wp menu delete "My Menu"
Deleted menu 'My Menu'.
Success: Deleted 1 of 1 menus.

### wp menu item

List, add, and delete items associated with a menu.

~~~
wp menu item
~~~

**EXAMPLES**

# Add an existing post to an existing menu
$ wp menu item add-post sidebar-menu 33 --title="Custom Test Post"
Success: Menu item added.

# Create a new menu link item
$ wp menu item add-custom sidebar-menu Apple http://apple.com
Success: Menu item added.

# Delete menu item
$ wp menu item delete 45
Success: Deleted 1 of 1 menu items.

### wp menu item add-custom

Adds a custom menu item.

~~~
wp menu item add-custom <menu> <title> <link> [--description=<description>] [--attr-title=<attr-title>] [--target=<target>] [--classes=<classes>] [--position=<position>] [--parent-id=<parent-id>] [--porcelain]
~~~

**OPTIONS**

<menu>
The name, slug, or term ID for the menu.

<title>
Title for the link.

<link>
Target URL for the link.

[--description=<description>]
Set a custom description for the menu item.

[--attr-title=<attr-title>]
Set a custom title attribute for the menu item.

[--target=<target>]
Set a custom link target for the menu item.

[--classes=<classes>]
Set a custom link classes for the menu item.

[--position=<position>]
Specify the position of this menu item.

[--parent-id=<parent-id>]
Make this menu item a child of another menu item.

[--porcelain]
Output just the new menu item id.

**EXAMPLES**

$ wp menu item add-custom sidebar-menu Apple http://apple.com
Success: Menu item added.

### wp menu item add-post

Adds a post as a menu item.

~~~
wp menu item add-post <menu> <post-id> [--title=<title>] [--link=<link>] [--description=<description>] [--attr-title=<attr-title>] [--target=<target>] [--classes=<classes>] [--position=<position>] [--parent-id=<parent-id>] [--porcelain]
~~~

**OPTIONS**

<menu>
The name, slug, or term ID for the menu.

<post-id>
Post ID to add to the menu.

[--title=<title>]
Set a custom title for the menu item.

[--link=<link>]
Set a custom url for the menu item.

[--description=<description>]
Set a custom description for the menu item.

[--attr-title=<attr-title>]
Set a custom title attribute for the menu item.

[--target=<target>]
Set a custom link target for the menu item.

[--classes=<classes>]
Set a custom link classes for the menu item.

[--position=<position>]
Specify the position of this menu item.

[--parent-id=<parent-id>]
Make this menu item a child of another menu item.

[--porcelain]
Output just the new menu item id.

**EXAMPLES**

$ wp menu item add-post sidebar-menu 33 --title="Custom Test Post"
Success: Menu item added.

### wp menu item add-term

Adds a taxonomy term as a menu item.

~~~
wp menu item add-term <menu> <taxonomy> <term-id> [--title=<title>] [--link=<link>] [--description=<description>] [--attr-title=<attr-title>] [--target=<target>] [--classes=<classes>] [--position=<position>] [--parent-id=<parent-id>] [--porcelain]
~~~

**OPTIONS**

<menu>
The name, slug, or term ID for the menu.

<taxonomy>
Taxonomy of the term to be added.

<term-id>
Term ID of the term to be added.

[--title=<title>]
Set a custom title for the menu item.

[--link=<link>]
Set a custom url for the menu item.

[--description=<description>]
Set a custom description for the menu item.

[--attr-title=<attr-title>]
Set a custom title attribute for the menu item.

[--target=<target>]
Set a custom link target for the menu item.

[--classes=<classes>]
Set a custom link classes for the menu item.

[--position=<position>]
Specify the position of this menu item.

[--parent-id=<parent-id>]
Make this menu item a child of another menu item.

[--porcelain]
Output just the new menu item id.

**EXAMPLES**

$ wp menu item add-term sidebar-menu post_tag 24
Success: Menu item added.

### wp menu item delete

Deletes one or more items from a menu.

~~~
wp menu item delete <db-id>...
~~~

**OPTIONS**

<db-id>...
Database ID for the menu item(s).

**EXAMPLES**

$ wp menu item delete 45
Success: Deleted 1 of 1 menu items.

### wp menu item get

Gets details about a menu item.

~~~
wp menu item get <db-id> [--field=<field>] [--fields=<fields>] [--format=<format>]
~~~

**OPTIONS**

<db-id>
Database ID for the menu item.

[--field=<field>]
Instead of returning the whole menu item, returns the value of a single field.

[--fields=<fields>]
Limit the output to specific fields. Defaults to db_id, type, title, link, position.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
---

**AVAILABLE FIELDS**

These fields are available:

* db_id
* type
* title
* link
* position
* menu_item_parent
* object_id
* object
* type_label
* target
* attr_title
* description
* classes
* xfn

**EXAMPLES**

# Get details about a menu item with ID 45
$ wp menu item get 45
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| db_id | 45 |
| type | custom |
| title | WordPress |
| link | https://wordpress.org |
| position | 1 |
+-------------+----------------------------------+

# Get a specific field from a menu item
$ wp menu item get 45 --field=title
WordPress

# Get menu item data in JSON format
$ wp menu item get 45 --format=json
{"db_id":45,"type":"custom","title":"WordPress","link":"https://wordpress.org","position":1}

### wp menu item list

Gets a list of items associated with a menu.

~~~
wp menu item list <menu> [--fields=<fields>] [--format=<format>]
~~~

**OPTIONS**

<menu>
The name, slug, or term ID for the menu.

[--fields=<fields>]
Limit the output to specific object fields.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- count
- ids
- yaml
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each menu item:

* db_id
* type
* title
* link
* position

These fields are optionally available:

* menu_item_parent
* object_id
* object
* type
* type_label
* target
* attr_title
* description
* classes
* xfn

**EXAMPLES**

$ wp menu item list main-menu
+-------+-----------+-------------+---------------------------------+----------+
| db_id | type | title | link | position |
+-------+-----------+-------------+---------------------------------+----------+
| 5 | custom | Home | http://example.com | 1 |
| 6 | post_type | Sample Page | http://example.com/sample-page/ | 2 |
+-------+-----------+-------------+---------------------------------+----------+

### wp menu item update

Updates a menu item.

~~~
wp menu item update <db-id> [--title=<title>] [--link=<link>] [--description=<description>] [--attr-title=<attr-title>] [--target=<target>] [--classes=<classes>] [--position=<position>] [--parent-id=<parent-id>]
~~~

**OPTIONS**

<db-id>
Database ID for the menu item.

[--title=<title>]
Set a custom title for the menu item.

[--link=<link>]
Set a custom url for the menu item.

[--description=<description>]
Set a custom description for the menu item.

[--attr-title=<attr-title>]
Set a custom title attribute for the menu item.

[--target=<target>]
Set a custom link target for the menu item.

[--classes=<classes>]
Set a custom link classes for the menu item.

[--position=<position>]
Specify the position of this menu item.

[--parent-id=<parent-id>]
Make this menu item a child of another menu item.

**EXAMPLES**

$ wp menu item update 45 --title=WordPress --link='http://wordpress.org' --target=_blank --position=2
Success: Menu item updated.

### wp menu list

Gets a list of menus.

~~~
wp menu list [--fields=<fields>] [--format=<format>]
~~~

**OPTIONS**

[--fields=<fields>]
Limit the output to specific object fields.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- count
- ids
- yaml
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each menu:

* term_id
* name
* slug
* count

These fields are optionally available:

* term_group
* term_taxonomy_id
* taxonomy
* description
* parent
* locations

**EXAMPLES**

$ wp menu list
+---------+----------+----------+-----------+-------+
| term_id | name | slug | locations | count |
+---------+----------+----------+-----------+-------+
| 200 | My Menu | my-menu | | 0 |
| 177 | Top Menu | top-menu | primary | 7 |
+---------+----------+----------+-----------+-------+

### wp menu location

Assigns, removes, and lists a menu's locations.

~~~
wp menu location
~~~

**EXAMPLES**

# List available menu locations
$ wp menu location list
+----------+-------------------+
| location | description |
+----------+-------------------+
| primary | Primary Menu |
| social | Social Links Menu |
+----------+-------------------+

# Assign the 'primary-menu' menu to the 'primary' location
$ wp menu location assign primary-menu primary
Success: Assigned location primary to menu primary-menu.

# Remove the 'primary-menu' menu from the 'primary' location
$ wp menu location remove primary-menu primary
Success: Removed location from menu.

### wp menu location assign

Assigns a location to a menu.

~~~
wp menu location assign <menu> <location>
~~~

**OPTIONS**

<menu>
The name, slug, or term ID for the menu.

<location>
Location's slug.

**EXAMPLES**

$ wp menu location assign primary-menu primary
Success: Assigned location primary to menu primary-menu.

### wp menu location list

Lists locations for the current theme.

~~~
wp menu location list [--format=<format>]
~~~

**OPTIONS**

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- count
- yaml
- ids
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each location:

* name
* description

**EXAMPLES**

$ wp menu location list
+----------+-------------------+
| location | description |
+----------+-------------------+
| primary | Primary Menu |
| social | Social Links Menu |
+----------+-------------------+

### wp menu location remove

Removes a location from a menu.

~~~
wp menu location remove <menu> <location>
~~~

**OPTIONS**

<menu>
The name, slug, or term ID for the menu.

<location>
Location's slug.

**EXAMPLES**

$ wp menu location remove primary-menu primary
Success: Removed location from menu.

### wp network

Perform network-wide operations.

~~~
wp network
~~~

**EXAMPLES**

# Get a list of super-admins
$ wp network meta get 1 site_admins
array (
0 => 'supervisor',
)

### wp network meta

Gets, adds, updates, deletes, and lists network custom fields.

~~~
wp network meta
~~~

**EXAMPLES**

# Get a list of super-admins
$ wp network meta get 1 site_admins
array (
0 => 'supervisor',
)

### wp network meta add

Add a meta field.

~~~
wp network meta add <id> <key> [<value>] [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to create.

[<value>]
The value of the meta field. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp network meta delete

Delete a meta field.

~~~
wp network meta delete <id> [<key>] [<value>] [--all]
~~~

**OPTIONS**

<id>
The ID of the object.

[<key>]
The name of the meta field to delete.

[<value>]
The value to delete. If omitted, all rows with key will deleted.

[--all]
Delete all meta for the object.

### wp network meta get

Get meta field value.

~~~
wp network meta get <id> <key> [--single] [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to get.

[--single]
Whether to return a single value.

[--format=<format>]
Get value in a particular format.
---
default: var_export
options:
- var_export
- json
- yaml
---

### wp network meta list

List all metadata associated with an object.

~~~
wp network meta list <id> [--keys=<keys>] [--fields=<fields>] [--format=<format>] [--orderby=<fields>] [--order=<order>] [--unserialize]
~~~

**OPTIONS**

<id>
ID for the object.

[--keys=<keys>]
Limit output to metadata of specific keys.

[--fields=<fields>]
Limit the output to specific row fields. Defaults to id,meta_key,meta_value.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
- count
---

[--orderby=<fields>]
Set orderby which field.
---
default: id
options:
- id
- meta_key
- meta_value
---

[--order=<order>]
Set ascending or descending order.
---
default: asc
options:
- asc
- desc
---

[--unserialize]
Unserialize meta_value output.

### wp network meta patch

Update a nested value for a meta field.

~~~
wp network meta patch <action> <id> <key> <key-path>... [<value>] [--format=<format>]
~~~

**OPTIONS**

<action>
Patch action to perform.
---
options:
- insert
- update
- delete
---

<id>
The ID of the object.

<key>
The name of the meta field to update.

<key-path>...
The name(s) of the keys within the value to locate the value to patch.

[<value>]
The new value. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp network meta pluck

Get a nested value from a meta field.

~~~
wp network meta pluck <id> <key> <key-path>... [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to get.

<key-path>...
The name(s) of the keys within the value to locate the value to pluck.

[--format=<format>]
The output format of the value.
---
default: plaintext
options:
- plaintext
- json
- yaml

### wp network meta update

Update a meta field.

~~~
wp network meta update <id> <key> [<value>] [--format=<format>]
~~~

**Alias:** `set`

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to update.

[<value>]
The new value. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp option

Retrieves and sets site options, including plugin and WordPress settings.

~~~
wp option
~~~

See the [Plugin Settings API](https://developer.wordpress.org/plugins/settings/settings-api/) and the [Theme Options](https://developer.wordpress.org/themes/customize-api/) for more information on adding customized options.

**COMMON OPTIONS**

These are some of the most commonly used WordPress options:

* `siteurl` - Site URL, e.g. http://example.com
* `blogname` - Site title
* `blogdescription` - Site tagline
* `admin_email` - Administration email address
* `default_role` - Default role for new users
* `timezone_string` - Local timezone, e.g. "America/New_York"
* `home` - Home URL, e.g. http://example.com
* `blog_public` - Discourage search engines when set to 0

For the full list of available options, see the [Option Reference](https://developer.wordpress.org/apis/options/).

**EXAMPLES**

# Get site URL.
$ wp option get siteurl
http://example.com

# Add option.
$ wp option add my_option foobar
Success: Added 'my_option' option.

# Update option.
$ wp option update my_option '{"foo": "bar"}' --format=json
Success: Updated 'my_option' option.

# Delete option.
$ wp option delete my_option
Success: Deleted 'my_option' option.

### wp option add

Adds a new option value.

~~~
wp option add <key> [<value>] [--format=<format>] [--autoload=<autoload>]
~~~

Errors if the option already exists.

**OPTIONS**

<key>
The name of the option to add.

[<value>]
The value of the option to add. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

[--autoload=<autoload>]
Should this option be automatically loaded.
---
options:
- 'on'
- 'off'
- 'yes'
- 'no'
---

**EXAMPLES**

# Create an option by reading a JSON file.
$ wp option add my_option --format=json < config.json
Success: Added 'my_option' option.

### wp option delete

Deletes an option.

~~~
wp option delete <key>...
~~~

**OPTIONS**

<key>...
Key for the option.

**EXAMPLES**

# Delete an option.
$ wp option delete my_option
Success: Deleted 'my_option' option.

# Delete multiple options.
$ wp option delete option_one option_two option_three
Success: Deleted 'option_one' option.
Success: Deleted 'option_two' option.
Warning: Could not delete 'option_three' option. Does it exist?

### wp option get

Gets the value for an option.

~~~
wp option get <key> [--format=<format>]
~~~

**OPTIONS**

<key>
Key for the option.

[--format=<format>]
Get value in a particular format.
---
default: var_export
options:
- var_export
- json
- yaml
---

**EXAMPLES**

# Get option.
$ wp option get home
http://example.com

# Get blog description.
$ wp option get blogdescription
A random blog description

# Get blog name
$ wp option get blogname
A random blog name

# Get admin email.
$ wp option get admin_email
someone@example.com

# Get option in JSON format.
$ wp option get active_plugins --format=json
{"0":"dynamically-dynamic-sidebar\/dynamically-dynamic-sidebar.php","1":"monster-widget\/monster-widget.php","2":"show-current-template\/show-current-template.php","3":"theme-check\/theme-check.php","5":"wordpress-importer\/wordpress-importer.php"}

### wp option list

Lists options and their values.

~~~
wp option list [--search=<pattern>] [--exclude=<pattern>] [--autoload=<value>] [--transients] [--unserialize] [--field=<field>] [--fields=<fields>] [--format=<format>] [--orderby=<fields>] [--order=<order>]
~~~

**OPTIONS**

[--search=<pattern>]
Use wildcards ( * and ? ) to match option name.

[--exclude=<pattern>]
Pattern to exclude. Use wildcards ( * and ? ) to match option name.

[--autoload=<value>]
Match only autoload options when value is on, and only not-autoload option when off.

[--transients]
List only transients. Use `--no-transients` to ignore all transients.

[--unserialize]
Unserialize option values in output.

[--field=<field>]
Prints the value of a single field.

[--fields=<fields>]
Limit the output to specific object fields.

[--format=<format>]
The serialization format for the value. total_bytes displays the total size of matching options in bytes.
---
default: table
options:
- table
- json
- csv
- count
- yaml
- total_bytes
---

[--orderby=<fields>]
Set orderby which field.
---
default: option_id
options:
- option_id
- option_name
- option_value
---

[--order=<order>]
Set ascending or descending order.
---
default: asc
options:
- asc
- desc
---

**AVAILABLE FIELDS**

This field will be displayed by default for each matching option:

* option_name
* option_value

These fields are optionally available:

* autoload
* size_bytes

**EXAMPLES**

# Get the total size of all autoload options.
$ wp option list --autoload=on --format=total_bytes
33198

# Find biggest transients.
$ wp option list --search="*_transient_*" --fields=option_name,size_bytes | sort -n -k 2 | tail
option_name size_bytes
_site_transient_timeout_theme_roots 10
_site_transient_theme_roots 76
_site_transient_update_themes 181
_site_transient_update_core 808
_site_transient_update_plugins 6645

# List all options beginning with "i2f_".
$ wp option list --search="i2f_*"
+-------------+--------------+
| option_name | option_value |
+-------------+--------------+
| i2f_version | 0.1.0 |
+-------------+--------------+

# Delete all options beginning with "theme_mods_".
$ wp option list --search="theme_mods_*" --field=option_name | xargs -I % wp option delete %
Success: Deleted 'theme_mods_twentysixteen' option.
Success: Deleted 'theme_mods_twentyfifteen' option.
Success: Deleted 'theme_mods_twentyfourteen' option.

### wp option patch

Updates a nested value in an option.

~~~
wp option patch <action> <key> <key-path>... [<value>] [--format=<format>]
~~~

**OPTIONS**

<action>
Patch action to perform.
---
options:
- insert
- update
- delete
---

<key>
The option name.

<key-path>...
The name(s) of the keys within the value to locate the value to patch.

[<value>]
The new value. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

**EXAMPLES**

# Add 'bar' to the 'foo' key on an option with name 'option_name'
$ wp option patch insert option_name foo bar
Success: Updated 'option_name' option.

# Update the value of 'foo' key to 'new' on an option with name 'option_name'
$ wp option patch update option_name foo new
Success: Updated 'option_name' option.

# Set nested value of 'bar' key to value we have in the patch file on an option with name 'option_name'.
$ wp option patch update option_name foo bar < patch
Success: Updated 'option_name' option.

# Update the value for the key 'not-a-key' which is not exist on an option with name 'option_name'.
$ wp option patch update option_name foo not-a-key new-value
Error: No data exists for key "not-a-key"

# Update the value for the key 'foo' without passing value on an option with name 'option_name'.
$ wp option patch update option_name foo
Error: Please provide value to update.

# Delete the nested key 'bar' under 'foo' key on an option with name 'option_name'.
$ wp option patch delete option_name foo bar
Success: Updated 'option_name' option.

### wp option pluck

Gets a nested value from an option.

~~~
wp option pluck <key> <key-path>... [--format=<format>]
~~~

**OPTIONS**

<key>
The option name.

<key-path>...
The name(s) of the keys within the value to locate the value to pluck.

[--format=<format>]
The output format of the value.
---
default: plaintext
options:
- plaintext
- json
- yaml
---

### wp option update

Updates an option value.

~~~
wp option update <key> [<value>] [--autoload=<autoload>] [--format=<format>]
~~~

**Alias:** `set`

**OPTIONS**

<key>
The name of the option to update.

[<value>]
The new value. If omitted, the value is read from STDIN.

[--autoload=<autoload>]
Requires WP 4.2. Should this option be automatically loaded.
---
options:
- 'on'
- 'off'
- 'yes'
- 'no'
---

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

**EXAMPLES**

# Update an option by reading from a file.
$ wp option update my_option < value.txt
Success: Updated 'my_option' option.

# Update one option on multiple sites using xargs.
$ wp site list --field=url | xargs -n1 -I {} sh -c 'wp --url={} option update my_option my_value'
Success: Updated 'my_option' option.
Success: Updated 'my_option' option.

# Update site blog name.
$ wp option update blogname "Random blog name"
Success: Updated 'blogname' option.

# Update site blog description.
$ wp option update blogdescription "Some random blog description"
Success: Updated 'blogdescription' option.

# Update admin email address.
$ wp option update admin_email someone@example.com
Success: Updated 'admin_email' option.

# Set the default role.
$ wp option update default_role author
Success: Updated 'default_role' option.

# Set the timezone string.
$ wp option update timezone_string "America/New_York"
Success: Updated 'timezone_string' option.

### wp option set-autoload

Sets the 'autoload' value for an option.

~~~
wp option set-autoload <key> <autoload>
~~~

**OPTIONS**

<key>
The name of the option to set 'autoload' for.

<autoload>
Should this option be automatically loaded.
---
options:
- 'on'
- 'off'
- 'yes'
- 'no'
---

**EXAMPLES**

# Set the 'autoload' value for an option.
$ wp option set-autoload abc_options no
Success: Updated autoload value for 'abc_options' option.

### wp option get-autoload

Gets the 'autoload' value for an option.

~~~
wp option get-autoload <key>
~~~

**OPTIONS**

<key>
The name of the option to get 'autoload' of.

**EXAMPLES**

# Get the 'autoload' value for an option.
$ wp option get-autoload blogname
yes

### wp post

Manages posts, content, and meta.

~~~
wp post
~~~

**EXAMPLES**

# Create a new post.
$ wp post create --post_type=post --post_title='A sample post'
Success: Created post 123.

# Update an existing post.
$ wp post update 123 --post_status=draft
Success: Updated post 123.

# Delete an existing post.
$ wp post delete 123
Success: Trashed post 123.

### wp post create

Creates a new post.

~~~
wp post create [--post_author=<post_author>] [--post_date=<post_date>] [--post_date_gmt=<post_date_gmt>] [--post_content=<post_content>] [--post_content_filtered=<post_content_filtered>] [--post_title=<post_title>] [--post_excerpt=<post_excerpt>] [--post_status=<post_status>] [--post_type=<post_type>] [--comment_status=<comment_status>] [--ping_status=<ping_status>] [--post_password=<post_password>] [--post_name=<post_name>] [--from-post=<post_id>] [--to_ping=<to_ping>] [--pinged=<pinged>] [--post_modified=<post_modified>] [--post_modified_gmt=<post_modified_gmt>] [--post_parent=<post_parent>] [--menu_order=<menu_order>] [--post_mime_type=<post_mime_type>] [--guid=<guid>] [--post_category=<post_category>] [--tags_input=<tags_input>] [--tax_input=<tax_input>] [--meta_input=<meta_input>] [<file>] [--<field>=<value>] [--edit] [--porcelain]
~~~

**OPTIONS**

[--post_author=<post_author>]
The ID of the user who added the post. Default is the current user ID.

[--post_date=<post_date>]
The date of the post. Default is the current time.

[--post_date_gmt=<post_date_gmt>]
The date of the post in the GMT timezone. Default is the value of $post_date.

[--post_content=<post_content>]
The post content. Default empty.

[--post_content_filtered=<post_content_filtered>]
The filtered post content. Default empty.

[--post_title=<post_title>]
The post title. Default empty.

[--post_excerpt=<post_excerpt>]
The post excerpt. Default empty.

[--post_status=<post_status>]
The post status. Default 'draft'.

[--post_type=<post_type>]
The post type. Default 'post'.

[--comment_status=<comment_status>]
Whether the post can accept comments. Accepts 'open' or 'closed'. Default is the value of 'default_comment_status' option.

[--ping_status=<ping_status>]
Whether the post can accept pings. Accepts 'open' or 'closed'. Default is the value of 'default_ping_status' option.

[--post_password=<post_password>]
The password to access the post. Default empty.

[--post_name=<post_name>]
The post name. Default is the sanitized post title when creating a new post.

[--from-post=<post_id>]
Post id of a post to be duplicated.

[--to_ping=<to_ping>]
Space or carriage return-separated list of URLs to ping. Default empty.

[--pinged=<pinged>]
Space or carriage return-separated list of URLs that have been pinged. Default empty.

[--post_modified=<post_modified>]
The date when the post was last modified. Default is the current time.

[--post_modified_gmt=<post_modified_gmt>]
The date when the post was last modified in the GMT timezone. Default is the current time.

[--post_parent=<post_parent>]
Set this for the post it belongs to, if any. Default 0.

[--menu_order=<menu_order>]
The order the post should be displayed in. Default 0.

[--post_mime_type=<post_mime_type>]
The mime type of the post. Default empty.

[--guid=<guid>]
Global Unique ID for referencing the post. Default empty.

[--post_category=<post_category>]
Array of category names, slugs, or IDs. Defaults to value of the 'default_category' option.

[--tags_input=<tags_input>]
Array of tag names, slugs, or IDs. Default empty.

[--tax_input=<tax_input>]
Array of taxonomy terms keyed by their taxonomy name. Default empty.

Note: In WordPress core, this normally requires a user context to satisfy capability checks. WP-CLI bypasses this for convenience. See https://core.trac.wordpress.org/ticket/19373

[--meta_input=<meta_input>]
Array in JSON format of post meta values keyed by their post meta key. Default empty.

[<file>]
Read post content from <file>. If this value is present, the
`--post_content` argument will be ignored.

Passing `-` as the filename will cause post content to
be read from STDIN.

[--<field>=<value>]
Associative args for the new post. See wp_insert_post().

[--edit]
Immediately open system's editor to write or edit post content.

If content is read from a file, from STDIN, or from the `--post_content`
argument, that text will be loaded into the editor.

[--porcelain]
Output just the new post id.

**EXAMPLES**

# Create post and schedule for future
$ wp post create --post_type=post --post_title='A future post' --post_status=future --post_date='2030-12-01 07:00:00'
Success: Created post 1921.

# Create post with content from given file
$ wp post create ./post-content.txt --post_category=201,345 --post_title='Post from file'
Success: Created post 1922.

# Create a post with multiple meta values.
$ wp post create --post_title='A post' --post_content='Just a small post.' --meta_input='{"key1":"value1","key2":"value2"}'
Success: Created post 1923.

# Create a duplicate post from existing posts.
$ wp post create --from-post=123 --post_title='Different Title'
Success: Created post 2350.

### wp post delete

Deletes an existing post.

~~~
wp post delete <id>... [--force] [--defer-term-counting]
~~~

**OPTIONS**

<id>...
One or more IDs of posts to delete.

[--force]
Skip the trash bin.

[--defer-term-counting]
Recalculate term count in batch, for a performance boost.

**EXAMPLES**

# Delete post skipping trash
$ wp post delete 123 --force
Success: Deleted post 123.

# Delete multiple posts
$ wp post delete 123 456 789
Success: Trashed post 123.
Success: Trashed post 456.
Success: Trashed post 789.

# Delete all pages
$ wp post delete $(wp post list --post_type='page' --format=ids)
Success: Trashed post 1164.
Success: Trashed post 1186.

# Delete all posts in the trash
$ wp post delete $(wp post list --post_status=trash --format=ids)
Success: Deleted post 1268.
Success: Deleted post 1294.

### wp post edit

Launches system editor to edit post content.

~~~
wp post edit <id>
~~~

**OPTIONS**

<id>
The ID of the post to edit.

**EXAMPLES**

# Launch system editor to edit post
$ wp post edit 123

### wp post exists

Verifies whether a post exists.

~~~
wp post exists <id>
~~~

Displays a success message if the post does exist.

**OPTIONS**

<id>
The ID of the post to check.

**EXAMPLES**

# The post exists.
$ wp post exists 1337
Success: Post with ID 1337 exists.
$ echo $?
0

# The post does not exist.
$ wp post exists 10000
$ echo $?
1

### wp post generate

Generates some posts.

~~~
wp post generate [--count=<number>] [--post_type=<type>] [--post_status=<status>] [--post_title=<post_title>] [--post_author=<login>] [--post_date=<yyyy-mm-dd-hh-ii-ss>] [--post_date_gmt=<yyyy-mm-dd-hh-ii-ss>] [--post_content] [--max_depth=<number>] [--format=<format>]
~~~

Creates a specified number of new posts with dummy data.

**OPTIONS**

[--count=<number>]
How many posts to generate?
---
default: 100
---

[--post_type=<type>]
The type of the generated posts.
---
default: post
---

[--post_status=<status>]
The status of the generated posts.
---
default: publish
---

[--post_title=<post_title>]
The post title.
---
default:
---

[--post_author=<login>]
The author of the generated posts.
---
default:
---

[--post_date=<yyyy-mm-dd-hh-ii-ss>]
The date of the post. Default is the current time.

[--post_date_gmt=<yyyy-mm-dd-hh-ii-ss>]
The date of the post in the GMT timezone. Default is the value of --post_date.

[--post_content]
If set, the command reads the post_content from STDIN.

[--max_depth=<number>]
For hierarchical post types, generate child posts down to a certain depth.
---
default: 1
---

[--format=<format>]
Render output in a particular format.
---
default: progress
options:
- progress
- ids
---

**EXAMPLES**

# Generate posts.
$ wp post generate --count=10 --post_type=page --post_date=1999-01-04
Generating posts 100% [================================================] 0:01 / 0:04

# Generate posts with fetched content.
$ curl -N https://loripsum.net/api/5 | wp post generate --post_content --count=10
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2509 100 2509 0 0 616 0 0:00:04 0:00:04 --:--:-- 616
Generating posts 100% [================================================] 0:01 / 0:04

# Add meta to every generated posts.
$ wp post generate --format=ids | xargs -d ' ' -I % wp post meta add % foo bar
Success: Added custom field.
Success: Added custom field.
Success: Added custom field.

### wp post get

Gets details about a post.

~~~
wp post get <id> [--field=<field>] [--fields=<fields>] [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the post to get.

[--field=<field>]
Instead of returning the whole post, returns the value of a single field.

[--fields=<fields>]
Limit the output to specific fields. Defaults to all fields.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
---

**EXAMPLES**

# Save the post content to a file
$ wp post get 123 --field=content > file.txt

# Get the block version of a post (1 = has blocks, 0 = no blocks)
# Requires WordPress 5.0+.
$ wp post get 123 --field=block_version
1

### wp post list

Gets a list of posts.

~~~
wp post list [--<field>=<value>] [--field=<field>] [--fields=<fields>] [--format=<format>]
~~~

Display posts based on all arguments supported by [WP_Query()](https://developer.wordpress.org/reference/classes/wp_query/).
Only shows post types marked as post by default.

**OPTIONS**

[--<field>=<value>]
One or more args to pass to WP_Query.

[--field=<field>]
Prints the value of a single field for each post.

[--fields=<fields>]
Limit the output to specific object fields.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- ids
- json
- count
- yaml
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each post:

* ID
* post_title
* post_name
* post_date
* post_status

These fields are optionally available:

* post_author
* post_date_gmt
* post_content
* post_excerpt
* comment_status
* ping_status
* post_password
* to_ping
* pinged
* post_modified
* post_modified_gmt
* post_content_filtered
* post_parent
* guid
* menu_order
* post_type
* post_mime_type
* comment_count
* filter
* url

**EXAMPLES**

# List post
$ wp post list --field=ID
568
829
1329
1695

# List posts in JSON
$ wp post list --post_type=post --posts_per_page=5 --format=json
[{"ID":1,"post_title":"Hello world!","post_name":"hello-world","post_date":"2015-06-20 09:00:10","post_status":"publish"},{"ID":1178,"post_title":"Markup: HTML Tags and Formatting","post_name":"markup-html-tags-and-formatting","post_date":"2013-01-11 20:22:19","post_status":"draft"}]

# List all pages
$ wp post list --post_type=page --fields=post_title,post_status
+-------------+-------------+
| post_title | post_status |
+-------------+-------------+
| Sample Page | publish |
+-------------+-------------+

# List ids of all pages and posts
$ wp post list --post_type=page,post --format=ids
15 25 34 37 198

# List given posts
$ wp post list --post__in=1,3
+----+--------------+-------------+---------------------+-------------+
| ID | post_title | post_name | post_date | post_status |
+----+--------------+-------------+---------------------+-------------+
| 3 | Lorem Ipsum | lorem-ipsum | 2016-06-01 14:34:36 | publish |
| 1 | Hello world! | hello-world | 2016-06-01 14:31:12 | publish |
+----+--------------+-------------+---------------------+-------------+

# List given post by a specific author
$ wp post list --author=2
+----+-------------------+-------------------+---------------------+-------------+
| ID | post_title | post_name | post_date | post_status |
+----+-------------------+-------------------+---------------------+-------------+
| 14 | New documentation | new-documentation | 2021-06-18 21:05:11 | publish |
+----+-------------------+-------------------+---------------------+-------------+

### wp post meta

Adds, updates, deletes, and lists post custom fields.

~~~
wp post meta
~~~

**EXAMPLES**

# Set post meta
$ wp post meta set 123 _wp_page_template about.php
Success: Updated custom field '_wp_page_template'.

# Get post meta
$ wp post meta get 123 _wp_page_template
about.php

# Update post meta
$ wp post meta update 123 _wp_page_template contact.php
Success: Updated custom field '_wp_page_template'.

# Delete post meta
$ wp post meta delete 123 _wp_page_template
Success: Deleted custom field.

### wp post meta add

Add a meta field.

~~~
wp post meta add <id> <key> [<value>] [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to create.

[<value>]
The value of the meta field. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp post meta clean-duplicates

Cleans up duplicate post meta values on a post.

~~~
wp post meta clean-duplicates <id> <key>
~~~

**OPTIONS**

<id>
ID of the post to clean.

<key>
Meta key to clean up.

**EXAMPLES**

# Delete duplicate post meta.
wp post meta clean-duplicates 1234 enclosure
Success: Cleaned up duplicate 'enclosure' meta values.

### wp post meta delete

Delete a meta field.

~~~
wp post meta delete <id> [<key>] [<value>] [--all]
~~~

**OPTIONS**

<id>
The ID of the object.

[<key>]
The name of the meta field to delete.

[<value>]
The value to delete. If omitted, all rows with key will deleted.

[--all]
Delete all meta for the object.

### wp post meta get

Get meta field value.

~~~
wp post meta get <id> <key> [--single] [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to get.

[--single]
Whether to return a single value.

[--format=<format>]
Get value in a particular format.
---
default: var_export
options:
- var_export
- json
- yaml
---

### wp post meta list

List all metadata associated with an object.

~~~
wp post meta list <id> [--keys=<keys>] [--fields=<fields>] [--format=<format>] [--orderby=<fields>] [--order=<order>] [--unserialize]
~~~

**OPTIONS**

<id>
ID for the object.

[--keys=<keys>]
Limit output to metadata of specific keys.

[--fields=<fields>]
Limit the output to specific row fields. Defaults to id,meta_key,meta_value.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
- count
---

[--orderby=<fields>]
Set orderby which field.
---
default: id
options:
- id
- meta_key
- meta_value
---

[--order=<order>]
Set ascending or descending order.
---
default: asc
options:
- asc
- desc
---

[--unserialize]
Unserialize meta_value output.

### wp post meta patch

Update a nested value for a meta field.

~~~
wp post meta patch <action> <id> <key> <key-path>... [<value>] [--format=<format>]
~~~

**OPTIONS**

<action>
Patch action to perform.
---
options:
- insert
- update
- delete
---

<id>
The ID of the object.

<key>
The name of the meta field to update.

<key-path>...
The name(s) of the keys within the value to locate the value to patch.

[<value>]
The new value. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp post meta pluck

Get a nested value from a meta field.

~~~
wp post meta pluck <id> <key> <key-path>... [--format=<format>]
~~~

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to get.

<key-path>...
The name(s) of the keys within the value to locate the value to pluck.

[--format=<format>]
The output format of the value.
---
default: plaintext
options:
- plaintext
- json
- yaml

### wp post meta update

Update a meta field.

~~~
wp post meta update <id> <key> [<value>] [--format=<format>]
~~~

**Alias:** `set`

**OPTIONS**

<id>
The ID of the object.

<key>
The name of the meta field to update.

[<value>]
The new value. If omitted, the value is read from STDIN.

[--format=<format>]
The serialization format for the value.
---
default: plaintext
options:
- plaintext
- json
---

### wp post revision

Manages post revisions.

~~~
wp post revision
~~~

**EXAMPLES**

# Restore a post revision
$ wp post revision restore 123
Success: Restored revision 123.

# Show diff between two revisions
$ wp post revision diff 123 456

### wp post revision diff

Shows the difference between two revisions.

~~~
wp post revision diff <from> [<to>] [--field=<field>]
~~~

**OPTIONS**

<from>
The 'from' revision ID or post ID.

[<to>]
The 'to' revision ID or post ID. If not provided, compares with the current post.

[--field=<field>]
Compare specific field(s). Default: post_content

**EXAMPLES**

# Show diff between two revisions
$ wp post revision diff 123 456

# Show diff between a revision and the current post
$ wp post revision diff 123

### wp post revision prune

Deletes old post revisions.

~~~
wp post revision prune [<post-id>...] [--latest=<limit>] [--earliest=<limit>] [--yes]
~~~

**OPTIONS**

[<post-id>...]
One or more post IDs to prune revisions for. If not provided, prunes revisions for all posts.

[--latest=<limit>]
Keep only the latest N revisions per post. Older revisions will be deleted.

[--earliest=<limit>]
Keep only the earliest N revisions per post. Newer revisions will be deleted.

[--yes]
Skip confirmation prompt.

**EXAMPLES**

# Delete all but the latest 5 revisions for post 123
$ wp post revision prune 123 --latest=5
Success: Deleted 3 revisions for post 123.

# Delete all but the latest 5 revisions for all posts
$ wp post revision prune --latest=5
Success: Deleted 150 revisions across 30 posts.

# Delete all but the earliest 2 revisions for posts 123 and 456
$ wp post revision prune 123 456 --earliest=2
Success: Deleted 5 revisions for post 123.
Success: Deleted 3 revisions for post 456.

### wp post revision restore

Restores a post revision.

~~~
wp post revision restore <revision_id>
~~~

**OPTIONS**

<revision_id>
The revision ID to restore.

**EXAMPLES**

# Restore a post revision
$ wp post revision restore 123
Success: Restored revision 123.

### wp post term

Adds, updates, removes, and lists post terms.

~~~
wp post term
~~~

**EXAMPLES**

# Set category post term `test` to the post ID 123
$ wp post term set 123 test category
Success: Set term.

# Set category post terms `test` and `apple` to the post ID 123
$ wp post term set 123 test apple category
Success: Set terms.

# List category post terms for the post ID 123
$ wp post term list 123 category --fields=term_id,slug
+---------+-------+
| term_id | slug |
+---------+-------+
| 2 | apple |
| 3 | test |
+----------+------+

# Remove category post terms `test` and `apple` for the post ID 123
$ wp post term remove 123 category test apple
Success: Removed terms.

### wp post term add

Add a term to an object.

~~~
wp post term add <id> <taxonomy> <term>... [--by=<field>]
~~~

Append the term to the existing set of terms on the object.

**OPTIONS**

<id>
The ID of the object.

<taxonomy>
The name of the taxonomy type to be added.

<term>...
The slug of the term or terms to be added.

[--by=<field>]
Explicitly handle the term value as a slug or id.
---
default: slug
options:
- slug
- id
---

### wp post term list

List all terms associated with an object.

~~~
wp post term list <id> <taxonomy>... [--field=<field>] [--fields=<fields>] [--format=<format>]
~~~

**OPTIONS**

<id>
ID for the object.

<taxonomy>...
One or more taxonomies to list.

[--field=<field>]
Prints the value of a single field for each term.

[--fields=<fields>]
Limit the output to specific row fields.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
- count
- ids
---

**AVAILABLE FIELDS**

These fields will be displayed by default for each term:

* term_id
* name
* slug
* taxonomy

These fields are optionally available:

* term_taxonomy_id
* description
* term_group
* parent
* count

### wp post term remove

Remove a term from an object.

~~~
wp post term remove <id> <taxonomy> [<term>...] [--by=<field>] [--all]
~~~

**OPTIONS**

<id>
The ID of the object.

<taxonomy>
The name of the term's taxonomy.

[<term>...]
The slug of the term or terms to be removed from the object.

[--by=<field>]
Explicitly handle the term value as a slug or id.
---
default: slug
options:
- slug
- id
---

[--all]
Remove all terms from the object.

### wp post term set

Set object terms.

~~~
wp post term set <id> <taxonomy> <term>... [--by=<field>]
~~~

Replaces existing terms on the object.

**OPTIONS**

<id>
The ID of the object.

<taxonomy>
The name of the taxonomy type to be updated.

<term>...
The slug of the term or terms to be updated.

[--by=<field>]
Explicitly handle the term value as a slug or id.
---
default: slug
options:
- slug
- id
---

### wp post update

Updates one or more existing posts.

~~~
wp post update <id>... [--post_author=<post_author>] [--post_date=<post_date>] [--post_date_gmt=<post_date_gmt>] [--post_content=<post_content>] [--post_content_filtered=<post_content_filtered>] [--post_title=<post_title>] [--post_excerpt=<post_excerpt>] [--post_status=<post_status>] [--post_type=<post_type>] [--comment_status=<comment_status>] [--ping_status=<ping_status>] [--post_password=<post_password>] [--post_name=<post_name>] [--to_ping=<to_ping>] [--pinged=<pinged>] [--post_modified=<post_modified>] [--post_modified_gmt=<post_modified_gmt>] [--post_parent=<post_parent>] [--menu_order=<menu_order>] [--post_mime_type=<post_mime_type>] [--guid=<guid>] [--post_category=<post_category>] [--tags_input=<tags_input>] [--tax_input=<tax_input>] [--meta_input=<meta_input>] [<file>] --<field>=<value> [--defer-term-counting]
~~~

**OPTIONS**

<id>...
One or more IDs of posts to update.

[--post_author=<post_author>]
The ID of the user who added the post. Default is the current user ID.

[--post_date=<post_date>]
The date of the post. Default is the current time.

[--post_date_gmt=<post_date_gmt>]
The date of the post in the GMT timezone. Default is the value of $post_date.

[--post_content=<post_content>]
The post content. Default empty.

[--post_content_filtered=<post_content_filtered>]
The filtered post content. Default empty.

[--post_title=<post_title>]
The post title. Default empty.

[--post_excerpt=<post_excerpt>]
The post excerpt. Default empty.

[--post_status=<post_status>]
The post status. Default 'draft'.

[--post_type=<post_type>]
The post type. Default 'post'.

[--comment_status=<comment_status>]
Whether the post can accept comments. Accepts 'open' or 'closed'. Default is the value of 'default_comment_status' option.

[--ping_status=<ping_status>]
Whether the post can accept pings. Accepts 'open' or 'closed'. Default is the value of 'default_ping_status' option.

[--post_password=<post_password>]
The password to access the post. Default empty.

[--post_name=<post_name>]
The post name. Default is the sanitized post title when creating a new post.

[--to_ping=<to_ping>]
Space or carriage return-separated list of URLs to ping. Default empty.

[--pinged=<pinged>]
Space or carriage return-separated list of URLs that have been pinged. Default empty.

[--post_modified=<post_modified>]
The date when the post was last modified. Default is the current time.

[--post_modified_gmt=<post_modified_gmt>]
The date when the post was last modified in the GMT timezone. Default is the current time.

[--post_parent=<post_parent>]
Set this for the post it belongs to, if any. Default 0.

[--menu_order=<menu_order>]
The order the post should be displayed in. Default 0.

[--post_mime_type=<post_mime_type>]
The mime type of the post. Default empty.

[--guid=<guid>]
Global Unique ID for referencing the post. Default empty.

[--post_category=<post_category>]
Array of category names, slugs, or IDs. Defaults to value of the 'default_category' option.

[--tags_input=<tags_input>]
Array of tag names, slugs, or IDs. Default empty.

[--tax_input=<tax_input>]
Array of taxonomy terms keyed by their taxonomy name. Default empty.

Note: In WordPress core, this normally requires a user context to satisfy capability checks. WP-CLI bypasses this for convenience. See https://core.trac.wordpress.org/ticket/19373

[--meta_input=<meta_input>]
Array in JSON format of post meta values keyed by their post meta key. Default empty.

[<file>]
Read post content from <file>. If this value is present, the
`--post_content` argument will be ignored.

Passing `-` as the filename will cause post content to
be read from STDIN.

--<field>=<value>
One or more fields to update. See wp_insert_post().

[--defer-term-counting]
Recalculate term count in batch, for a performance boost.

**EXAMPLES**

$ wp post update 123 --post_name=something --post_status=draft
Success: Updated post 123.

# Update a post with multiple meta values.
$ wp post update 123 --meta_input='{"key1":"value1","key2":"value2"}'
Success: Updated post 123.

# Update multiple posts at once.
$ wp post update 123 456 --post_author=789
Success: Updated post 123.
Success: Updated post 456.

# Update all posts of a given post type at once.
$ wp post update $(wp post list --post_type=page --format=ids) --post_author=123
Success: Updated post 123.
Success: Updated post 456.

### wp post url-to-id

Gets the post ID for a given URL.

~~~
wp post url-to-id <url>
~~~

**OPTIONS**

<url>
The URL of the post to get.

**EXAMPLES**

# Get post ID by URL
$ wp post url-to-id https://example.com/?p=1
1

### wp post has-blocks

Checks if a post contains any blocks.

~~~
wp post has-blocks <id>
~~~

Exits with return code 0 if the post contains blocks,
or return code 1 if it does not.

**OPTIONS**

<id>
The ID of the post to check.

**EXAMPLES**

# Check if post contains blocks.
$ wp post has-blocks 123
Success: Post 123 contains blocks.

# Check a classic (non-block) post.
$ wp post has-blocks 456
Error: Post 456 does not contain blocks.

# Use in a shell conditional.
$ if wp post has-blocks 123 2>/dev/null; then
> echo "Post uses blocks"
> fi

### wp post has-block

Checks if a post contains a specific block type.

~~~
wp post has-block <id> <block-name>
~~~

Exits with return code 0 if the post contains the specified block,
or return code 1 if it does not.

**OPTIONS**

<id>
The ID of the post to check.

<block-name>
The block type name to check for (e.g., 'core/paragraph').

**EXAMPLES**

# Check if post contains a paragraph block.
$ wp post has-block 123 core/paragraph
Success: Post 123 contains block 'core/paragraph'.

# Check for a heading block.
$ wp post has-block 123 core/heading
Success: Post 123 contains block 'core/heading'.

# Check for a block that doesn't exist.
$ wp post has-block 123 core/gallery
Error: Post 123 does not contain block 'core/gallery'.

# Check for a custom block from a plugin.
$ wp post has-block 123 my-plugin/custom-block

### wp post block

Manages blocks within post content.

~~~
wp post block
~~~

Provides commands for inspecting, manipulating, and managing
Gutenberg blocks in post content.

**EXAMPLES**

# List all blocks in a post.
$ wp post block list 123
+------------------+-------+
| blockName | count |
+------------------+-------+
| core/paragraph | 2 |
| core/heading | 1 |
+------------------+-------+

# Parse blocks in a post to JSON.
$ wp post block parse 123 --format=json

# Insert a paragraph block.
$ wp post block insert 123 core/paragraph --content="Hello World"

### wp post block clone

Clones a block within a post.

~~~
wp post block clone <id> <source-index> [--position=<position>] [--porcelain]
~~~

Duplicates an existing block and inserts it at a specified position.

**OPTIONS**

<id>
The ID of the post.

<source-index>
Index of the block to clone (0-indexed).

[--position=<position>]
Where to insert the cloned block. Accepts 'after', 'before', 'start', 'end', or a numeric index.
---
default: after
---

[--porcelain]
Output just the new block index.

**EXAMPLES**

# Clone a block and insert immediately after it (default).
$ wp post block clone 123 2
Success: Cloned block to index 3 in post 123.

# Clone the first block and insert immediately before it.
$ wp post block clone 123 0 --position=before
Success: Cloned block to index 0 in post 123.

# Clone a block and insert at the end of the post.
$ wp post block clone 123 0 --position=end
Success: Cloned block to index 5 in post 123.

# Clone a block and insert at the start of the post.
$ wp post block clone 123 3 --position=start
Success: Cloned block to index 0 in post 123.

# Clone and get just the new block index for scripting.
$ wp post block clone 123 1 --porcelain
2

# Duplicate the hero section (first block) at the end for a footer.
$ wp post block clone 123 0 --position=end
Success: Cloned block to index 10 in post 123.

### wp post block count

Counts blocks across multiple posts.

~~~
wp post block count [<id>...] [--block=<block-name>] [--post-type=<type>] [--post-status=<status>] [--format=<format>]
~~~

Analyzes block usage across posts for site-wide reporting.

**OPTIONS**

[<id>...]
Optional post IDs. If not specified, queries all posts.

[--block=<block-name>]
Only count specific block type.

[--post-type=<type>]
Limit to specific post type(s). Comma-separated.
---
default: post,page
---

[--post-status=<status>]
Post status to include.
---
default: publish
---

[--format=<format>]
Output format.
---
default: table
options:
- table
- json
- csv
- yaml
- count
---

**EXAMPLES**

# Count all blocks across published posts and pages.
$ wp post block count
+------------------+-------+-------+
| blockName | count | posts |
+------------------+-------+-------+
| core/paragraph | 1542 | 234 |
| core/heading | 523 | 198 |
| core/image | 312 | 156 |
+------------------+-------+-------+

# Count blocks in specific posts only.
$ wp post block count 123 456 789
+------------------+-------+-------+
| blockName | count | posts |
+------------------+-------+-------+
| core/paragraph | 8 | 3 |
| core/heading | 3 | 2 |
+------------------+-------+-------+

# Count only paragraph blocks across the site.
$ wp post block count --block=core/paragraph --format=count
1542

# Count blocks in a custom post type.
$ wp post block count --post-type=product

# Count blocks in multiple post types.
$ wp post block count --post-type=post,page,product

# Count blocks including drafts.
$ wp post block count --post-status=draft

# Get count as JSON for further processing.
$ wp post block count --format=json
[{"blockName":"core/paragraph","count":1542,"posts":234}]

# Get total number of unique block types used.
$ wp post block count --format=count
15

### wp post block export

Exports block content to a file.

~~~
wp post block export <id> [--file=<file>] [--format=<format>] [--raw]
~~~

Exports blocks from a post to a file for backup or migration.

**OPTIONS**

<id>
The ID of the post to export blocks from.

[--file=<file>]
Output file path. If not specified, outputs to STDOUT.

[--format=<format>]
Export format.
---
default: json
options:
- json
- yaml
- html
---

[--raw]
Include innerHTML in JSON/YAML output.

**EXAMPLES**

# Export blocks to a JSON file for backup.
$ wp post block export 123 --file=blocks.json
Success: Exported 5 blocks to blocks.json

# Export blocks to STDOUT as JSON.
$ wp post block export 123
{
"version": "1.0",
"generator": "wp-cli/entity-command",
"post_id": 123,
"exported_at": "2024-12-10T12:00:00+00:00",
"blocks": [...]
}

# Export as YAML format.
$ wp post block export 123 --format=yaml
version: "1.0"
generator: wp-cli/entity-command
blocks:
- blockName: core/paragraph
attrs: []

# Export rendered HTML (final output, not block structure).
$ wp post block export 123 --format=html --file=content.html
Success: Exported 5 blocks to content.html

# Export with raw innerHTML included for complete backup.
$ wp post block export 123 --raw --file=blocks-full.json
Success: Exported 5 blocks to blocks-full.json

# Pipe export to another command.
$ wp post block export 123 | jq '.blocks[].blockName'

### wp post block extract

Extracts data from blocks.

~~~
wp post block extract <id> [--block=<block-name>] [--index=<index>] [--attr=<attr>] [--content] [--format=<format>]
~~~

Extracts specific attribute values or content from blocks for scripting.

**OPTIONS**

<id>
The ID of the post.

[--block=<block-name>]
Filter by block type.

[--index=<index>]
Get from specific block index.

[--attr=<attr>]
Extract specific attribute value.

[--content]
Extract innerHTML content.

[--format=<format>]
Output format.
---
default: json
options:
- json
- yaml
- csv
- ids
---

**EXAMPLES**

# Extract all image IDs from the post (one per line).
$ wp post block extract 123 --block=core/image --attr=id --format=ids
456
789
1024

# Extract all image URLs as JSON array.
$ wp post block extract 123 --block=core/image --attr=url --format=json
["https://example.com/img1.jpg","https://example.com/img2.jpg"]

# Extract text content from all headings.
$ wp post block extract 123 --block=core/heading --content --format=ids
Introduction
Getting Started
Conclusion

# Get the heading level from the first block.
$ wp post block extract 123 --index=0 --attr=level --format=ids
2

# Extract all heading levels as CSV.
$ wp post block extract 123 --block=core/heading --attr=level --format=csv
2,3,3,2

# Extract paragraph content as YAML.
$ wp post block extract 123 --block=core/paragraph --content --format=yaml
- "First paragraph text"
- "Second paragraph text"

# Get all button URLs for link checking.
$ wp post block extract 123 --block=core/button --attr=url --format=ids
https://example.com/signup
https://example.com/learn-more

# Extract cover block image IDs for media audit.
$ wp post block extract 123 --block=core/cover --attr=id --format=json

### wp post block get

Gets a single block by index.

~~~
wp post block get <id> <index> [--raw] [--format=<format>]
~~~

Retrieves the full structure of a block at the specified position.

**OPTIONS**

<id>
The ID of the post.

<index>
The block index (0-indexed).

[--raw]
Include innerHTML in output.

[--format=<format>]
Render output in a particular format.
---
default: json
options:
- json
- yaml
---

**EXAMPLES**

# Get the first block in a post.
$ wp post block get 123 0
{
"blockName": "core/paragraph",
"attrs": {},
"innerBlocks": []
}

# Get the third block (index 2) with attributes.
$ wp post block get 123 2
{
"blockName": "core/heading",
"attrs": {
"level": 2
},
"innerBlocks": []
}

# Get block as YAML format.
$ wp post block get 123 1 --format=yaml
blockName: core/image
attrs:
id: 456
sizeSlug: large
innerBlocks: []

# Get block with raw HTML content included.
$ wp post block get 123 0 --raw
{
"blockName": "core/paragraph",
"attrs": {},
"innerBlocks": [],
"innerHTML": "<p>Hello World</p>",
"innerContent": ["<p>Hello World</p>"]
}

### wp post block import

Imports blocks from a file into a post.

~~~
wp post block import <id> [--file=<file>] [--position=<position>] [--replace] [--porcelain]
~~~

Imports blocks from a JSON or YAML file into a post's content.

**OPTIONS**

<id>
The ID of the post to import blocks into.

[--file=<file>]
Input file path. If not specified, reads from STDIN.

[--position=<position>]
Where to insert imported blocks. Accepts 'start', 'end', or a numeric index.
---
default: end
---

[--replace]
Replace all existing blocks instead of appending.

[--porcelain]
Output just the number of blocks imported.

**EXAMPLES**

# Import blocks from a JSON file, append to end of post.
$ wp post block import 123 --file=blocks.json
Success: Imported 5 blocks into post 123.

# Import blocks at the beginning of the post.
$ wp post block import 123 --file=blocks.json --position=start
Success: Imported 5 blocks into post 123.

# Replace all existing content with imported blocks.
$ wp post block import 123 --file=blocks.json --replace
Success: Imported 5 blocks into post 123.

# Import from STDIN (piped from another command).
$ cat blocks.json | wp post block import 123
Success: Imported 5 blocks into post 123.

# Copy blocks from one post to another.
$ wp post block export 123 | wp post block import 456
Success: Imported 5 blocks into post 456.

# Import YAML format.
$ wp post block import 123 --file=blocks.yaml
Success: Imported 3 blocks into post 123.

# Get just the count of imported blocks for scripting.
$ wp post block import 123 --file=blocks.json --porcelain
5

### wp post block insert

Inserts a block into a post at a specified position.

~~~
wp post block insert <id> <block-name> [--content=<content>] [--attrs=<attrs>] [--position=<position>] [--porcelain]
~~~

Adds a new block to the post content. By default, the block is
appended to the end of the post.

**OPTIONS**

<id>
The ID of the post to modify.

<block-name>
The block type name (e.g., 'core/paragraph').

[--content=<content>]
The inner content/HTML for the block.

[--attrs=<attrs>]
Block attributes as JSON.

[--position=<position>]
Position to insert the block (0-indexed). Use 'start' or 'end'.
---
default: end
---

[--porcelain]
Output just the post ID.

**EXAMPLES**

# Insert a paragraph block at the end of the post.
$ wp post block insert 123 core/paragraph --content="Hello World"
Success: Inserted block into post 123.

# Insert a level-2 heading at the start.
$ wp post block insert 123 core/heading --content="My Title" --attrs='{"level":2}' --position=start
Success: Inserted block into post 123.

# Insert an image block at position 2.
$ wp post block insert 123 core/image --attrs='{"id":456,"url":"https://example.com/image.jpg"}' --position=2

# Insert a separator block.
$ wp post block insert 123 core/separator

### wp post block list

Lists blocks in a post with counts.

~~~
wp post block list <id> [--nested] [--format=<format>]
~~~

Displays a summary of block types used in the post and how many
times each block type appears.

**OPTIONS**

<id>
The ID of the post to analyze.

[--nested]
Include nested/inner blocks in the list.

[--format=<format>]
Render output in a particular format.
---
default: table
options:
- table
- csv
- json
- yaml
- count
---

**EXAMPLES**

# List blocks with counts.
$ wp post block list 123
+------------------+-------+
| blockName | count |
+------------------+-------+
| core/paragraph | 5 |
| core/heading | 2 |
| core/image | 1 |
+------------------+-------+

# List blocks as JSON.
$ wp post block list 123 --format=json
[{"blockName":"core/paragraph","count":5}]

# Include nested blocks (e.g., blocks inside columns or groups).
$ wp post block list 123 --nested

# Get the number of unique block types.
$ wp post block list 123 --format=count
3

### wp post block move

Moves a block from one position to another.

~~~
wp post block move <id> <from-index> <to-index> [--porcelain]
~~~

Reorders blocks within the post by moving a block from one index to another.

**OPTIONS**

<id>
The ID of the post.

<from-index>
Current block index (0-indexed).

<to-index>
Target position index (0-indexed).

[--porcelain]
Output just the post ID.

**EXAMPLES**

# Move the first block to the third position.
$ wp post block move 123 0 2
Success: Moved block from index 0 to index 2 in post 123.

# Move the last block (index 4) to the beginning.
$ wp post block move 123 4 0
Success: Moved block from index 4 to index 0 in post 123.

# Move a heading block from position 3 to position 1.
$ wp post block move 123 3 1
Success: Moved block from index 3 to index 1 in post 123.

# Move block and get post ID for scripting.
$ wp post block move 123 2 0 --porcelain
123

### wp post block parse

Parses and displays the block structure of a post.

~~~
wp post block parse <id> [--raw] [--format=<format>]
~~~

Outputs the parsed block structure as JSON or YAML. By default,
innerHTML is stripped from the output for readability.

**OPTIONS**

<id>
The ID of the post to parse.

[--raw]
Include raw innerHTML in output.

[--format=<format>]
Render output in a particular format.
---
default: json
options:
- json
- yaml
---

**EXAMPLES**

# Parse blocks to JSON.
$ wp post block parse 123
[
{
"blockName": "core/paragraph",
"attrs": {}
}
]

# Parse blocks to YAML format.
$ wp post block parse 123 --format=yaml
-
blockName: core/paragraph
attrs: { }

# Parse blocks including raw HTML content.
$ wp post block parse 123 --raw

### wp post block remove

Removes blocks from a post by name or index.

~~~
wp post block remove <id> [<block-name>] [--index=<index>] [--all] [--porcelain]
~~~

Removes one or more blocks from the post content. Blocks can be
removed by their type name or by their position index.

**OPTIONS**

<id>
The ID of the post to modify.

[<block-name>]
The block type name to remove (e.g., 'core/paragraph').

[--index=<index>]
Remove block at specific index (0-indexed). Can be comma-separated for multiple indices.

[--all]
Remove all blocks of the specified type.

[--porcelain]
Output just the number of blocks removed.

**EXAMPLES**

# Remove the first block (index 0).
$ wp post block remove 123 --index=0
Success: Removed 1 block from post 123.

# Remove the first paragraph block found.
$ wp post block remove 123 core/paragraph
Success: Removed 1 block from post 123.

# Remove all paragraph blocks.
$ wp post block remove 123 core/paragraph --all
Success: Removed 5 blocks from post 123.

# Remove blocks at multiple indices.
$ wp post block remove 123 --index=0,2,4
Success: Removed 3 blocks from post 123.

# Remove all image blocks and get count.
$ wp post block remove 123 core/image --all --porcelain
2

### wp post block replace

Replaces blocks in a post.

~~~
wp post block replace <id> <old-block-name> <new-block-name> [--attrs=<attrs>] [--content=<content>] [--all] [--porcelain]
~~~

Replaces blocks of one type with blocks of another type. Can also
be used to update block attributes without changing the block type.

**OPTIONS**

<id>
The ID of the post to modify.

<old-block-name>
The block type name to replace.

<new-block-name>
The new block type name.

[--attrs=<attrs>]
New block attributes as JSON.

[--content=<content>]
New block content. Use '{content}' to preserve original content.

[--all]
Replace all matching blocks. By default, only the first match is replaced.

[--porcelain]
Output just the number of blocks replaced.

**EXAMPLES**

# Replace the first paragraph block with a heading.
$ wp post block replace 123 core/paragraph core/heading
Success: Replaced 1 block in post 123.

# Replace all paragraphs with preformatted blocks, keeping content.
$ wp post block replace 123 core/paragraph core/preformatted --content='{content}' --all
Success: Replaced 3 blocks in post 123.

# Change all h2 headings to h3.
$ wp post block replace 123 core/heading core/heading --attrs='{"level":3}' --all

# Replace and get count for scripting.
$ wp post block replace 123 core/quote core/pullquote --all --porcelain
2

### wp post block render

Renders blocks from a post to HTML.

~~~
wp post block render <id> [--block=<block-name>]
~~~

Outputs the rendered HTML of blocks in a post. This uses WordPress's
block rendering system to produce the final HTML output.

**OPTIONS**

<id>
The ID of the post to render.

[--block=<block-name>]
Only render blocks of this type.

**EXAMPLES**

# Render all blocks to HTML.
$ wp post block render 123
<p>Hello World</p>
<h2>My Heading</h2>

# Render only paragraph blocks.
$ wp post block render 123 --block=core/paragraph
<p>Hello World</p>

# Render only heading blocks.
$ wp post block render 123 --block=core/heading

### wp post block update

Updates a block's attributes or content by index.

~~~
wp post block update <id> <index> [--attrs=<attrs>] [--content=<content>] [--replace-attrs] [--porcelain]
~~~

Modifies a specific block without changing its type. For blocks where
attributes are reflected in HTML (like heading levels), the HTML is
automatically updated to match the new attributes.

**OPTIONS**

<id>
The ID of the