General: Allow `wp_list_pluck()` to operate on arrays of references without overwriting the referenced items.
Fixes #16895. git-svn-id: https://develop.svn.wordpress.org/trunk@42527 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
parent
ade2dd5dfe
commit
2cb36cab72
|
@ -140,6 +140,8 @@ class WP_List_Util {
|
|||
* `$list` will be preserved in the results.
|
||||
*/
|
||||
public function pluck( $field, $index_key = null ) {
|
||||
$newlist = array();
|
||||
|
||||
if ( ! $index_key ) {
|
||||
/*
|
||||
* This is simple. Could at some point wrap array_column()
|
||||
|
@ -147,11 +149,14 @@ class WP_List_Util {
|
|||
*/
|
||||
foreach ( $this->output as $key => $value ) {
|
||||
if ( is_object( $value ) ) {
|
||||
$this->output[ $key ] = $value->$field;
|
||||
$newlist[ $key ] = $value->$field;
|
||||
} else {
|
||||
$this->output[ $key ] = $value[ $field ];
|
||||
$newlist[ $key ] = $value[ $field ];
|
||||
}
|
||||
}
|
||||
|
||||
$this->output = $newlist;
|
||||
|
||||
return $this->output;
|
||||
}
|
||||
|
||||
|
@ -159,7 +164,6 @@ class WP_List_Util {
|
|||
* When index_key is not set for a particular item, push the value
|
||||
* to the end of the stack. This is how array_column() behaves.
|
||||
*/
|
||||
$newlist = array();
|
||||
foreach ( $this->output as $value ) {
|
||||
if ( is_object( $value ) ) {
|
||||
if ( isset( $value->$index_key ) ) {
|
||||
|
|
|
@ -210,6 +210,56 @@ class Tests_Functions_ListFilter extends WP_UnitTestCase {
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 16895
|
||||
*/
|
||||
function test_wp_list_pluck_containing_references() {
|
||||
$ref_list = array(
|
||||
& $this->object_list['foo'],
|
||||
& $this->object_list['bar'],
|
||||
);
|
||||
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[0] );
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[1] );
|
||||
|
||||
$list = wp_list_pluck( $ref_list, 'name' );
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'foo',
|
||||
'bar',
|
||||
),
|
||||
$list
|
||||
);
|
||||
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[0] );
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[1] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 16895
|
||||
*/
|
||||
function test_wp_list_pluck_containing_references_keys() {
|
||||
$ref_list = array(
|
||||
& $this->object_list['foo'],
|
||||
& $this->object_list['bar'],
|
||||
);
|
||||
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[0] );
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[1] );
|
||||
|
||||
$list = wp_list_pluck( $ref_list, 'name', 'id' );
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'f' => 'foo',
|
||||
'b' => 'bar',
|
||||
),
|
||||
$list
|
||||
);
|
||||
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[0] );
|
||||
$this->assertInstanceOf( 'stdClass', $ref_list[1] );
|
||||
}
|
||||
|
||||
function test_filter_object_list_nested_array_and() {
|
||||
$list = wp_filter_object_list( $this->object_list, array( 'field4' => array( 'blue' ) ), 'AND' );
|
||||
$this->assertEquals( 1, count( $list ) );
|
||||
|
|
Loading…
Reference in New Issue