WordPress.org

Make WordPress Core

Opened 6 years ago

Closed 8 months ago

Last modified 8 months ago

#11683 closed defect (bug) (fixed)

update_metadata() passes only the first meta_id

Reported by: scribu Owned by: boonebgorges
Milestone: 4.1 Priority: normal
Severity: normal Version: 2.9
Component: Options, Meta APIs Keywords: has-patch
Focuses: Cc:

Description

Code to reproduce:

function update_metadata_action_test($meta_id) {
	var_dump($meta_id);
}
add_action('update_post_meta', 'update_metadata_action_test');

add_metadata('post', 1, 'mykey', 'value1');
add_metadata('post', 1, 'mykey', 'value2');

update_metadata('post', 1, 'mykey', 'new value');

Expected result:

Array ( [0] => 101 [1] => 102 )

Actual result:

string(3) "101"

Attachments (3)

update-meta-ids.diff (1.6 KB) - added by wonderboymusic 3 years ago.
11683.diff (1.9 KB) - added by wonderboymusic 2 years ago.
11683.2.diff (4.7 KB) - added by boonebgorges 9 months ago.

Download all attachments as: .zip

Change History (22)

comment:1 @scribu6 years ago

Two solutions:

  1. update_usermeta() only updates the first value that it finds
  1. update_usermeta() uses $wpdb->get_col() instead of $wpdb->get_var()

The first would create more severe backward compatibility issues than the second.

comment:2 @scribu6 years ago

Related: #10905

comment:3 @scribu6 years ago

Come to think of it, I have no ideea why $meta_id is passed at all (and as the first parameter at that). It's not accesible from anywhere else in the API.

comment:4 @nacin5 years ago

  • Milestone changed from 3.0 to 3.1

Needs to be handled with #10905 I'd think.

comment:5 @nacin5 years ago

  • Milestone changed from Awaiting Triage to Future Release

comment:6 @wonderboymusic3 years ago

  • Keywords has-patch added

Added patch to get all meta_ids and call actions on all meta_ids individually, rather than breaking current behavior by passing arrays.

comment:7 @nacin3 years ago

I've never really noticed that update_metadata() can update more than one row at a time.

@wonderboymusic2 years ago

comment:8 @wonderboymusic2 years ago

  • Milestone changed from Future Release to 3.6

Patch refreshed against trunk like whoa

Version 0, edited 2 years ago by wonderboymusic (next)

comment:9 @ryan2 years ago

  • Milestone changed from 3.6 to Future Release

comment:10 @wonderboymusic2 years ago

  • Milestone changed from Future Release to 3.7

comment:11 @wonderboymusic21 months ago

  • Milestone changed from 3.7 to 3.8

comment:12 @wonderboymusic19 months ago

  • Milestone changed from 3.8 to Future Release

comment:13 @nacin18 months ago

  • Component changed from General to Options and Meta

@boonebgorges9 months ago

comment:14 @boonebgorges9 months ago

  • Milestone changed from Future Release to 4.1
  • Owner set to boonebgorges
  • Status changed from new to accepted

11683.2.diff refreshes for latest trunk, and adds some Delightful unit tests.

comment:15 @boonebgorges8 months ago

  • Resolution set to fixed
  • Status changed from accepted to closed

In 30140:

Pass all updated meta IDs to filters in update_metadata().

Props wonderboymusic.
Fixes #11683.

comment:16 @DrewAPicture8 months ago

  • Resolution fixed deleted
  • Status changed from closed to reopened

The hook docs always need to directly precede the hook line so the parser can match them up.

comment:17 follow-up: @boonebgorges8 months ago

You learn something new every day :) Thanks, DrewAPicture.

comment:18 @DrewAPicture8 months ago

  • Resolution set to fixed
  • Status changed from reopened to closed

In 30149:

Relocate hook docs so they directly precede the hook lines moved into foreach statements in [30140].

It's necessary for hook docs to directly precede hook lines so the parser can correctly match them up. This change relocates hook docs for update_{$meta_type}_meta, update_postmeta, updated_{$meta_type}_meta, and updated_postmeta.

Fixes #11683.

comment:19 in reply to: ↑ 17 @DrewAPicture8 months ago

Replying to boonebgorges:

You learn something new every day :) Thanks, DrewAPicture.

Absolutely :-)

In the case of hooks, it's particularly important because phpDocumentor doesn't actually support parsing hook docs out of the box. Our implementation calls for the docs to directly precede hook lines so they don't get confused with function-level DocBlocks.

Note: See TracTickets for help on using tickets.