profile->id,
'updated_profile',
__( 'Updated Profile', 'buddypress' ),
'bp_xprofile_format_activity_action_updated_profile',
__( 'Profile Updates', 'buddypress' ),
array( 'activity' )
);
/**
* Fires after the registration of default activity actions for Extended Profile component.
*
* @since 1.1.0
*/
do_action( 'xprofile_register_activity_actions' );
}
add_action( 'bp_register_activity_actions', 'xprofile_register_activity_actions' );
/**
* Format 'updated_profile' activity actions.
*
* @since 2.0.0
*
* @param string $action Static activity action.
* @param object $activity Activity object.
* @return string
*/
function bp_xprofile_format_activity_action_updated_profile( $action, $activity ) {
// Note for translators: The natural phrasing in English, "Joe updated
// his profile", requires that we know Joe's gender, which we don't. If
// your language doesn't have this restriction, feel free to use a more
// natural translation.
$profile_link = trailingslashit( bp_core_get_user_domain( $activity->user_id ) . bp_get_profile_slug() );
/* translators: %s: user profile link */
$action = sprintf( esc_html__( "%s's profile was updated", 'buddypress' ), '' . bp_core_get_user_displayname( $activity->user_id ) . '' );
/**
* Filters the formatted 'updated_profile' activity stream action.
*
* @since 2.0.0
*
* @param string $action Formatted action for activity stream.
* @param object $activity Activity object.
*/
return apply_filters( 'bp_xprofile_format_activity_action_updated_profile', $action, $activity );
}
/**
* Records activity for the logged in user within the profile component so that
* it will show in the users activity stream (if installed).
*
* @since 1.0.0
*
* @param array|string $args String containing all variables used after bp_parse_args() call.
* @return WP_Error|bool|int
*/
function xprofile_record_activity( $args = '' ) {
// Bail if activity component is not active.
if ( ! bp_is_active( 'activity' ) ) {
return false;
}
// Parse the arguments.
$r = bp_parse_args(
$args,
array(
'user_id' => bp_loggedin_user_id(),
'action' => '',
'content' => '',
'primary_link' => '',
'component' => buddypress()->profile->id,
'type' => false,
'item_id' => false,
'secondary_item_id' => false,
'recorded_time' => bp_core_current_time(),
'hide_sitewide' => false,
)
);
return bp_activity_add( $r );
}
/**
* Deletes activity for a user within the profile component so that it will be
* removed from the users activity stream and sitewide stream (if installed).
*
* @since 1.0.0
*
* for a specific activity.
*
* @param array|string $args Containing all variables used after bp_parse_args() call.
* @return bool
*/
function xprofile_delete_activity( $args = '' ) {
// Bail if activity component is not active.
if ( ! bp_is_active( 'activity' ) ) {
return false;
}
// Parse the arguments.
$r = bp_parse_args(
$args,
array(
'component' => buddypress()->profile->id,
),
'xprofile_delete_activity'
);
// Delete the activity item.
bp_activity_delete_by_item_id( $r );
}
/**
* Register an activity action for the Extended Profiles component.
*
* @since 1.0.0
*
* @param string $key Key.
* @param string $value Value.
* @return bool True if success, false on failure.
*/
function xprofile_register_activity_action( $key, $value ) {
// Bail if activity component is not active.
if ( ! bp_is_active( 'activity' ) ) {
return false;
}
/**
* Filters the return value of bp_activity_set_action.
*
* @since 1.1.0
*
* @param bool $value Whether or not an action was successfully registered.
* @param string $key Key used for the registered action.
* @param string $value Value used for the registered action.
*/
return apply_filters( 'xprofile_register_activity_action', bp_activity_set_action( buddypress()->profile->id, $key, $value ), $key, $value );
}
/**
* Add an activity item when a user has updated his profile.
*
* @since 2.0.0
*
* @param int $user_id ID of the user who has updated his profile.
* @param array $field_ids IDs of the fields submitted.
* @param bool $errors True if validation or saving errors occurred, otherwise false.
* @param array $old_values Pre-save xprofile field values and visibility levels.
* @param array $new_values Post-save xprofile field values and visibility levels.
* @return bool True on success, false on failure.
*/
function bp_xprofile_updated_profile_activity( $user_id, $field_ids = array(), $errors = false, $old_values = array(), $new_values = array() ) {
// If there were errors, don't post.
if ( ! empty( $errors ) ) {
return false;
}
// Bail if activity component is not active.
if ( ! bp_is_active( 'activity' ) ) {
return false;
}
// Don't post if there have been no changes, or if the changes are
// related solely to non-public fields.
$public_changes = false;
foreach ( $new_values as $field_id => $new_value ) {
$old_value = isset( $old_values[ $field_id ] ) ? $old_values[ $field_id ] : '';
// Don't register changes to private fields.
if ( empty( $new_value['visibility'] ) || ( 'public' !== $new_value['visibility'] ) ) {
continue;
}
// Don't register if there have been no changes.
if ( $new_value === $old_value ) {
continue;
}
// Looks like we have public changes - no need to keep checking.
$public_changes = true;
break;
}
// Bail if no public changes.
if ( empty( $public_changes ) ) {
return false;
}
// Throttle to one activity of this type per 2 hours.
$existing = bp_activity_get( array(
'max' => 1,
'filter' => array(
'user_id' => $user_id,
'object' => buddypress()->profile->id,
'action' => 'updated_profile',
),
) );
// Default throttle time is 2 hours. Filter to change (in seconds).
if ( ! empty( $existing['activities'] ) ) {
/**
* Filters the throttle time, in seconds, used to prevent excessive activity posting.
*
* @since 2.0.0
*
* @param int $value Throttle time, in seconds.
*/
$throttle_period = apply_filters( 'bp_xprofile_updated_profile_activity_throttle_time', HOUR_IN_SECONDS * 2 );
$then = strtotime( $existing['activities'][0]->date_recorded );
$now = bp_core_current_time( true, 'timestamp' );
// Bail if throttled.
if ( ( $now - $then ) < $throttle_period ) {
return false;
}
}
// If we've reached this point, assemble and post the activity item.
$profile_link = trailingslashit( bp_core_get_user_domain( $user_id ) . bp_get_profile_slug() );
return (bool) xprofile_record_activity( array(
'user_id' => $user_id,
'primary_link' => $profile_link,
'component' => buddypress()->profile->id,
'type' => 'updated_profile',
) );
}
add_action( 'xprofile_updated_profile', 'bp_xprofile_updated_profile_activity', 10, 5 );
/**
* Add filters for xprofile activity types to Show dropdowns.
*
* @since 2.0.0
* @todo Mark as deprecated
*/
function xprofile_activity_filter_options() {
?>