Skip to content

Commit 28f77ca

Browse files
committed
Refine the handling of mids and the metadata hooks.
1 parent 3561331 commit 28f77ca

2 files changed

Lines changed: 97 additions & 11 deletions

File tree

src/wp-includes/meta.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,9 @@ function add_metadata( $meta_type, $object_id, $meta_key, $meta_value, $unique =
196196
*
197197
* [X] change this function so it returns the array of mids instead of true
198198
* [ ] reinstate slashed data handling
199-
* [ ] need to account for the return value of "add_{$meta_type}_metadata" for each key
200-
* [ ] need tests to cover when the "add_{$meta_type}_metadata" filter returns a value for a key
201-
* [ ] confirm that the method of getting the mids via `range()` is reliable
199+
* [X] need to account for the return value of "add_{$meta_type}_metadata" for each key
200+
* [X] need tests to cover when the "add_{$meta_type}_metadata" filter returns a value for a key
201+
* [X] confirm that the method of getting the mids via `range()` is reliable
202202
*
203203
* @since x.y.z
204204
*
@@ -274,20 +274,20 @@ function bulk_add_metadata( string $meta_type, $object_id, array $meta_fields )
274274
return false;
275275
}
276276

277-
$first_mid = (int) $wpdb->insert_id;
278-
$all_mids = range( $first_mid, $first_mid + count( $data ) - 1 );
279-
280-
$i = 0;
277+
$first_mid = (int) $wpdb->insert_id;
278+
$inserted_mids = range( $first_mid, $first_mid + $inserted - 1 );
279+
$keyed_mids = array_combine( array_column( $data, 1 ), $inserted_mids );
280+
$all_mids = array_merge( $return, $keyed_mids );
281281

282282
wp_cache_delete( $object_id, $meta_type . '_meta' );
283283

284-
foreach ( $meta_fields as $meta_key => $meta_value ) {
284+
foreach ( $data as $datum ) {
285+
list( $object_id, $meta_key, $meta_value ) = $datum;
285286
/** This action is documented in wp-includes/meta.php */
286-
do_action( "added_{$meta_type}_meta", $all_mids[ $i ], $object_id, $meta_key, $meta_value );
287-
$i++;
287+
do_action( "added_{$meta_type}_meta", $all_mids[ $meta_key ], $object_id, $meta_key, $meta_value );
288288
}
289289

290-
return true;
290+
return $all_mids;
291291
}
292292

293293
/**
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
/**
4+
* @group meta
5+
*/
6+
class Tests_Meta_BulkAddMetadata extends WP_UnitTestCase {
7+
8+
public function test_all_meta_fields_should_be_added() {
9+
global $wpdb;
10+
11+
$post_id = self::factory()->post->create();
12+
$meta = array(
13+
'key1' => '1',
14+
'key2' => '2',
15+
'key3' => '3',
16+
);
17+
$latest_mid = (int) $wpdb->get_var( "SELECT MAX( meta_id ) FROM {$wpdb->postmeta}" );
18+
$filters = did_filter( 'add_post_metadata' );
19+
$actions = did_action( 'added_post_meta' );
20+
21+
$result = bulk_add_metadata( 'post', $post_id, $meta );
22+
23+
$actual_vals = array(
24+
'key1' => get_post_meta( $post_id, 'key1', true ),
25+
'key2' => get_post_meta( $post_id, 'key2', true ),
26+
'key3' => get_post_meta( $post_id, 'key3', true ),
27+
);
28+
$expected_vals = $meta;
29+
$expected_mids = array(
30+
'key1' => ( $latest_mid + 1 ),
31+
'key2' => ( $latest_mid + 2 ),
32+
'key3' => ( $latest_mid + 3 ),
33+
);
34+
35+
$this->assertSame( $expected_vals, $actual_vals );
36+
$this->assertSame( $expected_mids, $result );
37+
$this->assertSame( $filters + 3, did_filter( 'add_post_metadata' ) );
38+
$this->assertSame( $actions + 3, did_action( 'added_post_meta' ) );
39+
}
40+
41+
public function test_correct_mids_should_be_returned_when_filter_is_in_place() {
42+
global $wpdb;
43+
44+
add_filter( 'add_post_metadata', function( $check, $object_id, $meta_key ) {
45+
if ( 'key2' === $meta_key ) {
46+
return 123456;
47+
}
48+
49+
return $check;
50+
}, 10, 3 );
51+
52+
$post_id = self::factory()->post->create();
53+
$meta = array(
54+
'key1' => '1',
55+
'key2' => '2',
56+
'key3' => '3',
57+
);
58+
$latest_mid = (int) $wpdb->get_var( "SELECT MAX( meta_id ) FROM {$wpdb->postmeta}" );
59+
$filters = did_filter( 'add_post_metadata' );
60+
$actions = did_action( 'added_post_meta' );
61+
62+
$result = bulk_add_metadata( 'post', $post_id, $meta );
63+
64+
$expected_vals = array(
65+
'key1' => '1',
66+
'key2' => '',
67+
'key3' => '3',
68+
);
69+
$actual_vals = array(
70+
'key1' => get_post_meta( $post_id, 'key1', true ),
71+
'key2' => get_post_meta( $post_id, 'key2', true ),
72+
'key3' => get_post_meta( $post_id, 'key3', true ),
73+
);
74+
$expected_mids = array(
75+
'key2' => 123456,
76+
'key1' => ( $latest_mid + 1 ),
77+
'key3' => ( $latest_mid + 2 ),
78+
);
79+
80+
$this->assertSame( $expected_vals, $actual_vals );
81+
$this->assertSame( $expected_mids, $result );
82+
$this->assertSame( $filters + 3, did_filter( 'add_post_metadata' ) );
83+
$this->assertSame( $actions + 2, did_action( 'added_post_meta' ) );
84+
}
85+
86+
}

0 commit comments

Comments
 (0)