Installation & Setup
Prerequisites
- WP-CLI installed and configured
- BuddyPress Member Export Import plugin activated
- SSH access to your server
- Appropriate user permissions
Verify Installation
# Check if WP-CLI is installed
wp --version
# Verify plugin is active
wp plugin list --status=active | grep bp-xprofile-export-import
# Check available commands
wp help bp-member
Available Commands
Command Overview
wp bp-member <command> [options]
Commands:
list List xProfile groups and fields
stats Show member statistics
export Export members to CSV
import Import members from CSV
mapping Generate field mapping template
Global Options
All commands support these global options:
--format=<format> Output format (table, csv, json, yaml)
--quiet Suppress non-error output
--debug Show debug information
--color Use colors in output
Export Commands
Basic Export
Export All Members
# Export all members with all fields
wp bp-member export
# Export to specific file
wp bp-member export --output=/path/to/export.csv
# Export with progress bar
wp bp-member export --progress
Export Specific Users
# Export specific user IDs
wp bp-member export --user-ids=1,2,3,4,5
# Export users by role
wp bp-member export --role=subscriber
# Export users by meta query
wp bp-member export --meta-key=active --meta-value=1
Field Selection
Export Specific xProfile Groups
# Export only specific profile groups
wp bp-member export --groups=1,2
# List available groups first
wp bp-member list --type=groups
# Export group by name
wp bp-member export --group-names="Base,Contact Info"
Export Specific Fields
# Export specific fields by ID
wp bp-member export --fields=1,2,3,4,5
# List available fields first
wp bp-member list --type=fields
# Export fields by name
wp bp-member export --field-names="Name,Bio,Location"
Export Options
Include Additional Data
# Include WordPress standard fields
wp bp-member export --standard-fields
# Include user meta data
wp bp-member export --user-meta
# Include specific meta fields
wp bp-member export --meta-fields="last_login,total_posts"
# Include avatar URLs
wp bp-member export --avatars
# Include group memberships
wp bp-member export --groups-membership
# Include all additional data
wp bp-member export --standard-fields --user-meta --avatars --groups-membership
Performance Options
# Set batch size for large exports
wp bp-member export --batch-size=500
# Limit number of users
wp bp-member export --limit=1000
# Add offset for pagination
wp bp-member export --limit=1000 --offset=5000
# Optimize for large datasets (50K+ users)
wp bp-member export --optimize
Complete Export Examples
Example 1: Full Export with All Data
wp bp-member export \
--output=/var/www/exports/full-export.csv \
--standard-fields \
--user-meta \
--avatars \
--groups-membership \
--progress
Example 2: Selective Export for Migration
wp bp-member export \
--role=subscriber \
--groups=1,2 \
--fields=1,2,3,4,5 \
--standard-fields \
--output=/tmp/migration.csv \
--batch-size=1000 \
--progress
Example 3: Daily Backup Export
# Export with timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
wp bp-member export \
--output=/backups/members_${TIMESTAMP}.csv \
--optimize \
--quiet
Import Commands
Basic Import
Simple Import
# Import from CSV file
wp bp-member import /path/to/import.csv
# Import with progress
wp bp-member import /path/to/import.csv --progress
# Dry run (preview without importing)
wp bp-member import /path/to/import.csv --dry-run
Field Mapping
Auto Mapping
# Use automatic field mapping
wp bp-member import /path/to/import.csv --auto-map
# Show mapping before import
wp bp-member import /path/to/import.csv --show-mapping
Manual Mapping
# Generate mapping template
wp bp-member mapping --csv=/path/to/import.csv > mapping.json
# Edit mapping.json, then import
wp bp-member import /path/to/import.csv --mapping=mapping.json
# Inline mapping
wp bp-member import /path/to/import.csv \
--map="csv_column1:field_1,csv_column2:field_2"
Import Options
User Handling
# Update existing users
wp bp-member import /path/to/import.csv --update-existing
# Skip existing users
wp bp-member import /path/to/import.csv --skip-existing
# Only update, don't create new
wp bp-member import /path/to/import.csv --update-only
# Set default role for new users
wp bp-member import /path/to/import.csv --default-role=subscriber
Notifications
# Send welcome emails to new users
wp bp-member import /path/to/import.csv --send-notifications
# Custom notification template
wp bp-member import /path/to/import.csv \
--send-notifications \
--email-template=/path/to/template.html
Performance Options
# Set batch size
wp bp-member import /path/to/import.csv --batch-size=10
# Continue on errors
wp bp-member import /path/to/import.csv --skip-errors
# Verbose error reporting
wp bp-member import /path/to/import.csv --verbose-errors
# Memory optimization for large imports
wp bp-member import /path/to/import.csv --optimize
Complete Import Examples
Example 1: New User Import
wp bp-member import /path/to/new-users.csv \
--auto-map \
--default-role=subscriber \
--send-notifications \
--batch-size=25 \
--progress
Example 2: Update Existing Users
wp bp-member import /path/to/updates.csv \
--mapping=field-mapping.json \
--update-existing \
--skip-errors \
--verbose-errors \
--progress
Example 3: Migration Import
# First, dry run to check
wp bp-member import /migration/users.csv \
--dry-run \
--show-mapping \
--update-existing
# Then actual import
wp bp-member import /migration/users.csv \
--mapping=migration-mapping.json \
--update-existing \
--batch-size=50 \
--optimize \
--progress
Utility Commands
List xProfile Structure
List Groups
# List all xProfile groups
wp bp-member list --type=groups
# Format as JSON
wp bp-member list --type=groups --format=json
# Include field count
wp bp-member list --type=groups --include-counts
List Fields
# List all fields
wp bp-member list --type=fields
# List fields in specific group
wp bp-member list --type=fields --group=1
# Include field options
wp bp-member list --type=fields --include-options
# Format as CSV
wp bp-member list --type=fields --format=csv > fields.csv
Member Statistics
Basic Stats
# Show member statistics
wp bp-member stats
# Include role breakdown
wp bp-member stats --by-role
# Include registration dates
wp bp-member stats --by-date
# Include xProfile completion
wp bp-member stats --profile-completion
Advanced Statistics
# Full statistical report
wp bp-member stats \
--by-role \
--by-date \
--profile-completion \
--format=json > stats.json
# Group membership stats
wp bp-member stats --groups
# Activity statistics
wp bp-member stats --activity --days=30
Generate Mapping Template
Basic Mapping
# Generate mapping from CSV headers
wp bp-member mapping --csv=/path/to/import.csv
# Save to file
wp bp-member mapping --csv=/path/to/import.csv > mapping.json
# Include all available fields
wp bp-member mapping --csv=/path/to/import.csv --all-fields
Advanced Mapping
# Generate with field descriptions
wp bp-member mapping \
--csv=/path/to/import.csv \
--include-descriptions
# Auto-detect mapping
wp bp-member mapping \
--csv=/path/to/import.csv \
--auto-detect
# Custom mapping rules
wp bp-member mapping \
--csv=/path/to/import.csv \
--rules=/path/to/rules.json
Advanced Usage
Batch Processing Large Datasets
Export in Chunks
#!/bin/bash
# Export 100K users in 10K chunks
TOTAL_USERS=100000
CHUNK_SIZE=10000
OUTPUT_DIR="/exports/chunks"
for i in $(seq 0 $CHUNK_SIZE $TOTAL_USERS); do
wp bp-member export \
--limit=$CHUNK_SIZE \
--offset=$i \
--output="${OUTPUT_DIR}/users_${i}.csv" \
--optimize \
--quiet
echo "Exported chunk: $i to $((i+CHUNK_SIZE))"
done
Import in Batches
#!/bin/bash
# Import large CSV in smaller chunks
CSV_FILE="/imports/large-import.csv"
LINES=$(wc -l < "$CSV_FILE")
CHUNK_SIZE=5000
# Split CSV into chunks
split -l $CHUNK_SIZE "$CSV_FILE" /tmp/chunk_
# Import each chunk
for chunk in /tmp/chunk_*; do
wp bp-member import "$chunk" \
--auto-map \
--update-existing \
--batch-size=50 \
--skip-errors \
--quiet
echo "Imported: $chunk"
rm "$chunk" # Clean up
done
Custom Field Processing
Export with Custom Processing
# Export and post-process
wp bp-member export --format=json | \
jq '.[] | select(.role == "subscriber") | {
username: .user_login,
email: .user_email,
profile: .xprofile
}' > processed-export.json
Import with Pre-processing
# Pre-process CSV before import
awk -F',' 'BEGIN {OFS=","}
NR==1 {print} # Keep header
NR>1 {
# Process fields
$3 = tolower($3) # Lowercase email
gsub(/[^0-9]/, "", $5) # Clean phone number
print
}' input.csv > processed.csv
wp bp-member import processed.csv --auto-map
Integration with Other Systems
Export to External Database
# Export and insert into MySQL
wp bp-member export --format=json | \
jq -r '.[] | [.user_id, .user_login, .user_email] | @csv' | \
mysql -u user -p database -e "
LOAD DATA LOCAL INFILE '/dev/stdin'
INTO TABLE external_users
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'"
Sync with External API
#!/bin/bash
# Export and sync with external API
wp bp-member export --format=json | \
jq -c '.[]' | \
while read -r user; do
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_TOKEN" \
-d "$user"
done
Performance Optimization
Memory Management
Configure PHP Memory
# Temporarily increase memory for export
wp bp-member export --optimize --php-memory=512M
# For import
wp bp-member import large.csv --optimize --php-memory=1G
Monitor Memory Usage
# Export with memory monitoring
wp bp-member export \
--progress \
--debug \
2>&1 | tee export.log | \
grep -E "(Memory|Peak)"
Database Optimization
Optimize Before Operations
# Optimize database tables
wp db optimize
# Clear transients
wp transient delete --all
# Clear object cache
wp cache flush
Index Optimization
# Add indexes for better performance
wp db query "
ALTER TABLE wp_bp_xprofile_data
ADD INDEX idx_user_field (user_id, field_id);
"
Parallel Processing
Parallel Export
#!/bin/bash
# Export different user groups in parallel
wp bp-member export --role=administrator --output=admins.csv &
wp bp-member export --role=editor --output=editors.csv &
wp bp-member export --role=subscriber --output=subscribers.csv &
wait # Wait for all exports to complete
# Combine results
cat admins.csv > all-users.csv
tail -n +2 editors.csv >> all-users.csv
tail -n +2 subscribers.csv >> all-users.csv
Parallel Import
#!/bin/bash
# Import multiple CSV files in parallel
for csv in imports/*.csv; do
wp bp-member import "$csv" \
--auto-map \
--batch-size=25 \
--quiet &
done
wait # Wait for all imports
Automation & Scripting
Scheduled Exports
Daily Backup Script
#!/bin/bash
# daily-backup.sh - Run via cron
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/members"
RETENTION_DAYS=30
# Create backup
wp bp-member export \
--output="${BACKUP_DIR}/members_${DATE}.csv" \
--optimize \
--quiet
# Compress
gzip "${BACKUP_DIR}/members_${DATE}.csv"
# Remove old backups
find "$BACKUP_DIR" -name "*.csv.gz" -mtime +$RETENTION_DAYS -delete
# Log
echo "[$(date)] Backup completed: members_${DATE}.csv.gz" >> /var/log/bp-backup.log
Cron Setup
# Add to crontab
0 2 * * * /path/to/daily-backup.sh
# Weekly full export
0 3 * * 0 wp bp-member export --output=/weekly/full-export.csv --optimize
# Monthly statistics
0 4 1 * * wp bp-member stats --format=json > /reports/stats-$(date +%Y%m).json
Import Automation
Watch Folder for Imports
#!/bin/bash
# watch-imports.sh - Monitor folder for CSV files
IMPORT_DIR="/imports/pending"
PROCESSED_DIR="/imports/processed"
ERROR_DIR="/imports/errors"
inotifywait -m "$IMPORT_DIR" -e create -e moved_to |
while read path action file; do
if [[ "$file" =~ .*\.csv$ ]]; then
echo "Processing: $file"
if wp bp-member import "${IMPORT_DIR}/${file}" \
--auto-map \
--update-existing \
--batch-size=25; then
mv "${IMPORT_DIR}/${file}" "${PROCESSED_DIR}/"
echo "Success: $file"
else
mv "${IMPORT_DIR}/${file}" "${ERROR_DIR}/"
echo "Error: $file"
fi
fi
done
Integration Scripts
Sync with External System
#!/bin/bash
# sync-members.sh - Bidirectional sync
# Export from WordPress
wp bp-member export --format=json > wp-users.json
# Fetch from external system
curl -H "Authorization: Bearer $TOKEN" \
https://api.external.com/users > external-users.json
# Compare and generate import CSV
jq -r '
. as $external |
inputs as $wp |
($external | map({(.email): .}) | add) as $ext_map |
($wp | map({(.user_email): .}) | add) as $wp_map |
$external[] |
select($wp_map[.email] == null) |
[.email, .name, .phone] |
@csv
' external-users.json wp-users.json > new-users.csv
# Import new users
if [ -s new-users.csv ]; then
wp bp-member import new-users.csv --auto-map
fi
Troubleshooting
Common Issues
Memory Errors
# Check current memory limit
wp eval 'echo "Memory limit: " . ini_get("memory_limit") . "\n";'
# Run with increased memory
wp bp-member export --optimize --php-memory=512M
# Use smaller batch sizes
wp bp-member import large.csv --batch-size=5
Timeout Issues
# Increase execution time
wp bp-member import large.csv --php-timeout=0
# Use background processing
nohup wp bp-member import large.csv > import.log 2>&1 &
# Check progress
tail -f import.log
Encoding Problems
# Check file encoding
file -bi import.csv
# Convert to UTF-8
iconv -f ISO-8859-1 -t UTF-8 import.csv > import-utf8.csv
# Import with encoding specified
wp bp-member import import-utf8.csv --encoding=UTF-8
Debug Mode
Enable Debugging
# Run with debug output
wp bp-member export --debug 2> debug.log
# Verbose mode
wp bp-member import import.csv --verbose
# SQL query logging
wp bp-member export --debug=sql
Check Logs
# View WordPress debug log
tail -f wp-content/debug.log
# Check PHP error log
tail -f /var/log/php-error.log
# Plugin specific log
tail -f wp-content/bpxp-operations.log
Performance Analysis
Profile Export Performance
# Time the export
time wp bp-member export --output=test.csv
# Memory profiling
wp bp-member export --profile=memory
# Query analysis
wp bp-member export --profile=queries
Optimize Slow Imports
# Analyze import bottlenecks
wp bp-member import test.csv \
--dry-run \
--profile=all \
--verbose
# Test different batch sizes
for size in 5 10 25 50; do
echo "Testing batch size: $size"
time wp bp-member import test.csv \
--batch-size=$size \
--limit=100
done
Best Practices
Before Operations
- Always backup database
- Test on staging environment first
- Check available disk space
- Verify PHP settings (memory, execution time)
- Clear caches
During Operations
- Use
--progressfor visibility - Start with small batches
- Monitor server resources
- Use
--skip-errorsfor resilience - Log output for debugging
After Operations
- Verify data integrity
- Clear caches again
- Check error logs
- Document any issues
- Keep backups of import/export files
Command Reference
Quick Reference
# Export
wp bp-member export [--output=<file>] [--user-ids=<ids>] [--fields=<ids>]
[--groups=<ids>] [--standard-fields] [--user-meta]
[--avatars] [--batch-size=<size>] [--optimize]
# Import
wp bp-member import <file> [--mapping=<file>] [--auto-map]
[--update-existing] [--batch-size=<size>]
[--default-role=<role>] [--send-notifications]
# List
wp bp-member list --type=<groups|fields> [--format=<format>]
# Stats
wp bp-member stats [--by-role] [--by-date] [--profile-completion]
# Mapping
wp bp-member mapping --csv=<file> [--auto-detect] [--all-fields]
Support
For CLI-specific help:
- Use
wp help bp-memberfor detailed command help - Check WP-CLI documentation at wp-cli.org
- Plugin support at wbcomdesigns.com
