diff --git a/core/connection-type.php b/core/connection-type.php index 1deb846c..dd4c5d97 100644 --- a/core/connection-type.php +++ b/core/connection-type.php @@ -373,11 +373,36 @@ public function get_adjacent_items( $item ) { */ public function each_connected( $items, $extra_qv = array(), $prop_name = 'connected' ) { if ( is_a( $items, 'WP_Query' ) ) - $items =& $items->posts; + $items = $items->posts; if ( empty( $items ) || !is_object( $items[0] ) ) return; + try { + list( $raw_connected ) = $this->_connected_many( $items, $extra_qv ); + + p2p_distribute_connected( $items, $raw_connected, $prop_name ); + } catch ( P2P_Exception $e ) { + trigger_error( $e->getMessage(), E_USER_WARNING ); + } + } + + public function connected_many( $items, $extra_qv = array() ) { + if ( is_a( $items, 'WP_Query' ) ) + $items = $items->posts; + + Xdebug_break(); + + try { + list( $raw_connected, $directed ) = $this->_connected_many( $items, $extra_qv ); + + return new P2P_Connections_Map( $raw_connected, $directed ); + } catch ( P2P_Exception $e ) { + return new WP_Error( $e->getMessage() ); + } + } + + private function _connected_many( $items, $extra_qv = array() ) { $post_types = array_unique( wp_list_pluck( $items, 'post_type' ) ); if ( count( $post_types ) > 1 ) { @@ -401,7 +426,7 @@ public function each_connected( $items, $extra_qv = array(), $prop_name = 'conne $direction = _p2p_compress_direction( $possible_directions ); if ( !$direction ) - return false; + throw new P2P_Exception( "Can't determine direction." ); $directed = $this->set_direction( $direction ); @@ -419,7 +444,7 @@ public function each_connected( $items, $extra_qv = array(), $prop_name = 'conne foreach ( $q->items as $item ) $raw_connected[] = $item->get_object(); - p2p_distribute_connected( $items, $raw_connected, $prop_name ); + return array( $raw_connected, $directed ); } public function get_desc() { diff --git a/core/connections-map.php b/core/connections-map.php new file mode 100644 index 00000000..6e74b977 --- /dev/null +++ b/core/connections-map.php @@ -0,0 +1,17 @@ +buckets = scb_list_group_by( $items, '_p2p_get_other_id' ); + $this->directed = $directed; + } + + function _for( $item ) { + return $this->buckets[ $item->ID ]; + } +} + diff --git a/tests/test-core.php b/tests/test-core.php index 28c3ca9d..4c370806 100644 --- a/tests/test-core.php +++ b/tests/test-core.php @@ -364,14 +364,23 @@ function test_each_connected() { 'order' => 'ASC' ) ); - $ctype->each_connected( $query ); + $connected = $ctype->connected_many( $query ); + if ( is_wp_error( $connected ) ) + throw new Exception('WTF'); - $this->assertEquals( $query->posts[0]->connected[0]->ID, $movie->ID ); - $this->assertEquals( $query->posts[1]->connected[0]->p2p_id, $p2p_id_1 ); - $this->assertEmpty( $query->posts[2]->connected ); + var_dump( wp_list_pluck( $query->posts, 'ID' ) ); + var_dump( $connected ); + + $connected_for_0 = $connected->_for( $query->posts[0] ); + $connected_for_1 = $connected->_for( $query->posts[1] ); + $connected_for_2 = $connected->_for( $query->posts[2] ); + + $this->assertEquals( $connected_for_0[0]->ID, $movie->ID ); + $this->assertEquals( $connected_for_0[1]->p2p_id, $p2p_id_1 ); + $this->assertEmpty( $connected_for_2 ); // Test that connected posts have real properties - $properties = get_object_vars( $query->posts[0]->connected[0] ); + $properties = get_object_vars( $connected_for_0[0] ); $this->assertTrue( isset( $properties['post_type'] ) ); }