How do I use Buddypress xprofile fields inside bbPress?
-
I am mentioning @johnjamesjacoby who first started a thread about this some time ago, and @djpaul who asked that I start a new thread.
So, I am running the latest version of BuddyPress and bbPress together (running bbPress as site-wide forums integrated with BuddyPress). I would like to add any custom xprofile BuddyPress fields that I created underneath the avatar of a user in the forums.
The actual code that writes out the replies loop is inside the “loop-single-reply.php” file of the bbPress plugin. But how do I connect to BuddyPress and display any xprofile fields that I want though?
-
Made some progress with this, but still need help. I figured that I could simply add something like this underneath the avatar:
Code:$location = xprofile_get_field_data( ‘Location’, 10 ) ;
echo ‘Location: ‘ . $location;However, notice the hard-coded “10″ there which is an ID. This needs to be the ID of each user in the replies table and it changes with each table row inside the “loop-single-reply.php” file. I don’t mind changing the template file and keeping a record for it when upgrades come, but how do I know the ID of each user in the bbPress posting loop?
`$user_id = $bp->displayed_user->id;
$location = xprofile_get_field_data( ‘Location’, $user_id ) ;
echo ‘Location: ‘ . $location;if that doesnt work try getting the_author_ID(); or get_post_author_id();`
@modemlooper Thank you! That did it.
get_the_author_id() as well as bbp_get_reply_author_id() seem to both work just fine.
get_post_author_id() and $bp->displayed_user->id don’t seem to work for me though.When you are not in a BuddyPress loop you can get BP content by using WP author id as it returns same id.
@modemlooper thank you for your help.
Aha. Problems.
So, following the advice of @modemlooper I got this working just fine. Anything created under Buddypress custom user fields can display fine in the bbPress loops, using something like this:
`
$user_location = xprofile_get_field_data( ‘Location’, bbp_get_reply_author_id() ) ;
if (strlen($user_location) > 0 ) :
echo ‘Location: ‘ . $user_location . ‘
‘;
endif;
`However, how do I make sure I follow the custom fields’ restrictions regarding visibility? In BuddyPress we can create a custom field and set its visibility to be either:
1) Anyone
2) Logged In Users
3) My FriendsFurthermore, these fields’ visibility can be allowed to be changed by each user.
So, before simply displaying a custom field for just everyone, I need to run the required checks to verify that it should be displayed for the anonymous/logged-in user. I tried getting a reference to the actual field, like this but the var_dump() doesn’t help me much:
`$user_location_field = xprofile_get_field( ‘Location’, bbp_get_reply_author_id() ) ;`
This is the var_dump($user_location_field):
`object(BP_XProfile_Field)[29]
public ‘id’ => null
public ‘group_id’ => null
public ‘parent_id’ => null
public ‘type’ => null
public ‘name’ => null
public ‘description’ => null
public ‘is_required’ => null
public ‘can_delete’ => null
public ‘field_order’ => null
public ‘option_order’ => null
public ‘order_by’ => null
public ‘is_default_option’ => null
public ‘default_visibility’ => null
public ‘allow_custom_visibility’ => string ‘allowed’ (length=7)
public ‘data’ => null
public ‘message’ => null
public ‘message_type’ => string ‘err’ (length=3)`Even though I see a couple of public methods like “default_visibility()” and “allow_custom_visibility()”, they don’t really help. Their value doesn’t even change even when I change the field properties in the CMS.
You have to pass id # of field a string wont work.
`$data = xprofile_get_field( 2, bp_displayed_user_id() );
print_r($data) ;`
This will not give you a members choice. It will only return the default visibility you set up in admin. to get a users visibility on a field you get from user meta.
`$user_visib = get_user_meta( bp_displayed_user_id(), bp_get_user_meta_key( ‘bp_xprofile_visibility_levels’ ), true );
print_r($user_visib) ;`
@modemlooper thanks! I used a combination of your tips and info I found here https://bpdevel.wordpress.com/2012/03/16/profile-field-visibility-in-bp-1-6/ to make this work for me. I now have any custom field in Buddypress show up in my forums loop and it shows up conditionally as well for the appropriate users only.
Can you can post a code snippet so others that search can find info on this?
Sure thing @modemlooper. The code below will look for all the custom fields that a user has filled in, compare them to what should be visible for the currently logged-in user and then loop and display the forum reply user’s data. Instead of simply looping the default titles and data of the xprofile fields, I do a custom switch/case so that I can format each field individually for more control.
`
$user_strAllFields = get_user_meta( bbp_get_reply_author_id(), bp_get_user_meta_key( ‘bp_xprofile_visibility_levels’ ), true );
// get all the completed user fields for this poster
if( $user_strAllFields != null ) :
$user_arrAllFields = array_keys( $user_strAllFields );
else :
$user_arrAllFields = array();
endif;
// get all the fields that should not be displayed for this poster
$user_arrHiddenFields = bp_xprofile_get_hidden_fields_for_user( bbp_get_reply_author_id() );// loop through all the poster filled-in fields
foreach( $user_arrAllFields as $field ) :
// exclude the ones that should not be displayed
if( !in_array( $field, $user_arrHiddenFields ) ) :
// turn the ID of a field into its object
$obj_field = xprofile_get_field( $field, bbp_get_reply_author_id() ) ;// depending on the field name, customize the display
switch( $obj_field->name ) :case ‘Location’ :
$user_location = xprofile_get_field_data( ‘Location’, bbp_get_reply_author_id() ) ;
if (strlen($user_location) > 0 ) :
echo ‘Location: ‘ . $user_location . ‘
‘;
endif;
break;endswitch;
endif; // !in_array( $field, $user_arrHiddenFields ) )
endforeach; //( $user_arrAllFields as $field )
`
You must be logged in to reply to this topic.