Architecture Overview
BuddyPress Status is built using WordPress plugin architecture with separate admin and public components. The plugin follows WordPress coding standards and uses modern JavaScript practices.
Directory Structure
buddypress-status/
├── admin/ # Admin-specific functionality
│ ├── class-buddypress-status-admin.php
│ ├── css/ # Admin styles
│ ├── js/ # Admin scripts
│ ├── inc/ # Admin includes
│ └── wbcom/ # Wbcom admin framework
├── public/ # Frontend functionality
│ ├── class-buddypress-status-public.php
│ ├── css/ # Frontend styles
│ ├── js/ # Frontend scripts
│ └── inc/ # Frontend includes
├── includes/ # Core plugin files
├── languages/ # Translation files
└── templates/ # Template files
Key Components
1. Status Management System
Database Structure
- Statuses are stored in user meta with key
bpsts_user_statuses - Current status stored in
bpsts_current_status - Status icons stored in
bpsts_user_status_icons
Status Object Structure
array(
'status_id' => unique_id,
'status' => 'Status text',
'timestamp' => time(),
'mood_type' => 'feeling',
'mood_value' => 'happy'
)
2. Emoji System
Modern Emoji Implementation
- Native emoji picker with 1500+ emojis
- Category-based organization
- Real-time search functionality
- No external dependencies
Emoji Categories
- Smileys & Emotion
- People & Body
- Animals & Nature
- Food & Drink
- Activities
- Travel & Places
- Objects
- Symbols
- Flags
3. Feeling & Activity System
Custom Activities
- Admin can add custom feeling activities
- Support for both SVG images and Font Awesome icons
- Stored in option
bpsts_feeling_activities
Activity Structure
array(
'id' => unique_id,
'name' => 'Activity Name',
'type' => 'custom',
'icon_type' => 'fontawesome', // or 'image'
'icon_class' => 'fa-solid fa-star',
'icon_url' => 'url_to_image'
)
4. Font Awesome Integration
Version: Font Awesome 6.5.1
Implementation
- Proper deregistration of older versions
- CDN-based loading with fallback
- Support for all Font Awesome 6 icon styles
API Reference
PHP Functions
Status Functions
// Add a new status
bpsts_add_user_status($user_id, $status_text, $set_current = false)
// Update existing status
bpsts_update_user_status($user_id, $status_id, $new_status_text)
// Delete a status
bpsts_delete_user_status($user_id, $status_id)
// Get all user statuses
bpsts_get_user_statuses($user_id)
// Get current status
bpsts_get_current_status($user_id)
// Set current status
bpsts_set_current_status($user_id, $status_id)
Activity Functions
// Get all feeling activities
bpsts_get_feeling_activities()
// Add custom feeling activity
bpsts_add_feeling_activity($activity_data)
// Delete feeling activity
bpsts_delete_feeling_activity($activity_id)
// Get default activities
bpsts_get_default_activities()
JavaScript API
Status Selection
// Select mood emoji
$.bp_status_select_mood_emojis(parent, item, value, title, image, iconClass)
// Select activity emoji
$.bp_status_select_activity_emojis(parent, value, title, image, text, iconClass)
AJAX Actions
// Available AJAX actions
'bpsts_add_status' // Add new status
'bpsts_update_status' // Update existing status
'bpsts_delete_status' // Delete status
'bpsts_current_status' // Set current status
'bpsts_delete_status_icon' // Delete status icon
Hooks & Filters
Actions
// After status added
do_action('bpsts_after_status_added', $user_id, $status_id, $status_data)
// After status deleted
do_action('bpsts_after_status_deleted', $user_id, $status_id)
// After current status set
do_action('bpsts_after_current_status_set', $user_id, $status_id)
Filters
// Filter status before saving
apply_filters('bpsts_before_save_status', $status_text, $user_id)
// Filter status display
apply_filters('bpsts_status_display', $status_text, $user_id)
// Filter feeling activities
apply_filters('bpsts_feeling_activities', $activities)
// Filter status character limit
apply_filters('bpsts_status_character_limit', 140)
Customization
Adding Custom Status Locations
// Display current status
function my_custom_status_display() {
$user_id = get_current_user_id();
$current_status = bpsts_get_current_status($user_id);
if ($current_status) {
echo '<div class="custom-status">';
echo esc_html($current_status['status']);
echo '</div>';
}
}
Custom Feeling Activities
// Add via code
function add_custom_activities() {
$activity = array(
'name' => 'Coding',
'icon_type' => 'fontawesome',
'icon_class' => 'fa-solid fa-code'
);
bpsts_add_feeling_activity($activity);
}
add_action('init', 'add_custom_activities');
Styling Customization
/* Override status styles */
.bpsts-current-status {
/* Your custom styles */
}
/* Custom emoji picker styles */
.bpsts-emoji-picker-popup {
/* Your custom styles */
}
Build Process
Prerequisites
- Node.js and npm
- Grunt CLI
Setup
npm install
Build Commands
# Build all assets
grunt
# Watch for changes
grunt watch
# Build for production
grunt build
Grunt Tasks
clean: Clean build directoriesrtlcss: Generate RTL stylesheetscssmin: Minify CSS filesuglify: Minify JavaScript files
Security Considerations
Nonce Verification
All AJAX requests include nonce verification:
check_ajax_referer('bpsts-ajax-nonce', 'ajax_nonce');
Data Sanitization
- Status text:
sanitize_text_field() - HTML content:
wp_kses_post() - User input:
esc_attr(),esc_html()
Capability Checks
if (!bp_is_my_profile() && !current_user_can('manage_options')) {
return;
}
Performance Optimization
Caching
- User statuses cached in memory during request
- Transients for expensive queries
- Proper cache invalidation on updates
Asset Loading
- Conditional loading based on page context
- Minified assets in production
- CDN usage for Font Awesome
Translation
Text Domain
buddypress-status
Localization Functions
__('Text', 'buddypress-status')
_e('Text', 'buddypress-status')
esc_html__('Text', 'buddypress-status')
JavaScript Localization
bpsts_ajax_object.translation_key
Debugging
Debug Constants
define('BPSTS_DEBUG', true);
Error Logging
if (defined('BPSTS_DEBUG') && BPSTS_DEBUG) {
error_log('BuddyPress Status: ' . $message);
}
Testing
Unit Tests
Located in tests/ directory (if implemented)
Manual Testing Checklist
- Status CRUD operations
- Emoji picker functionality
- Feeling/Activity selection
- Character limit enforcement
- AJAX operations
- RTL support
- Translation strings
Browser Support
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
Contributing
- Follow WordPress Coding Standards
- Add proper documentation
- Test thoroughly
- Submit pull requests with clear descriptions
Future Enhancements
- REST API endpoints
- Gutenberg block support
- Advanced privacy controls
- Status scheduling
- Rich media attachments
- WebSocket real-time updates
