Skip to content

Activity & Tracking Filters

Activity Content Filters

fluent_community/activity/after_contents ​

Filters activity content after it's been processed.

Parameters:

ParameterTypeDescription
$contentsarrayActivity contents array
$filtersarrayApplied filters

Return: array - Modified contents

Example Usage:

php
// Add custom activity types
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    // Add custom metadata to each activity
    foreach ($contents as &$activity) {
        $activity['time_ago'] = human_time_diff(strtotime($activity['created_at']));
        $activity['is_new'] = is_activity_new($activity['id']);
    }

    return $contents;
}, 10, 2);

// Filter activities by user preference
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    $user_id = get_current_user_id();
    $hidden_types = get_user_meta($user_id, 'hidden_activity_types', true) ?: [];

    if (!empty($hidden_types)) {
        $contents = array_filter($contents, function($activity) use ($hidden_types) {
            return !in_array($activity['type'], $hidden_types);
        });
        $contents = array_values($contents); // Re-index
    }

    return $contents;
}, 10, 2);

// Add engagement metrics
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    foreach ($contents as &$activity) {
        $activity['engagement'] = [
            'views'     => get_activity_views($activity['id']),
            'clicks'    => get_activity_clicks($activity['id']),
            'reactions' => get_activity_reactions($activity['id'])
        ];
    }

    return $contents;
}, 10, 2);

// Add user context
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    $current_user_id = get_current_user_id();

    foreach ($contents as &$activity) {
        $activity['user_context'] = [
            'is_following'  => is_user_following($current_user_id, $activity['user_id']),
            'is_bookmarked' => is_activity_bookmarked($current_user_id, $activity['id']),
            'has_read'      => has_user_read_activity($current_user_id, $activity['id'])
        ];
    }

    return $contents;
}, 10, 2);

Common Use Cases:

  • Add metadata
  • Filter by preferences
  • Engagement metrics
  • User context
  • Custom activity types

fluent_community/activity/after_contents_space ​

Filters activity content for a specific space.

Parameters:

ParameterTypeDescription
$contentsarrayActivity contents array
$spaceIdintSpace ID
$filtersarrayApplied filters

Return: array - Modified contents

Example Usage:

php
// Add space-specific metadata
add_filter('fluent_community/activity/after_contents_space', function($contents, $spaceId, $filters) {
    $space = get_space($spaceId);

    foreach ($contents as &$activity) {
        $activity['space_context'] = [
            'space_name'  => $space->title,
            'space_role'  => get_user_space_role(get_current_user_id(), $spaceId),
            'is_pinned'   => is_activity_pinned_in_space($activity['id'], $spaceId)
        ];
    }

    return $contents;
}, 10, 3);

// Filter by space permissions
add_filter('fluent_community/activity/after_contents_space', function($contents, $spaceId, $filters) {
    $user_id = get_current_user_id();
    $user_role = get_user_space_role($user_id, $spaceId);

    // Hide admin-only activities from regular members
    if ($user_role !== 'admin') {
        $contents = array_filter($contents, function($activity) {
            return !($activity['meta']['admin_only'] ?? false);
        });
        $contents = array_values($contents);
    }

    return $contents;
}, 10, 3);

// Add space statistics
add_filter('fluent_community/activity/after_contents_space', function($contents, $spaceId, $filters) {
    foreach ($contents as &$activity) {
        $activity['space_stats'] = [
            'total_members'   => count_space_members($spaceId),
            'active_members'  => count_active_space_members($spaceId),
            'total_posts'     => count_space_posts($spaceId)
        ];
    }

    return $contents;
}, 10, 3);

// Highlight featured content
add_filter('fluent_community/activity/after_contents_space', function($contents, $spaceId, $filters) {
    $featured_ids = get_featured_activity_ids($spaceId);

    foreach ($contents as &$activity) {
        $activity['is_featured'] = in_array($activity['id'], $featured_ids);
    }

    return $contents;
}, 10, 3);

Common Use Cases:

  • Space-specific metadata
  • Permission filtering
  • Space statistics
  • Featured content
  • Role-based display

fluent_community/activity/after_contents_user ​

Filters activity content for a specific user profile.

Parameters:

ParameterTypeDescription
$contentsarrayActivity contents array
$userIdintUser ID
$filtersarrayApplied filters

Return: array - Modified contents

Example Usage:

php
// Add user profile context
add_filter('fluent_community/activity/after_contents_user', function($contents, $userId, $filters) {
    $user = get_user_by('ID', $userId);

    foreach ($contents as &$activity) {
        $activity['author_context'] = [
            'reputation'    => get_user_reputation($userId),
            'member_since'  => $user->user_registered,
            'total_posts'   => count_user_posts($userId),
            'total_comments' => count_user_comments($userId)
        ];
    }

    return $contents;
}, 10, 3);

// Filter by privacy settings
add_filter('fluent_community/activity/after_contents_user', function($contents, $userId, $filters) {
    $current_user_id = get_current_user_id();
    $privacy_settings = get_user_privacy_settings($userId);

    // If viewing someone else's profile
    if ($current_user_id !== $userId) {
        // Hide private activities
        if ($privacy_settings['hide_activity'] ?? false) {
            $contents = array_filter($contents, function($activity) {
                return !($activity['is_private'] ?? false);
            });
            $contents = array_values($contents);
        }
    }

    return $contents;
}, 10, 3);

// Add achievement highlights
add_filter('fluent_community/activity/after_contents_user', function($contents, $userId, $filters) {
    $achievements = get_user_achievements($userId);

    foreach ($contents as &$activity) {
        // Check if this activity earned an achievement
        $activity_achievements = array_filter($achievements, function($achievement) use ($activity) {
            return $achievement['activity_id'] === $activity['id'];
        });

        if (!empty($activity_achievements)) {
            $activity['achievements'] = $activity_achievements;
        }
    }

    return $contents;
}, 10, 3);

// Add interaction history
add_filter('fluent_community/activity/after_contents_user', function($contents, $userId, $filters) {
    $current_user_id = get_current_user_id();

    if ($current_user_id && $current_user_id !== $userId) {
        foreach ($contents as &$activity) {
            $activity['interaction_history'] = [
                'has_reacted'   => has_user_reacted($current_user_id, $activity['id']),
                'has_commented' => has_user_commented($current_user_id, $activity['id']),
                'has_shared'    => has_user_shared($current_user_id, $activity['id'])
            ];
        }
    }

    return $contents;
}, 10, 3);

// Group activities by date
add_filter('fluent_community/activity/after_contents_user', function($contents, $userId, $filters) {
    $grouped = [];

    foreach ($contents as $activity) {
        $date = date('Y-m-d', strtotime($activity['created_at']));

        if (!isset($grouped[$date])) {
            $grouped[$date] = [
                'date'       => $date,
                'date_label' => format_activity_date($date),
                'activities' => []
            ];
        }

        $grouped[$date]['activities'][] = $activity;
    }

    // Return flat array with date markers
    $result = [];
    foreach ($grouped as $group) {
        $result[] = [
            'type' => 'date_marker',
            'date' => $group['date_label']
        ];
        $result = array_merge($result, $group['activities']);
    }

    return $result;
}, 10, 3);

Common Use Cases:

  • User profile context
  • Privacy filtering
  • Achievement tracking
  • Interaction history
  • Activity grouping

Best Practices

1. Performance Optimization

php
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    // Batch load user data instead of individual queries
    $user_ids = array_unique(array_column($contents, 'user_id'));
    $users_data = get_users_data_batch($user_ids);

    foreach ($contents as &$activity) {
        $activity['user_data'] = $users_data[$activity['user_id']] ?? null;
    }

    return $contents;
}, 10, 2);

2. Respect Privacy Settings

php
add_filter('fluent_community/activity/after_contents_user', function($contents, $userId, $filters) {
    $current_user_id = get_current_user_id();

    // Only filter if viewing someone else's profile
    if ($current_user_id !== $userId) {
        $privacy = get_user_privacy_settings($userId);

        if ($privacy['hide_activity']) {
            return []; // Return empty if activity is hidden
        }
    }

    return $contents;
}, 10, 3);

3. Cache Expensive Calculations

php
add_filter('fluent_community/activity/after_contents_space', function($contents, $spaceId, $filters) {
    $cache_key = 'space_stats_' . $spaceId;
    $stats = wp_cache_get($cache_key);

    if (false === $stats) {
        $stats = calculate_space_statistics($spaceId);
        wp_cache_set($cache_key, $stats, '', 600); // Cache for 10 minutes
    }

    foreach ($contents as &$activity) {
        $activity['space_stats'] = $stats;
    }

    return $contents;
}, 10, 3);

4. Maintain Array Structure

php
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    // Always re-index after filtering
    $contents = array_filter($contents, function($activity) {
        return $activity['status'] === 'published';
    });

    // Re-index to maintain sequential keys
    return array_values($contents);
}, 10, 2);

Common Patterns

Activity Filtering by Type

php
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    // Allow users to filter activity types
    $allowed_types = get_user_meta(get_current_user_id(), 'activity_filter', true);

    if (!empty($allowed_types)) {
        $contents = array_filter($contents, function($activity) use ($allowed_types) {
            return in_array($activity['type'], $allowed_types);
        });
        $contents = array_values($contents);
    }

    return $contents;
}, 10, 2);

Real-time Activity Indicators

php
add_filter('fluent_community/activity/after_contents', function($contents, $filters) {
    foreach ($contents as &$activity) {
        $created_time = strtotime($activity['created_at']);
        $minutes_ago = (time() - $created_time) / 60;

        $activity['is_live'] = $minutes_ago < 5; // Activity within 5 minutes
        $activity['is_recent'] = $minutes_ago < 60; // Activity within 1 hour
    }

    return $contents;
}, 10, 2);

Activity Analytics

php
add_filter('fluent_community/activity/after_contents_space', function($contents, $spaceId, $filters) {
    foreach ($contents as &$activity) {
        $activity['analytics'] = [
            'engagement_rate' => calculate_engagement_rate($activity['id']),
            'reach'           => calculate_activity_reach($activity['id']),
            'virality_score'  => calculate_virality_score($activity['id'])
        ];
    }

    return $contents;
}, 10, 3);

Fluent Community developer documentation