WordPress.org

Make WordPress Core

Ticket #11683: 11683.2.diff

File 11683.2.diff, 4.7 KB (added by boonebgorges, 6 years ago)
  • src/wp-includes/meta.php

    diff --git src/wp-includes/meta.php src/wp-includes/meta.php
    index e9f7811..d942b30 100644
    function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v 
    194194                }
    195195        }
    196196
    197         if ( ! $meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) ) )
     197        $meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) );
     198        if ( empty( $meta_ids ) ) {
    198199                return add_metadata($meta_type, $object_id, $meta_key, $passed_value);
     200        }
    199201
    200202        $_meta_value = $meta_value;
    201203        $meta_value = maybe_serialize( $meta_value );
    function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v 
    221223         * @param string $meta_key   Meta key.
    222224         * @param mixed  $meta_value Meta value.
    223225         */
    224         do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
     226        foreach ( $meta_ids as $meta_id ) {
     227                do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
     228        }
    225229
    226         if ( 'post' == $meta_type )
     230        if ( 'post' == $meta_type ) {
    227231                /**
    228232                 * Fires immediately before updating a post's metadata.
    229233                 *
    function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v 
    234238                 * @param string $meta_key   Meta key.
    235239                 * @param mixed  $meta_value Meta value.
    236240                 */
    237                 do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
     241                foreach ( $meta_ids as $meta_id ) {
     242                        do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
     243                }
     244        }
    238245
    239246        $result = $wpdb->update( $table, $data, $where );
    240247        if ( ! $result )
    function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v 
    255262         * @param string $meta_key   Meta key.
    256263         * @param mixed  $meta_value Meta value.
    257264         */
    258         do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
     265        foreach ( $meta_ids as $meta_id ) {
     266                do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
     267        }
    259268
    260269        if ( 'post' == $meta_type ) {
    261270                /**
    function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_v 
    268277                 * @param string $meta_key   Meta key.
    269278                 * @param mixed  $meta_value Meta value.
    270279                 */
    271                 do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
     280                foreach ( $meta_ids as $meta_id ) {
     281                        do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
     282                }
    272283        }
    273284
    274285        return true;
  • tests/phpunit/tests/meta.php

    diff --git tests/phpunit/tests/meta.php tests/phpunit/tests/meta.php
    index abf3ba5..4bb1264 100644
     
    44 * @group meta
    55 */
    66class Tests_Meta extends WP_UnitTestCase {
     7        protected $updated_mids = array();
     8
    79        function setUp() {
    810                parent::setUp();
    911                $this->author = new WP_User( $this->factory->user->create( array( 'role' => 'author' ) ) );
    class Tests_Meta extends WP_UnitTestCase { 
    7678                $this->assertFalse( $first === $second );
    7779        }
    7880
     81        /**
     82         * @ticket 11683
     83         */
     84        public function test_update_metadata_hooks_for_multiple_updated_rows() {
     85                add_metadata( 'post', 1, 'test_key', 'value_1' );
     86                add_metadata( 'post', 1, 'test_key', 'value_2' );
     87                add_action( 'update_post_meta', array( $this, 'updated_meta' ) );
     88                add_action( 'update_postmeta', array( $this, 'updated_meta' ) );
     89                add_action( 'updated_post_meta', array( $this, 'updated_meta' ) );
     90                add_action( 'updated_postmeta', array( $this, 'updated_meta' ) );
     91
     92                update_metadata( 'post', 1, 'test_key', 'value_3' );
     93
     94                remove_action( 'update_post_meta', array( $this, 'updated_meta' ) );
     95                remove_action( 'update_postmeta', array( $this, 'updated_meta' ) );
     96                remove_action( 'updated_post_meta', array( $this, 'updated_meta' ) );
     97                remove_action( 'updated_postmeta', array( $this, 'updated_meta' ) );
     98
     99                $found = $this->updated_mids;
     100                $this->updated_mids = array();
     101
     102                foreach ( $found as $action => $mids ) {
     103                        $this->assertSame( 2, count( $mids ) );
     104                }
     105        }
     106
    79107        function test_metadata_exists() {
    80108                $this->assertFalse( metadata_exists( 'user',  $this->author->ID, 'foobarbaz' ) );
    81109                $this->assertTrue( metadata_exists( 'user',  $this->author->ID, 'meta_key' ) );
    class Tests_Meta extends WP_UnitTestCase { 
    263291                $this->assertFalse( update_metadata_by_mid( 'user', array( 1 ), 'meta_new_value' ) );
    264292                $this->assertFalse( delete_metadata_by_mid( 'user', array( 1 ) ) );
    265293        }
     294
     295        /** Helpers **********************************************************/
     296
     297        public function updated_meta( $meta_id ) {
     298                $this->updated_mids[ current_action() ][] = $meta_id;
     299        }
    266300}