Whilst working with Organic Groups today I had the need to load a list of the nodes that a user is connected to. After a bit of looking around in the source code I couldn't find a good solution on how to do this. So after looking around on Google for a bit I just sat down and wrote one.
Getting the group nodes that a user is a member of is quite easy as it turns out, but must be done in a number of steps. The first step is to grab a list of the group entity ID's that the user is connected through using the og_get_entity_groups() function. This can be used with no parameters (which assumes the current user).
// Load in the current user's group entity ID's $groups = og_get_entity_groups();
Or you can load a user and pass this object to the function.
// Get the current user global $user; // Load in the current user's group entity ID's $groups = og_get_entity_groups('user', $user);
The next step is to use these group entity ID's to load in the actual node entity ID's using the og_load_multiple() function.
// Load the entities object ID's $groups = og_load_multiple($groups);
We can now finally start loading node objects using these group entities. This can be done in a number of different ways. The first is to loop through them and load in the node objects one at a time.
// Convert them into nodes, one a time. foreach ($groups as $group) { $nodes[] = node_load($group->etid); }
An alternative is to loop through the list of group entities and load all of the node entity ID's into an array. This can then be passed onto the entity_load() function.
// Load all of the nodes with one function call foreach ($groups as $group) { $nodes[] = $group->etid; } $nodes = entity_load('node', $nodes);
Using entity_load() is a good alternative as it means that you can use the conditions parameter to only load certain nodes without having to load each node in turn. In the following example I only load nodes of the type 'club' within the $nodes array.
// Load all of the nodes with one function call foreach ($groups as $group) { $nodes[] = $group->etid; }
Update:
So it turns out that og_load_multiple() is no longer a part of Organic Groups, at least in the 2.x version. An alternative to this is to use node_load_multiple(), which will load all of the nodes as node objects. So, to load all of the nodes connected to a user in one go do the following:
global $user; $groups = og_get_entity_groups('user', $user); $groups = node_load_multiple($groups);
Be careful though, as if a user is a member of lots of groups this code will load all those objects.