How do I pass an array as an argument to a WP-CLI command?

I want to use WP-CLI to create some new posts with custom taxonomy terms assigned. The challenge is that wp_insert_post’s tax_input argument only accepts arrays, which I would have to specify on the command line. According to the codex, here is the format required:

$post = array(
    'tax_input' => [ array( 'taxonomy_name' => array( 'term', 'term2', 'term3' ) ) ] // support for custom taxonomies
}

But I need something like this:

wp post create --post_type=lecture --post_title="Test Post #1" --tax-input=[BIG FAT ARRAY]

So my idea was to write a PHP script that executes the WP-CLI command with the array serialized:

//DEFINE VARIABLES
$post_title = "Test Post #1";
$tax_items = array( 9,11,17 );
$tax_input = array( 'course' => $tax_items );

//SERIALIZE THIS ARRAY
$tax_escaped = escapeshellarg(serialize($tax_input));

//WRITE THE COMMAND
$exec_string = 'wp post create --post_type=lecture --post_status=publish --post_title="%1$s" --tax_input=%2$s --porcelain';
$exec_command = sprintf($exec_string, $post_title, $tax_escaped );
$post_id = shell_exec($exec_command);

//THE OUTPUT
//wp post create --post_type=lecture --post_status=publish --post_title="Test Post #1" --tax_input="a:1:{s:5:"class";a:3:{i:0;i:9;i:1;i:11;i:2;i:17;}}" --porcelain

//RELATE THE NEW POST TO THE TAXONOMY TERMS
wp_set_object_terms( $post_id, $tax_items,'course');

Alas, this doesn’t work. It creates the new post alright, but it fails to assign the ‘course’ taxonomy categories I want. Any help would be appreciated.

I know that this overall strategy works, because I succeeded in creating and taxonomizing my posts using wp_insert_posts. So this exercise is for educational purposes and future reference.

2 Answers
2

This is probably impossible since WP-CLI pass the arguments directly to wp_insert_posts. I’m automating this with wp eval. For example:

wp eval 'wp_set_object_terms(12 , array(1, 2, 3), "course");'

The post id can be obtained when you create the post with --porcelain:

wp post create ... --porcelain

Or by normal query with post title:

wp eval 'wp_set_object_terms(get_page_by_title("Test Post #1", OBJECT, "lecture")->ID, array(1, 2, 3), "course");'

Leave a Comment