Skip to content

Commit 35fe11a

Browse files
Add wp post meta clean-duplicates <id> <key> command (#366)
Co-authored-by: Daniel Bachhuber <[email protected]>
1 parent 5addbb4 commit 35fe11a

File tree

5 files changed

+250
-92
lines changed

5 files changed

+250
-92
lines changed

README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2518,6 +2518,30 @@ wp post meta add <id> <key> [<value>] [--format=<format>]
25182518

25192519

25202520

2521+
### wp post meta clean-duplicates
2522+
2523+
Cleans up duplicate post meta values on a post.
2524+
2525+
~~~
2526+
wp post meta clean-duplicates <id> <key>
2527+
~~~
2528+
2529+
**OPTIONS**
2530+
2531+
<id>
2532+
ID of the post to clean.
2533+
2534+
<key>
2535+
Meta key to clean up.
2536+
2537+
**EXAMPLES**
2538+
2539+
# Delete duplicate post meta.
2540+
wp post meta clean-duplicates 1234 enclosure
2541+
Success: Cleaned up duplicate 'enclosure' meta values.
2542+
2543+
2544+
25212545
### wp post meta delete
25222546

25232547
Delete a meta field.

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
"post list",
102102
"post meta",
103103
"post meta add",
104+
"post meta clean-duplicates",
104105
"post meta delete",
105106
"post meta get",
106107
"post meta list",
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
Feature: Clean up duplicate post meta values
2+
3+
Scenario: Clean up duplicate post meta values.
4+
Given a WP install
5+
And a session_no file:
6+
"""
7+
n
8+
"""
9+
And a session_yes file:
10+
"""
11+
y
12+
"""
13+
14+
When I run `wp post meta add 1 foo bar`
15+
Then STDOUT should be:
16+
"""
17+
Success: Added custom field.
18+
"""
19+
20+
When I run the previous command again
21+
Then the return code should be 0
22+
23+
When I run the previous command again
24+
Then the return code should be 0
25+
26+
When I run `wp post meta list 1 --keys=foo`
27+
Then STDOUT should be a table containing rows:
28+
| post_id | meta_key | meta_value |
29+
| 1 | foo | bar |
30+
| 1 | foo | bar |
31+
| 1 | foo | bar |
32+
33+
When I run `wp post meta clean-duplicates 1 foo < session_no`
34+
# Check for contains only, as the string contains a trailing space.
35+
Then STDOUT should contain:
36+
"""
37+
Are you sure you want to delete 2 duplicate meta values and keep 1 valid meta value? [y/n]
38+
"""
39+
40+
When I run `wp post meta list 1 --keys=foo --format=count`
41+
Then STDOUT should be:
42+
"""
43+
3
44+
"""
45+
46+
When I run `wp post meta clean-duplicates 1 foo < session_yes`
47+
Then STDOUT should contain:
48+
"""
49+
Cleaned up duplicate 'foo' meta values.
50+
"""
51+
52+
When I try the previous command again
53+
Then STDOUT should contain:
54+
"""
55+
Success: Nothing to clean up: found 1 valid meta value and 0 duplicates.
56+
"""
57+
58+
When I try `wp post meta clean-duplicates 1 food`
59+
Then STDERR should be:
60+
"""
61+
Error: No meta values found for 'food'.
62+
"""
63+
And the return code should be 1

features/post-meta.feature

Lines changed: 84 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -59,87 +59,87 @@ Feature: Manage post custom fields
5959

6060
When I run `wp post meta list 1`
6161
Then STDOUT should be a table containing rows:
62-
| post_id | meta_key | meta_value |
63-
| 1 | apple | banana |
64-
| 1 | apple | banana |
65-
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
62+
| post_id | meta_key | meta_value |
63+
| 1 | apple | banana |
64+
| 1 | apple | banana |
65+
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
6666

6767
When I run `wp post meta list 1 --unserialize`
6868
Then STDOUT should be a table containing rows:
69-
| post_id | meta_key | meta_value |
70-
| 1 | apple | banana |
71-
| 1 | apple | banana |
72-
| 1 | banana | ["apple","apple"] |
69+
| post_id | meta_key | meta_value |
70+
| 1 | apple | banana |
71+
| 1 | apple | banana |
72+
| 1 | banana | ["apple","apple"] |
7373

7474
When I run `wp post meta list 1 --orderby=id --order=desc`
7575
Then STDOUT should be a table containing rows:
76-
| post_id | meta_key | meta_value |
77-
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
78-
| 1 | apple | banana |
79-
| 1 | apple | banana |
76+
| post_id | meta_key | meta_value |
77+
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
78+
| 1 | apple | banana |
79+
| 1 | apple | banana |
8080

8181
When I run `wp post meta list 1 --orderby=id --order=desc --unserialize`
8282
Then STDOUT should be a table containing rows:
83-
| post_id | meta_key | meta_value |
84-
| 1 | banana | ["apple","apple"] |
85-
| 1 | apple | banana |
86-
| 1 | apple | banana |
83+
| post_id | meta_key | meta_value |
84+
| 1 | banana | ["apple","apple"] |
85+
| 1 | apple | banana |
86+
| 1 | apple | banana |
8787

8888
When I run `wp post meta list 1 --orderby=meta_key --order=asc`
8989
Then STDOUT should be a table containing rows:
90-
| post_id | meta_key | meta_value |
91-
| 1 | apple | banana |
92-
| 1 | apple | banana |
93-
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
90+
| post_id | meta_key | meta_value |
91+
| 1 | apple | banana |
92+
| 1 | apple | banana |
93+
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
9494

9595
When I run `wp post meta list 1 --orderby=meta_key --order=asc --unserialize`
9696
Then STDOUT should be a table containing rows:
97-
| post_id | meta_key | meta_value |
98-
| 1 | apple | banana |
99-
| 1 | apple | banana |
100-
| 1 | banana | ["apple","apple"] |
97+
| post_id | meta_key | meta_value |
98+
| 1 | apple | banana |
99+
| 1 | apple | banana |
100+
| 1 | banana | ["apple","apple"] |
101101

102102
When I run `wp post meta list 1 --orderby=meta_key --order=desc`
103103
Then STDOUT should be a table containing rows:
104-
| post_id | meta_key | meta_value |
105-
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
106-
| 1 | apple | banana |
107-
| 1 | apple | banana |
104+
| post_id | meta_key | meta_value |
105+
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
106+
| 1 | apple | banana |
107+
| 1 | apple | banana |
108108

109109
When I run `wp post meta list 1 --orderby=meta_key --order=desc --unserialize`
110110
Then STDOUT should be a table containing rows:
111-
| post_id | meta_key | meta_value |
112-
| 1 | banana | ["apple","apple"] |
113-
| 1 | apple | banana |
114-
| 1 | apple | banana |
111+
| post_id | meta_key | meta_value |
112+
| 1 | banana | ["apple","apple"] |
113+
| 1 | apple | banana |
114+
| 1 | apple | banana |
115115

116116
When I run `wp post meta list 1 --orderby=meta_value --order=asc`
117117
Then STDOUT should be a table containing rows:
118-
| post_id | meta_key | meta_value |
119-
| 1 | apple | banana |
120-
| 1 | apple | banana |
121-
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
118+
| post_id | meta_key | meta_value |
119+
| 1 | apple | banana |
120+
| 1 | apple | banana |
121+
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
122122

123123
When I run `wp post meta list 1 --orderby=meta_value --order=asc --unserialize`
124124
Then STDOUT should be a table containing rows:
125-
| post_id | meta_key | meta_value |
126-
| 1 | apple | banana |
127-
| 1 | apple | banana |
128-
| 1 | banana | ["apple","apple"] |
125+
| post_id | meta_key | meta_value |
126+
| 1 | apple | banana |
127+
| 1 | apple | banana |
128+
| 1 | banana | ["apple","apple"] |
129129

130130
When I run `wp post meta list 1 --orderby=meta_value --order=desc`
131131
Then STDOUT should be a table containing rows:
132-
| post_id | meta_key | meta_value |
133-
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
134-
| 1 | apple | banana |
135-
| 1 | apple | banana |
132+
| post_id | meta_key | meta_value |
133+
| 1 | banana | a:2:{i:0;s:5:"apple";i:1;s:5:"apple";} |
134+
| 1 | apple | banana |
135+
| 1 | apple | banana |
136136

137137
When I run `wp post meta list 1 --orderby=meta_value --order=desc --unserialize`
138138
Then STDOUT should be a table containing rows:
139-
| post_id | meta_key | meta_value |
140-
| 1 | banana | ["apple","apple"] |
141-
| 1 | apple | banana |
142-
| 1 | apple | banana |
139+
| post_id | meta_key | meta_value |
140+
| 1 | banana | ["apple","apple"] |
141+
| 1 | apple | banana |
142+
| 1 | apple | banana |
143143

144144
Scenario: Delete all post meta
145145
Given a WP install
@@ -186,8 +186,8 @@ Feature: Manage post custom fields
186186

187187
When I run `wp post meta list 1`
188188
Then STDOUT should be a table containing rows:
189-
| post_id | meta_key | meta_value |
190-
| 1 | foo | |
189+
| post_id | meta_key | meta_value |
190+
| 1 | foo | |
191191

192192
Scenario: Make sure WordPress receives the slashed data it expects in meta fields
193193
Given a WP install
@@ -225,7 +225,7 @@ Feature: Manage post custom fields
225225
And an input.json file:
226226
"""
227227
{
228-
"foo": "bar"
228+
"foo": "bar"
229229
}
230230
"""
231231
And I run `wp post meta set 1 meta-key --format=json < input.json`
@@ -242,14 +242,14 @@ Feature: Manage post custom fields
242242
And an input.json file:
243243
"""
244244
{
245-
"foo": {
246-
"bar": {
247-
"baz": "some value"
248-
}
249-
},
250-
"foo.com": {
251-
"visitors": 999
252-
}
245+
"foo": {
246+
"bar": {
247+
"baz": "some value"
248+
}
249+
},
250+
"foo.com": {
251+
"visitors": 999
252+
}
253253
}
254254
"""
255255
And I run `wp post meta set 1 meta-key --format=json < input.json`
@@ -307,7 +307,7 @@ Feature: Manage post custom fields
307307
And an input.json file:
308308
"""
309309
{
310-
"foo": "bar"
310+
"foo": "bar"
311311
}
312312
"""
313313
And I run `wp post meta set 1 meta-key --format=json < input.json`
@@ -322,7 +322,7 @@ Feature: Manage post custom fields
322322
Then STDOUT should be JSON containing:
323323
"""
324324
{
325-
"foo": "baz"
325+
"foo": "baz"
326326
}
327327
"""
328328
@@ -332,10 +332,10 @@ Feature: Manage post custom fields
332332
And an input.json file:
333333
"""
334334
{
335-
"foo": {
336-
"bar": "baz"
337-
},
338-
"bar": "bad"
335+
"foo": {
336+
"bar": "baz"
337+
},
338+
"bar": "bad"
339339
}
340340
"""
341341
And a patch file:
@@ -354,10 +354,10 @@ Feature: Manage post custom fields
354354
Then STDOUT should be JSON containing:
355355
"""
356356
{
357-
"foo": {
358-
"bar": "new value"
359-
},
360-
"bar": "bad"
357+
"foo": {
358+
"bar": "new value"
359+
},
360+
"bar": "bad"
361361
}
362362
"""
363363
@@ -367,10 +367,10 @@ Feature: Manage post custom fields
367367
And an input.json file:
368368
"""
369369
{
370-
"foo": {
371-
"bar": "baz"
372-
},
373-
"bar": "bad"
370+
"foo": {
371+
"bar": "baz"
372+
},
373+
"bar": "bad"
374374
}
375375
"""
376376
And I run `wp post meta set 1 meta-key --format=json < input.json`
@@ -389,10 +389,10 @@ Feature: Manage post custom fields
389389
And an input.json file:
390390
"""
391391
{
392-
"foo": {
393-
"bar": "baz",
394-
"abe": "lincoln"
395-
}
392+
"foo": {
393+
"bar": "baz",
394+
"abe": "lincoln"
395+
}
396396
}
397397
"""
398398
And I run `wp post meta set 1 meta-key --format=json < input.json`
@@ -407,9 +407,9 @@ Feature: Manage post custom fields
407407
Then STDOUT should be JSON containing:
408408
"""
409409
{
410-
"foo": {
411-
"abe": "lincoln"
412-
}
410+
"foo": {
411+
"abe": "lincoln"
412+
}
413413
}
414414
"""
415415
@@ -419,9 +419,9 @@ Feature: Manage post custom fields
419419
And an input.json file:
420420
"""
421421
{
422-
"foo": {
423-
"bar": "baz"
424-
}
422+
"foo": {
423+
"bar": "baz"
424+
}
425425
}
426426
"""
427427
And I run `wp post meta set 1 meta-key --format=json < input.json`
@@ -449,7 +449,7 @@ Feature: Manage post custom fields
449449
Then STDOUT should be JSON containing:
450450
"""
451451
{
452-
"foo": "bar"
452+
"foo": "bar"
453453
}
454454
"""
455455

0 commit comments

Comments
 (0)