wp-cli / search-replace-command

Searches/replaces strings in the database.
MIT License
57 stars 45 forks source link

Limit search-replace in DB --wp_db_id="wp_posts:1234" (New command parameter) #142

Open camya opened 4 years ago

camya commented 4 years ago

I often want to apply the wp search-replace command to only one single database record. (Sometimes for testing, sometimes, because I know, that I only have to replace data in one post.) Most often it's a single post ID in wp_posts.

Current situation:

The following command makes a dry run to replace "each and every" match of class="old". It's not possible to limit it to one id of a specific WordPress table.

wp search-replace 'class="old"' 'class="new"' --log --dry-run

Feature request

Add a new command parameter (--wp_db_id="") to set the database table name and the id of a record in order to limit the search-replace command.

--wp_db_id="wp_posts:123"

The correct id field for each WordPress entity is mapped automatically internally. See example below.

Mapping example

--wp_db_id="{WordPress table name}:{id}"

New command demo

The new command looks like this. It only replaces the record with wp_options.option_id=789.

wp search-replace 'class="old"' 'class="new"' --wp_db_id="wp_options:789" --log --dry-run

Exra feature: Comma separated list of ids

May it's also possible, to add more than one id.

--wp_db_id="wp_terms:1823,1233,2399"

schlessera commented 4 years ago

I think the idea has merit, but I'm not too sure about the naming.

We can already limit the search&replace operation to a single (or a set of) table(s) by just appending the table name as a positional argument.

So all we'd need would be to add a --rows=<ids...> field instead.

Sample use case:

# Your example above with the new syntax:
wp search-replace 'class="old"' 'class="new"' wp_options --row=789 --log --dry-run

# Multiple tables and multiple rows possible:
wp search-replace "old" "new" wp_posts wp_post_meta --rows=1,2,3

What do you think about that syntax?

camya commented 4 years ago

Hi Alain. Nice to meet you.

For sure, the syntax is strange. I think, the entiy and id have to be connected together in one command parameter in order to avoid strage side effects.

In your 2nd example, this means that the 6 records will be updated (if there is a match.)

Updates these records.

I guess, this could easily update the wrong records.

But I like the --rows idea nevertheless.

camya commented 4 years ago

Idea: --rows supports only one table

The --rows=<ids...> parameter is only allowed in connection with ONE table.

If the user ads more than one table to the command, it throws an error message.

"--rows= only works with one table. Too many tables set in command."

fancsali commented 3 years ago

I just want to say, I just spent hours with doing search and replace by hand, so I can only change the latest revision of one of my huge posts.

So, this feature would be highly appreciated...

danielbachhuber commented 10 months ago

Open to considering this if we can figure out the naming!