A comprehensive WordPress plugin that integrates Microsoft Azure/Microsoft 365 with WordPress and WooCommerce. Single sign-on, calendar sync, email, backups, PTA organizational management, OneDrive media, Classes, Event Tickets, Newsletter, Auction, Product Fields, Donations, and Volunteer Sign Up modulesβall from one unified plugin (also known as Microsoft WP).
Current (v3.51): Fixed the user-account dropdown showing "Log In" for already-logged-in users. The shortcode now renders the full logged-in menu directly in PHP for authenticated requests (W3TC bypasses the page cache for logged-in users via pgcache.reject.logged = true, so this is safe), keeping the cache-safe JS-swap as a fallback for any cached anonymous HTML accidentally served to a logged-in browser. Also stops depending on JS execution succeeding in the presence of unrelated errors elsewhere on the page.
v3.50: PTA Roles module toggle now saves reliably from both the main PTA Tools page and the PTA Roles page β replaced the page-specific .pta-module-toggle handler with the shared .module-toggle + data-module="pta" pattern and removed a duplicate inline AJAX handler on the main page that was racing against admin.js. Same root cause and fix pattern as the v3.49 Calendar Sync save fix.
- Introduction
- Recent Updates & Performance
- Features Overview
- Requirements
- Initial Setup & Basic Configuration
- Common Configuration
- Module Configurations
- Shortcodes Reference
- Performance & Optimization
- Troubleshooting
- Contributing
- Support & Documentation
PTA Tools (Microsoft WP) is an all-in-one plugin that brings Microsoft Azure/Microsoft 365 and WooCommerce together. Use it for enterprise authentication, backups, calendar sync, email, PTA roles, OneDrive media, Classes (variable pricing, TEC events), Event Tickets (seating, QR, Apple Wallet), Newsletter (drag-drop editor, tracking), Auction (bidding, Buy It Now, winner checkout), Product Fields (custom checkout fields with children profiles), Donations (round-up at checkout, campaigns, shortcode), and Volunteer Sign Up (SignUpGenius-style event sign-up sheets).
- Unified Management: One plugin for Microsoft integrations and PTA/WooCommerce features
- Enterprise-Grade Security: OAuth 2.0 with Azure AD
- Flexible Configuration: Common or per-module Azure credentials
- Modular Design: Enable only the modules you need (SSO, Backup, Calendar, Email, PTA, OneDrive, TEC Sync, Classes, Newsletter, Tickets, Auction, Product Fields, Donations, Volunteer Sign Up)
- Professional Grade: Built for reliability and ease of use
Recent updates have significantly improved plugin performance:
Performance Improvements:
- β 45-50% faster page loads - Eliminated 185 file I/O operations per request
- β Phase 1: Removed hot path logging (108 file writes)
- β Phase 2: Cleaned component initialization (77 file writes)
- β Automatic log cleanup - Old logs deleted after 30 days
- β Database activity cleanup - Records cleaned after 90 days
- β Scheduled maintenance - Daily WP-Cron jobs for housekeeping
What Was Optimized:
- Phase 1: Removed verbose debug logging from plugin initialization and loading
- Phase 2: Cleaned all component init methods, added user-controlled debug mode
- Implemented intelligent log rotation (20MB limit)
- Added module-specific debug mode UI (enable only when needed)
Debug Mode Available:
- Enable in Azure Plugin β Main Settings β Debug Mode
- Select specific modules to debug (SSO, Calendar, TEC, etc.)
- Zero performance impact when disabled
- Respects WordPress
WP_DEBUGsetting
A comprehensive code review has been completed:
- Overall Rating: 6.5/10
- Security: β Strong (623+ proper escaping instances, nonce verification)
- Architecture: β Well-structured modular design
- Performance: β Recently optimized (was critical issue, now resolved)
Full review available: See review.md for detailed analysis and roadmap.
- Azure AD authentication for WordPress
- Replace or supplement traditional WordPress login
- Automatic user provisioning
- Custom button text and branding
- Forced SSO mode for enhanced security
- Exclusion list with domain-based filtering (block external domains from sync/login)
- Automated backups to Azure Blob Storage
- Database, files, media, plugins, and themes backup
- Granular plugin/theme selection (choose individual items to back up)
- Scheduled backups with customizable frequency
- Real-time progress bars for both backup and restore operations
- Sync from Azure Storage to list and restore remote backups (useful on new instances)
- Chunked uploads and streamed downloads to handle large sites without OOM
- Email notifications
- Embed Microsoft 365/Outlook calendars
- Multiple view options (month, week, day, list)
- Customizable appearance
- Event filtering and display options
- Responsive design
- Sync Microsoft 365 calendars to The Events Calendar (TEC)
- Bi-directional sync support
- Category mapping
- Automated scheduled sync
- Per-mapping sync schedules
- Send emails via Microsoft Graph API
- Multiple authentication methods
- Contact forms with spam protection
- Email queue management
- Replace WordPress wp_mail() function
- Complete organizational structure management
- Department and role hierarchy with interactive org chart
- Azure AD user provisioning
- Office 365 group sync with department and role-level mappings
- O365 group email display on org chart (mailto links)
- Forminator integration for PTA role signup forms (modal popup from org chart)
- Exec Board, Treasurer, Secretary support alongside VP roles
- Audit trail and reporting
- Store WordPress media in OneDrive/SharePoint with automatic upload
- SharePoint document library integration with site/drive browsing
- Recursive sync into year-based subfolders
- Repair Missing Media tool (re-downloads files missing locally after backup restore)
- Sharing link and thumbnail URL generation
- Optional local copy retention or cloud-only storage
- WooCommerce βClassβ product type with TEC event integration
- Variable pricing (min/max attendees, final price)
- Commit-to-buy flow and payment request emails
- Chaperone assignment and season/schedule metadata
- Drag-and-drop newsletter editor
- Lists, campaigns, and queue management
- Open/click tracking and bounce handling
- Send via Microsoft Graph or configured mailer
- WooCommerce βEvent Ticketβ product type
- Visual seating designer and seat selection
- QR code tickets and Apple Wallet
- Event check-in
- WooCommerce βAuctionβ product type
- Bidding end date/time; optional Buy It Now with immediate payment
- Live countdown timer on product page
- Quick bid buttons (+$5, +$10, +$20) and max bid (auto-bid)
- Confirm-bid modal to prevent accidental bids
- Instant bid history updates (no page refresh needed)
- Masked bidder display (e.g. βJa***β); full bid audit trail in dedicated database table
- Winner order and checkout (Stripe via WooCommerce); βYou wonβ email
- Custom WooCommerce checkout fields (childβs name, allergies, etc.)
- Children Profiles: parents manage multiple child profiles on their account
- Field values auto-populate from saved profiles during checkout
- Group fields and apply by product category
- Saved to user accounts for auto-population on return visits
- Admin management UI under Selling > Product Fields
- Round-up to nearest dollar toggle at checkout
- Quick-pick donation buttons ($1, $5, $10 or custom)
- Campaign management with fundraising goals and progress tracking
[pta-donate]shortcode for standalone donation forms on any page- All donations recorded and linked to WooCommerce orders
- SignUpGenius-style volunteer sign-up sheets
- Link sheets to The Events Calendar events (auto-populate date and location)
- Define activities/roles with configurable volunteer spots
- Users sign up from the frontend; guests prompted to log in or register
- Confirmation email on sign-up; 1-day reminder email before the event
[volunteer_signup id=βXβ]shortcode for any page- Admin management UI under Calendar > Volunteer Sign Up
- WordPress: 5.0 or higher
- PHP: 7.4 or higher
- MySQL: 5.6 or higher
- HTTPS: Required for Azure authentication
- cURL Extension: Required for API communications
- WooCommerce: Required for Classes, Event Tickets, Auction, Product Fields, and Donations modules
- The Events Calendar: Optional; required for Calendar Sync and Volunteer Sign Up TEC event linking
- WordPress: 6.0 or higher
- PHP: 8.0 or higher
- MySQL: 8.0 or higher
- Memory: 256MB or higher
- Max Execution Time: 300 seconds (for backups and sync operations)
curl- For API communicationsjson- For data processingopenssl- For secure communicationszip- For backup archive creationmysqli- For database operations
- Active Azure subscription (free tier available)
- Azure AD tenant
- App registration in Azure AD
- Appropriate API permissions (varies by module)
- Download the plugin ZIP file
- In WordPress, go to Plugins β Add New β Upload Plugin
- Select the
Azure Plugin.zipfile - Click Install Now
- After installation, click Activate Plugin
Before configuring the plugin, you need to create an App Registration in Azure AD:
-
Go to the Azure Portal
-
Navigate to Azure Active Directory β App registrations
-
Click New registration
-
Configure your application:
- Name:
WordPress Microsoft Integration(or your site name) - Supported account types:
- Single tenant (recommended for most organizations)
- Multi-tenant if needed for guests
- Redirect URI:
- Platform: Web
- URL:
https://yoursite.com/wp-admin/admin-ajax.php?action=azure_sso_callback - (Replace
yoursite.comwith your actual domain)
- Name:
-
Click Register
After registration, note these important values:
- Application (client) ID: Found on the app overview page
- Directory (tenant) ID: Found on the app overview page
- Client Secret:
- Go to Certificates & secrets
- Click New client secret
- Add a description (e.g., "WordPress Plugin")
- Choose expiration (recommend 24 months)
- Click Add
- Copy the Value immediately (you can't see it again!)
In your App Registration, go to API permissions:
- Click Add a permission
- Select Microsoft Graph
- Choose Delegated permissions or Application permissions based on your needs
Recommended Starting Permissions:
-
Delegated permissions:
User.Read- Read user profileCalendars.Read- Read calendarsCalendars.ReadWrite- Write to calendarsMail.Send- Send emailsFiles.Read.All- Read OneDrive filesSites.Read.All- Read SharePoint sites
-
Application permissions (for PTA module):
User.ReadWrite.All- Manage usersGroup.ReadWrite.All- Manage groupsDirectory.ReadWrite.All- Update user properties
- Click Add permissions
- Click Grant admin consent for [Your Organization] (requires admin rights)
After installing and activating the plugin, navigate to Azure Plugin in your WordPress admin menu.
The plugin supports two credential modes:
Use one set of Azure credentials for all modules:
-
Navigate to Azure Plugin β Main Settings
-
Check "Use common credentials for all modules"
-
Enter your credentials:
- Client ID: Your Application (client) ID
- Client Secret: Your client secret value
- Tenant ID: Your Directory (tenant) ID (or use
commonfor multi-tenant)
-
Click Save Settings
Benefits:
- Simpler management
- Single app registration needed
- Easier permission management
Use different Azure app registrations for each module:
- Leave "Use common credentials" unchecked
- Configure credentials individually in each module settings page
- Each module will show its own credential input fields
Benefits:
- Granular permission control
- Separate apps for different purposes
- Better security isolation
Enable or disable modules based on your needs:
-
Go to PTA Tools (Azure Plugin) β Main Settings
-
Toggle modules on/off:
- SSO β Single Sign-On authentication
- Backup β Azure Blob Storage backups
- Calendar β Calendar embedding
- Email β Microsoft Graph email
- PTA Roles β Organizational management
- TEC Integration β Sync Outlook calendars to The Events Calendar
- OneDrive Media β OneDrive/SharePoint media
- Classes β Class products with variable pricing and TEC
- Newsletter β Newsletter editor and sending
- Event Tickets β Seating, QR tickets, check-in
- Auction β Auction products with bidding and Buy It Now
- Product Fields β Custom WooCommerce checkout fields
- Donations β Round-up at checkout and campaign donations
- Volunteer Sign Up β SignUpGenius-style event volunteer sheets
-
Click Configure next to any enabled module to access its settings
Admin Page: Azure Plugin β SSO
Enable secure authentication using Microsoft Azure AD. Users can sign in with their Microsoft 365 accounts instead of (or in addition to) WordPress passwords.
- Require SSO: Force all users to authenticate via Azure AD (disables WordPress login)
β οΈ Warning: Test SSO thoroughly before enabling this!
- Auto Create Users: Automatically create WordPress accounts for new Azure AD users
- Default Role: WordPress role assigned to new SSO users (Subscriber, Author, Editor, etc.)
- Use Custom Role: Create a custom WordPress role specifically for Azure AD users
- Custom Role Name: Name for the custom role (default: "AzureAD")
- The role will have basic subscriber capabilities plus
azure_ad_usercapability
- The role will have basic subscriber capabilities plus
- Show on Login Page: Display the SSO button on the WordPress login page
- Button Text: Customize the text shown on the login button
- Default: "Sign in with WilderPTSA Email"
- The Microsoft icon will always be displayed
- Example: "Sign in with Company Email"
- Enable User Sync: Automatically sync user data from Azure AD
- Sync Frequency: How often to sync users (hourly, daily, weekly)
- Preserve Local Data: Keep local WordPress user data during sync
- Excluded Users: Manually exclude specific usernames from sync
- Exclude External Domains: Check "Do not sync accounts from outside domain" to block all email domains that don't match your organization domain (e.g., block gmail.com, outlook.com, yahoo.com while allowing wilderptsa.net). Applies to both sync and SSO login.
- Click Test SSO Connection to verify your Azure configuration
- Open an incognito/private browser window
- Go to your WordPress login page
- Click the SSO button
- Sign in with a Microsoft account
- Verify you're logged into WordPress
[azure_sso_login]
[azure_sso_login text="Sign in with WilderPTSA Email" redirect="/dashboard"]
Parameters:
text- Button text (default: "Sign in with WilderPTSA Email")redirect- URL to redirect to after loginclass- CSS class for the buttonstyle- Inline CSS styles
[azure_sso_logout]
[azure_sso_logout text="Sign out" redirect="/"]
Parameters:
text- Button text (default: "Sign out")redirect- URL to redirect to after logoutclass- CSS class for the buttonstyle- Inline CSS styles
[azure_user_info]
[azure_user_info field="display_name"]
[azure_user_info field="email"]
Parameters:
field- Specific field to display:display_name- User's display nameemail- User's email addressazure_id- Azure user IDlast_login- Last login timestampwp_username- WordPress usernamewp_display_name- WordPress display name
logged_out_text- Message shown when user is not logged informat- Output format (htmlorjson)
Admin Page: Azure Plugin β Backup
Automated backups of your WordPress site to Azure Blob Storage. Securely store database, files, media, plugins, and themes in the cloud.
- Azure Storage Account
- Azure Blob Storage container
- Storage account access key
- In Azure Portal, create a Storage Account
- Create a Container (e.g., "wordpress-backups")
- Note your Storage Account Name and Access Key
If not using common credentials:
- Storage Account Name: Your Azure storage account name
- Storage Account Key: Access key from Azure Portal
- Container Name: Name of your blob container
-
Backup Types: Select what to backup:
- β Database
- β WordPress Content (
wp-contentfolder) - β Media Files (
wp-content/uploads) - β Plugins β expandable with individual plugin checkboxes
- β Themes β expandable with individual theme checkboxes
-
Use "select individually" to expand plugins or themes and choose specific items
-
Scheduled Backups:
- Enable automated backups
- Frequency: hourly, daily, weekly, monthly
-
Backup Retention:
- Number of backups to keep
- Older backups are automatically deleted
-
Email Notifications:
- Send email when backup completes
- Send email on backup failures
- Notification email address
Click Start Manual Backup to run an immediate backup. A real-time progress bar tracks each phase (database, content, media, plugins, themes, archive creation, Azure upload).
From Recent Backup Jobs (local database):
- Find the backup in Recent Backup Jobs
- Click Restore next to the backup
- A progress bar tracks the restore operation in real-time
β οΈ Warning: This will overwrite existing data!
From Azure Storage (remote / new instance):
- Click Sync from Azure to list all backups stored in Azure Blob Storage
- The Azure Storage Backups table shows blob name, size, date, and whether a local job record exists
- Click Restore on any remote backup to download and restore it directly
- Progress is tracked in real-time during download, extraction, and restoration
Admin Page: Azure Plugin β Calendar
Embed Microsoft 365 or Outlook calendars directly into your WordPress pages and posts. Display events in multiple views with customizable styling.
- Your M365 Account: Your Microsoft 365 email address
- Shared Mailbox Email (optional): Email of a shared mailbox to access
- Click Authenticate Calendar to sign in with Microsoft
- Grant permissions when prompted
After authentication:
- Click Refresh Calendars to load your available calendars
- Select which calendars to enable for embedding
- Set timezone for each calendar
- Click Save Calendar Settings
[azure_calendar id="calendar_id"]
[azure_calendar id="AQMkADAwATMwMAItZjFiZS00" view="month" height="600px"]
Parameters:
id- Required. Calendar ID from Calendar admin pageview- Display view:month,week,day,list(default:month)height- Calendar height (default:600px)width- Calendar width (default:100%)theme- Color theme:default,darktimezone- Timezone for displaymax_events- Maximum events to display (default: 100)start_date- Start date filter (ISO format)end_date- End date filter (ISO format)show_toolbar- Show calendar navigation toolbar (default:true)show_weekends- Display weekends (default:true)first_day- First day of week:0(Sunday) or1(Monday)time_format- Time format:12hor24h
[azure_calendar_events id="calendar_id"]
[azure_calendar_events id="calendar_id" limit="10" format="list" upcoming_only="true"]
Parameters:
id- Required. Calendar IDlimit- Number of events to display (default: 10)format- Display format:list,grid,compact(default:list)show_dates- Show event dates (default:true)show_times- Show event times (default:true)show_location- Show event location (default:true)show_description- Show event description (default:false)date_format- PHP date format (default:M j, Y)time_format- PHP time format (default:g:i A)upcoming_only- Show only future events (default:true)class- CSS class for styling
[azure_calendar_event id="calendar_id" event_id="event_id"]
Parameters:
id- Required. Calendar IDevent_id- Required. Specific event IDshow_attendees- Show event attendees (default:false)show_description- Show event description (default:true)class- CSS class for styling
Admin Page: Azure Plugin β Calendar β TEC Sync Tab
Synchronize Microsoft 365 calendars with The Events Calendar (TEC) plugin. Automatically import Outlook events as WordPress events with category mapping and scheduled sync.
- The Events Calendar plugin must be installed and activated
- Calendar authentication (same as Calendar Embed module)
Use the same authentication as Calendar Embed:
- Your M365 Account: Your Microsoft 365 email address
- Shared Mailbox Email (optional): Shared mailbox to sync from
- Click Authenticate Calendar
- Click Add Calendar Mapping
- In the modal:
- Outlook Calendar: Select the source Microsoft calendar
- TEC Category: Choose or create a TEC category
- Schedule Settings:
- Enable scheduled sync
- Sync frequency (every 15min, 30min, hourly, daily)
- Lookback days (how far in the past to sync)
- Lookahead days (how far in the future to sync)
- Click Save Mapping
- Manual Sync: Click Sync Now to immediately sync all mappings
- Scheduled Sync: Enable per-mapping automatic synchronization
- Delete Mapping: Remove calendar mappings you no longer need
- Plugin fetches events from your Outlook calendar
- Events are created/updated in The Events Calendar
- Events are assigned to the mapped TEC category
- Sync runs on the configured schedule
- Duplicate events are prevented by checking event IDs
TEC Integration uses The Events Calendar's built-in shortcodes and display features. Refer to TEC documentation for displaying synced events.
Admin Page: Azure Plugin β Email
Send emails through Microsoft Graph API instead of traditional SMTP. Includes contact forms, email queue management, and WordPress wp_mail() replacement.
Choose your authentication approach:
-
User Authentication: Send emails on behalf of specific users
- Enter user email address
- Authenticate with Microsoft
- Grant Mail.Send permissions
-
Application Authentication: Send emails as the application
- Requires application-level permissions
- No per-user authentication needed
- From Name: Default sender name for emails
- From Email: Default sender email address
- Reply-To Email: Email for replies
- Replace wp_mail(): Use Microsoft Graph for all WordPress emails
- Enable Contact Forms: Allow use of contact form shortcode
- Default Recipient: Email address to receive form submissions
- Spam Protection: Enable built-in spam filtering
- Rate Limiting: Limit form submissions per IP
- Enable Queue: Process emails asynchronously
- Queue Processing: Frequency of queue processing
- Retry Failed: Automatically retry failed emails
- Max Retries: Number of retry attempts
[azure_contact_form]
[azure_contact_form to="admin@site.com" subject="Contact Form Submission"]
Parameters:
to- Recipient email addresssubject- Email subject lineshow_phone- Show phone number field (default:false)show_company- Show company field (default:false)required_fields- Comma-separated list:name,email,phone,messagesuccess_message- Message shown after successful submissionbutton_text- Submit button text (default: "Send Message")class- CSS class for form styling
Example with all options:
[azure_contact_form
to="sales@company.com"
subject="Sales Inquiry"
show_phone="true"
show_company="true"
required_fields="name,email,phone,message"
success_message="Thanks! We'll contact you soon."
button_text="Get in Touch"]
[azure_email_status]
[azure_email_status show_queue_count="true"]
Parameters:
show_queue_count- Display pending email count (default:true)show_failed_count- Display failed email count (default:true)show_success_rate- Display success rate percentage (default:true)
[azure_email_queue]
[azure_email_queue limit="20" status="pending"]
Parameters:
limit- Number of emails to display (default: 10)status- Filter by status:pending,sent,failed,all(default:all)show_details- Show email content preview (default:false)
Admin Page: Azure Plugin β PTA Roles
Complete organizational management system for PTAs and nonprofits. Manage departments, roles, and assignments with automatic Azure AD provisioning and Office 365 group synchronization.
- Go to Azure Plugin β Main Settings
- Enable PTA Roles module
- Ensure you have these Azure permissions:
User.ReadWrite.AllGroup.ReadWrite.AllDirectory.ReadWrite.All
- Go to PTA Roles β Departments
- Default departments are pre-configured:
- Exec Board
- Communications
- Enrichment
- Events
- Volunteers
- Ways and Means
- Assign Vice Presidents (VPs) to each department
- VPs become Azure AD managers for their department members
- Go to PTA Roles β Roles
- 58+ pre-configured roles available
- Each role has:
- Name and description
- Department assignment
- Maximum occupancy
- Current assignment count
- Go to PTA Roles β Assign Users
- Select a user
- Assign to one or more roles
- Set primary role (determines Azure AD manager)
- Changes automatically sync to Azure AD
- Go to PTA Roles β O365 Groups
- Click Sync O365 Groups to import groups from tenant
- Create mappings:
- Map individual roles to groups (via Edit Role modal)
- Map departments to groups (via Edit Department modal)
- Group memberships automatically sync based on role assignments
- O365 group emails appear on the org chart as
mailto:links (e.g.,president@wilderptsa.net)
- Go to PTA Roles β Forminator Customization
- Select a Forminator form to use as the PTA role signup form
- Map form fields to role name, department, first name, last name, email
- When visitors click a role on the org chart, a modal opens with the form pre-populated
- Logged-in users have their name and email pre-filled automatically
- Sync Queue: Monitor background jobs for user provisioning
- Audit Logs: Complete history of all organizational changes
- Dashboard: Overview of departments, roles, and assignments
- User Assignment: Admin assigns WordPress user to PTA role
- Azure AD Provisioning: If user doesn't have Azure AD account:
- Account is automatically created
- Email:
firstname+lastInitial@wilderptsa.net - Office 365 Business Basic license assigned
- Temporary password generated
- Manager Hierarchy: Primary role determines Azure AD manager
- Department VPs become managers
- Hierarchy syncs to Azure AD
- Group Membership: User is added to mapped Office 365 groups
- Job Title Sync: Role assignments become Azure AD job titles
[pta-roles-directory]
[pta-roles-directory department="communications" columns="3" layout="team-cards"]
Parameters:
department- Filter by department name or slugdescription- Show role descriptions (default:false)status- Filter by status:all,open,filled,partial(default:all)columns- Number of columns: 1-5 (default: 3)show_count- Show assignment count (default:true)show_vp- Show department VP (default:false)layout- Display layout:grid,list,cards,team-cards(default:grid)show_avatars- Show user avatars in team-cards layout (default:true)show_contact- Show contact links in team-cards layout (default:true)avatar_size- Avatar size in pixels (default: 80)
[pta-department-roles department="communications"]
[pta-department-roles department="events" show_vp="true" show_description="true"]
Parameters:
department- Required. Department name or slugshow_vp- Show department VP (default:true)show_description- Show role descriptions (default:false)layout- Display layout:list,grid(default:list)
[pta-org-chart]
[pta-org-chart department="all" interactive="true" height="500px"]
Parameters:
department- Department to display orall(default:all)interactive- Enable interactive features (default:false)height- Chart height (default:400px)
[pta-role-card role="president"]
[pta-role-card role="communications-vp" show_contact="true"]
Parameters:
role- Required. Role name or slugshow_contact- Show contact information (default:false)show_description- Show role description (default:true)show_assignments- Show assigned users (default:true)
[pta-department-vp department="communications"]
[pta-department-vp department="events" show_email="true"]
Parameters:
department- Required. Department name or slugshow_contact- Show contact information (default:false)show_email- Show email address (default:false)
[pta-open-positions]
[pta-open-positions department="volunteers" limit="5"]
Parameters:
department- Filter by department orall(default:all)limit- Maximum positions to show (default: -1 for all)show_department- Show department names (default:true)show_description- Show role descriptions (default:false)
[pta-user-roles]
[pta-user-roles user_id="123" show_department="true"]
Parameters:
user_id- User ID to display roles for (default: current user)show_department- Show department names (default:true)show_description- Show role descriptions (default:false)
Admin Page: Azure Plugin β OneDrive Media
Store WordPress media files in OneDrive or SharePoint with automatic upload, cloud-first serving, and full Media Library integration. Files uploaded through WordPress are sent to OneDrive/SharePoint and optionally removed locally to save server space.
- Enter your M365 email address
- Click Authorize OneDrive Access
- Grant permissions:
Files.Read.AllFiles.ReadWrite.AllSites.Read.All
Choose your storage location:
Option A: OneDrive
- Select OneDrive
- Click Browse Folders
- Select your base folder
- Click Select Folder
Option B: SharePoint
- Select SharePoint
- Enter SharePoint site URL
- Click Browse Sites to search for your site
- Click Browse Drives to select document library
- Click Browse Folders to select base folder
- Base Folder: Root folder for media files
- Year-Based Folders: Automatically organize media by year (e.g.,
WordPress Media/2025/,WordPress Media/2026/) - Create Year Folders: Click to generate folder structure
- Sync from OneDrive Now: Import new files from OneDrive into the Media Library. Recursively walks all subfolders (including year-based folders) to find files not yet mapped.
- Repair Missing Media: Re-download files that have OneDrive mappings but are missing locally. Essential after restoring a backup on a new server where the physical media files weren't included. Also refreshes stale sharing/thumbnail URLs.
- Auto-Sync: Enable scheduled sync (hourly, twice daily, or daily) to automatically import new files.
- Sharing Links: Anonymous or organization-only access links
- CDN Optimization: Leverage Microsoft's global CDN for faster delivery
- Local Copies: Optionally keep local copies or serve directly from OneDrive
Files are accessed through the WordPress media library interface. OneDrive/SharePoint URLs are transparently served via wp_get_attachment_url filters.
Admin Page: Azure Plugin β Classes
WooCommerce βClassβ product type for courses/workshops with The Events Calendar integration, variable pricing based on enrollment, and a commit-to-buy flow. Admins set schedule, venue, chaperone, and pricing; customers commit first and pay when the final price is set.
- Product type: βClassβ in WooCommerce product type selector
- Schedule: Start date, recurrence, occurrences, start time, duration
- Variable pricing: Min/max attendees, price at min/max, final price when finalized
- Commitment flow: $0 checkout to reserve; payment request email when final price is set
- Chaperone: Assign and invite by email
- TEC: Optional link to TEC events for calendar display
Class products are sold via standard WooCommerce product pages and cart/checkout.
Admin Page: Azure Plugin β Newsletter
Create and send newsletters with a drag-and-drop editor, manage lists and campaigns, track opens/clicks, and handle bounces. Can use the pluginβs email module (e.g. Microsoft Graph) or your configured mailer.
- Editor: Drag-and-drop content blocks
- Lists: Subscriber lists and membership
- Campaigns: Create and send campaigns from templates
- Queue: Queue management and sending
- Tracking: Open and click tracking; bounce handling and stats
Newsletter signup/display shortcodes (if any) are configured in the Newsletter module settings.
Admin Page: Azure Plugin β Event Tickets
WooCommerce βEvent Ticketβ product type with visual seating designer, seat selection on the frontend, QR code tickets, Apple Wallet support, and event check-in.
- Product type: βEvent Ticketβ in WooCommerce
- Seating: Designer for venue layouts; customers pick seats
- Tickets: QR codes and Apple Wallet passes
- Check-in: Dedicated check-in page/tool for events
- TEC: Link to The Events Calendar events and venues
Tickets are sold via WooCommerce product pages; seating UI is shown on the single product page.
Admin Page: Azure Plugin β Auction
WooCommerce βAuctionβ product type with timed bidding, optional Buy It Now, max bid (proxy/auto-bid), and winner checkout. Requires WooCommerce; payment runs through WooCommerce checkout (e.g. Stripe via WooCommerce Stripe Gateway).
- Go to Azure Plugin β Main Settings
- Enable Auction
- Click Configure to open the Auction dashboard
-
Go to Products β Add New (or edit a product)
-
Set Product type to Auction
-
Open the Auction tab and set:
- Starting Bid: the opening bid amount (saved as Regular Price)
- Bidding End Date and Bidding End Time
- Buy It Now: checkbox and price (optional)
- Require immediate payment: when checked, Buy It Now sends the customer to checkout immediately
-
Publish the product
- Frontend: Single product page shows current/starting bid, live countdown timer, bid input with compact quick buttons (+$5, +$10, +$20), and optional βSet max bidβ. A confirm-bid modal prevents accidental bids. Bid history updates instantly without page refresh.
- Login: Users must be logged in to bid; others see βRegister/Login to bidβ.
- Max bid: If set, the system auto-bids up to that amount in increments (e.g. $5) when outbid.
- Audit: All bids, times, and IP addresses are stored in the
wp_azure_auction_bidsdatabase table.
- When the bidding end time has passed (checked on product load or cron), the auction is marked ended.
- The winner is the user with the highest bid at end time.
- A WooCommerce order is created for the winning amount and the winner is emailed a βYou wonβ message with a link to checkout to pay (Stripe or other gateways as configured).
- If Buy It Now is enabled and the auction has not ended, a βBuy It Nowβ button is shown.
- On click, an order is created at the Buy It Now price and the customer is redirected to checkout.
- The auction is marked sold so the normal βwinnerβ flow does not run.
- WooCommerce must be active
- Stripe: Use WooCommerce Stripe Gateway for Stripe; no separate Stripe SDK in the plugin
- Email: βYou wonβ emails use
wp_mail(or the pluginβs email module if you route transactional mail through it)
Auction products are displayed and bid on via the standard WooCommerce single product page.
Admin Page: PTA Tools > Selling > Product Fields
Custom WooCommerce checkout fields that are saved to user accounts and auto-populated on return visits. Create field groups (e.g. "Child Information") and apply them to specific product categories.
- Field Groups: Group related fields together (e.g. "Student Info", "Dietary Needs")
- Category Mapping: Apply field groups to specific WooCommerce product categories
- User Meta Storage: Field values saved to user accounts for auto-population
- Checkout Integration: Fields appear on checkout for applicable products
- Order Meta: Field values saved to order line items
- Go to PTA Tools > Selling > Product Fields
- Create a Field Group (e.g. "Student Information")
- Add fields to the group (text, select, checkbox, etc.)
- Assign the group to product categories
- Fields automatically appear at checkout for matching products
Product Fields are managed through the admin UI and appear automatically on WooCommerce checkout pages.
Admin Page: PTA Tools > Selling > Donations
Accept donations at checkout with round-up and custom amount options. Create fundraising campaigns with goals and progress tracking. Place standalone donation forms on any page with the [pta-donate] shortcode.
- Go to PTA Tools > Main Settings
- Enable Donations under the Selling card
- Navigate to PTA Tools > Selling > Donations
- Click New Campaign
- Enter name, description, and optional fundraising goal
- Save the campaign
- Enable Round-Up: Show "Round up to nearest dollar" toggle at checkout
- Enable Custom Amount: Show quick-pick donation buttons at checkout
- Quick Amounts: Comma-separated dollar amounts (e.g.
1,5,10,25) - Default Campaign: Which campaign receives donations
When enabled, a donation widget appears before the Place Order button:
- Round-up toggle: Rounds the cart total to the nearest dollar
- Quick-pick buttons: Pre-set donation amounts ($1, $5, $10)
- Custom input: Enter any amount
- Donations are added as WooCommerce cart fees
- Recorded and linked to campaigns after order completion
[pta-donate]
[pta-donate campaign_id="1" amounts="5,10,25,50" button_text="Support Us"]
Parameters:
campaign_id- Campaign to donate to (default: the default campaign)amounts- Comma-separated dollar amounts (default:5,10,25,50)show_custom- Show custom amount input:yesorno(default:yes)button_text- Submit button text (default: "Donate Now")
Displays a standalone donation form with:
- Campaign name, description, and progress bar (if goal is set)
- Amount selection buttons
- Optional custom amount input
- Adds donation to WooCommerce cart as a fee
Admin Page: PTA Tools > Calendar > Volunteer Sign Up
A SignUpGenius-style volunteer coordination system. Create sign-up sheets for events, define activities with volunteer spots, and let users sign up from the frontend. Optionally link sheets to The Events Calendar events for automatic date/location population.
- Go to PTA Tools > Main Settings
- Enable Volunteer Sign Up under the Calendar module card
- Navigate to PTA Tools > Calendar > Volunteer Sign Up tab
- Click New Sign-Up Sheet
- Enter a title, optional description
- Optionally link to a TEC event (auto-populates date and location)
- Set event date and location manually if not using TEC
- Set status to Open or Closed
- In the sheet editor modal, add activities under Activities / Roles
- Each activity has:
- Name: e.g. "Concessions 4PM"
- Description: optional details
- Spots Needed: number of volunteers required
- Click Save Sheet
Use the shortcode on any page or post:
[volunteer_signup id="1"]
The frontend displays:
- Sheet title, description, and event meta (date, location)
- Activity cards showing available spots and current volunteers
- Logged-in users can check activities and click Save to sign up
- Users can withdraw from activities they've signed up for
- Guests see a login/register prompt
- Confirmation email: Sent immediately after sign-up with event name, activities, date, and location
- Reminder email: Sent automatically 1 day before the event date via a daily scheduled job
[volunteer_signup id="1"]
Parameters:
id- Required. The sign-up sheet ID (shown in the admin table shortcode column)
| Module | Shortcode | Purpose |
|---|---|---|
| SSO | [azure_sso_login] |
Login button |
[azure_sso_logout] |
Logout button | |
[azure_user_info] |
Display user information | |
| Calendar | [azure_calendar] |
Full calendar display |
[azure_calendar_events] |
Events list | |
[azure_calendar_event] |
Single event | |
[azure_contact_form] |
Contact form | |
[azure_email_status] |
Email status (admin) | |
[azure_email_queue] |
Email queue (admin) | |
| PTA | [pta-roles-directory] |
All roles display |
[pta-department-roles] |
Department-specific roles | |
[pta-org-chart] |
Organization chart | |
[pta-role-card] |
Single role details | |
[pta-department-vp] |
Department VP info | |
[pta-open-positions] |
Open positions list | |
[pta-user-roles] |
User's role assignments | |
| Classes | β | Product-based; use WooCommerce product/cart pages |
| Newsletter | β | Configure in Newsletter module (lists/campaigns) |
| Event Tickets | β | Product-based; seating on single product page |
| Auction | β | Product-based; bid UI on single product page |
| Product Fields | β | Auto-displayed on WooCommerce checkout |
| Donations | [pta-donate] |
Standalone donation form |
| Volunteer Sign Up | [volunteer_signup id="X"] |
Event volunteer sign-up sheet |
See each module's section above for detailed parameters and examples.
After recent optimizations (Version 1.1):
- Admin Page Load: 350-600ms (was 800-1200ms) - 45-50% faster
- Plugin Initialization: <100ms (was 200-400ms) - 50%+ faster
- File I/O Operations: 0 per request (was 185) - 100% reduction
- Log File Growth: <50KB/day (was 5MB/day) - 99% reduction
The plugin includes automatic maintenance features:
-
Log Rotation
- Logs automatically rotate at 20MB
- Last 5 backups kept
- Older backups deleted after 30 days
-
Database Cleanup
- Activity logs cleaned after 90 days
- Runs daily via WP-Cron
- No manual intervention needed
-
Debug Mode
- Enable only when troubleshooting
- Module-specific debugging available
- Automatically disabled in production
For Optimal Performance:
- β Disable debug mode in production
- β Use common credentials (simpler, less overhead)
- β Enable object caching (Redis/Memcached if available)
- β Limit calendar sync lookback days
- β Use reasonable backup retention periods
PHP Requirements for Best Performance:
- PHP 8.0 or higher recommended
- Memory limit: 256MB minimum
- Max execution time: 300 seconds (for backups/sync)
- Enable OPcache if available
Check Plugin Health:
- Go to Azure Plugin β Logs
- Monitor log file size (should stay under 20MB)
- Check for repeated error messages
- Review sync queue status (PTA module)
WordPress Debug Mode:
// Enable for troubleshooting (wp-config.php)
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Plugin Debug Mode:
- Go to Azure Plugin β Main Settings
- Enable Debug Mode
- Select specific modules to debug
- Check
wp-content/plugins/Azure Plugin/logs.md
Already Completed: β
- Phase 1: Critical logging cleanup (hot path - 108 writes eliminated)
- Phase 2: Component initialization cleanup (77 writes eliminated)
- Scheduled maintenance system
- User-controlled debug mode UI
- Module-specific debugging (8 modules)
Planned Improvements:
- Database query optimization (SELECT * replacement)
- Settings caching implementation
- OAuth token caching consolidation
- CSS refactoring (remove !important overuse)
See review.md for complete optimization roadmap and priorities.
- Verify Client ID, Client Secret, and Tenant ID are correct
- Check that redirect URI matches in Azure App Registration
- Ensure admin consent is granted for API permissions
- Clear browser cookies and try again
- Verify calendar authentication is complete
- Check that Calendar.Read permission is granted
- Clear calendar cache in plugin settings
- Check browser console for JavaScript errors
- Verify Azure Storage account credentials
- Check that container exists and is accessible
- Ensure WordPress has write permissions
- Review backup logs for specific errors
- Increase PHP max execution time if needed
- Verify Mail.Send permission is granted
- Check email authentication status
- Review email queue for failed messages
- Check WordPress debug logs
- Verify sender email is from your domain
- Verify User.ReadWrite.All permission
- Check sync queue for failed jobs
- Ensure Office 365 licenses are available
- Review PTA sync engine logs
- Verify department VPs are assigned
- Check Files.Read.All permission
- Verify authentication is complete
- Test connection button
- Check site URL format for SharePoint
- Ensure WooCommerce is installed and active
- Ensure Auction module is enabled in Main Settings
- Users must be logged in to bid; show βRegister/Login to bidβ if not
- For Stripe: install WooCommerce Stripe Gateway; payment runs through checkout
- Set a Starting Bid in the product's Auction tab (stored as Regular Price)
- Ensure Volunteer Sign Up is enabled under Calendar on Main Settings
- Verify the shortcode uses a valid sheet ID:
[volunteer_signup id="1"] - The Events Calendar plugin is optional but required for TEC event linking
- Ensure Donations module is enabled in Main Settings under Selling
- If the module was recently added, reload the main settings page after enabling
The plugin has two debug modes:
WordPress Debug (for all plugins):
// Add to wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Plugin-Specific Debug:
- Go to Azure Plugin β Main Settings
- Check Enable Debug Mode
- Select modules to debug (or leave empty for all)
- Click Save Changes
Where to Find Logs:
- WordPress errors:
wp-content/debug.log - Plugin logs:
wp-content/plugins/Azure Plugin/logs.md - PHP errors: Check server error logs
- Debug mode impacts performance - use only for troubleshooting
- Logs auto-rotate at 20MB
- Old logs auto-delete after 30 days
Each module has a Test Connection button to verify:
- Azure credentials are valid
- Permissions are granted
- API endpoints are accessible
- Authentication is working
If experiencing slow performance:
-
Disable Debug Mode (if enabled)
- Go to Azure Plugin β Main Settings
- Uncheck Debug Mode
-
Check Log File Size
- View
wp-content/plugins/Azure Plugin/logs.md - Should be under 20MB (auto-rotates at 20MB)
- If oversized, delete or move the file
- View
-
Clear Plugin Caches
- Use cache clearing options in plugin settings
-
Optimize Sync Settings
- Reduce calendar sync frequency
- Limit event lookback days
- Adjust PTA sync intervals
-
Increase PHP Resources
- Memory limit: 256MB minimum
- Max execution time: 300 seconds
- Enable OPcache if available
-
Enable WordPress Object Caching
- Use Redis or Memcached for better performance
- Caches settings and API responses
Recent Performance Fixes (v1.1):
- β Phase 1: Eliminated 108 file operations from hot paths
- β Phase 2: Eliminated 77 file operations from component init
- β Total: 185 β 0 file operations per request (100% reduction)
- β Implemented automatic log rotation
- β Added user-controlled debug mode
- β Added scheduled maintenance
- β Result: 45-50% faster page loads
Contributions are welcome! Whether you're fixing bugs, adding features, or improving documentation, we appreciate your help.
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR-USERNAME/PTATools.git
- Create a feature branch:
git checkout -b feature/your-feature-name
- Make your changes and test thoroughly on a WordPress test site
- Commit with a clear message:
git commit -m "Add: brief description of your change" - Push to your fork and open a Pull Request
We use GitHub Issues to track bugs and feature requests. Please use one of the provided issue templates:
- Bug Report: For reporting broken functionality or errors
- Feature Request: For suggesting new features or enhancements
When creating an issue, please include:
- WordPress version and PHP version
- Plugin version (found on the PTA Tools main settings page)
- Module affected (SSO, Backup, Calendar, Email, PTA Roles, OneDrive, Classes, Newsletter, Tickets, Auction, Product Fields, Donations, Volunteer Sign Up, or System)
- Steps to reproduce (for bugs) or use case (for features)
- Follow existing code patterns and module architecture
- Keep files under 500 lines; refactor if needed
- Use WordPress coding standards for PHP
- Add proper nonce verification and capability checks for all AJAX handlers
- Use
Azure_Loggerfor debug logging (noterror_login production paths) - Test with WooCommerce enabled and disabled if your changes touch selling modules
- Database tables must be created via
dbDelta()inclass-database.php
Each module follows a consistent pattern:
- Class file:
includes/class-{module}-module.php(singleton withget_instance()) - Admin page:
admin/{module}-page.php(included as a tab or standalone page) - Frontend CSS:
css/{module}-frontend.css(conditionally enqueued) - Initialization: Wired in
azure-plugin.phpwith aninit_{module}_components()method - Toggle: Added to
valid_modulesarray inclass-admin.php
- Check this README: Comprehensive documentation for all features
- Admin Help Text: Each settings page has helpful descriptions
- Test Connections: Use built-in testing tools
- Review Logs: Check plugin logs and WordPress debug logs
- WordPress Forums: Post questions with plugin tag
- GitHub Issues: Report bugs and feature requests
- Review & Roadmap: See
review.mdfor detailed code review and optimization roadmap - Performance Guide: See Performance & Optimization section above
- Logging Strategy: Automatic rotation and cleanup implemented
- Azure Portal: https://portal.azure.com/
- Microsoft Graph Explorer: https://developer.microsoft.com/graph/graph-explorer
- Azure AD Documentation: https://docs.microsoft.com/azure/active-directory/
- Microsoft Graph API: https://docs.microsoft.com/graph/
Configuration:
- Start with Common Credentials: Easier to manage initially
- Test in Staging: Try features on a test site first
- Review Permissions: Grant only needed Azure permissions
Operations:
- Regular Backups: Enable automated backups immediately
- Monitor Sync Queues: Check PTA sync status regularly
- Keep Updated: Update plugin when new versions release
Performance:
- Disable Debug Mode: In production environments
- Monitor Log Sizes: Check if logs.md is growing too large
- Optimize Sync Intervals: Use reasonable frequencies
- Enable Caching: Use WordPress object caching if available
Troubleshooting:
- Enable Debug Mode: Only when diagnosing issues
- Module-Specific Debug: Select specific modules to reduce noise
- Review Logs: Check both WordPress and plugin logs
- Test Connections: Use built-in connection test buttons
This plugin is licensed under the GPL v2 or later.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This plugin integrates and enhances functionality from multiple Microsoft services:
- Microsoft Azure Active Directory
- Microsoft Graph API
- Azure Blob Storage
- Microsoft 365 / Office 365
- OneDrive for Business
- SharePoint Online
- Microsoft Outlook Calendar
- Exchange Online
Built with β€οΈ for WordPress and the Microsoft community.
- PTA Roles module toggle now saves reliably: The PTA Roles page was using a custom
.pta-module-toggleclass with its own inline AJAX handler, while the main PTA Tools page had a second.module-togglehandler inline inmain-page.phpthat duplicated the one already inadmin.js. The two handlers raced each other β on disable, one could fire afailpath that reverted the checkbox (and the form's hidden input) back to the enabled state, making it look like the toggle "wasn't saving". Same failure pattern as the v3.49 Calendar Sync bug. - Fix: PTA page now uses the standard
class="module-toggle" data-module="pta"pattern inside amodule-cardwrapper, soadmin.jsis the single source of truth for the save AJAX. The main-page inline handler was reduced to only syncing the hidden#hidden_enable_<module>form input (needed for the "Save Settings" form submit); the AJAX save is now owned solely byadmin.js. - Consistency: The disabled-warning banner on the PTA Roles page now shows/hides live instead of requiring a full page reload.
- Calendar Sync β Save Settings actually saves: Removed duplicate
wp_ajax_azure_save_tec_calendar_email/azure_tec_calendar_authorize/azure_tec_calendar_check_authhandlers fromclass-admin.php. Both classes were registering the same action name, so the first-registered one wouldwp_die()before the dedicated TEC handler could ever run. The dedicatedAzure_TEC_Integration_Ajaxclass is now the single source of truth for these handlers. - TEC AJAX always registered:
Azure_TEC_Integration_Ajaxis now instantiated unconditionally ininit(), not gated behindenable_tec_integration. This means Save Settings / Authenticate / Check Auth work immediately after toggling the module on (previously you'd have to reload for handlers to register).
- Role Editor (new): New page under PTA Roles β Role Editor. Pick any WP role (including Azure-AD-synced roles like
azuread/"Azure AD User") from a dropdown and visually toggle capabilities grouped by functional area (Core, Users, Posts, Pages, Media, Comments, Themes, Plugins, Tools, WooCommerce, TEC, PTA/Azure, Other). Includes friendly labels for core caps, dangerous-cap badges, filter/search, group "All" toggles, "Copy from..." another role, and sticky save toolbar - Role Editor safety: Administrator role is locked from edits (prevents lockout);
azure_ad_usermarker preserved on synced roles; all changes logged toAzure_Database - Calendar Sync β toggle persistence: The enable/disable toggle on the Calendar Sync page now uses the universal
module-togglehandler and actually saves to the database. Previously it used an unhooked class and did nothing on click - Calendar Sync β Authenticate button: Fixed undefined
$tec_calendar_emailvariable that prevented the "Authenticate Calendar" button from ever appearing. Now shows correctly once both M365 and mailbox emails are saved - Calendar Sync β nonce/field mismatches: Aligned
azureTecAdminnonce with AJAX handlers (azure_plugin_nonce); AJAX handlers now accept bothuser_emailand legacyemailPOST keys - Admin JS: Sub-module toggles no longer flip the parent card's enabled/disabled visual; toggle-status label now updates after a successful save on module-specific pages
- Stability: All
catch (Exception)upgraded tocatch (\Throwable)across core, logger, and module init β prevents uncaughtError/ParseErrorfrom crashing the site - Graceful degradation: Plugin no longer self-deactivates on missing files; shows admin notice instead. WooCommerce-optional guards prevent fatals when WC is absent
- Login shortcode:
[user-account-dropdown]now cache-safe β renders placeholder, then fetches logged-in state via AJAX to work with full-page caching (W3TC/Redis/AFD) - Donations: Widget now appears on cart page and WooCommerce Blocks checkout (auto-relocates via JS); context-aware refresh for classic, Blocks, and cart
- Admin UI: Sub-module toggles (Calendar Sync, Volunteer, Auction, Classes, Product Fields, Donations) converted from checkboxes to mini toggle switches on main settings page
- UI: Fixed dashicon alignment in admin tab bars, page headings, and action row buttons β removed conflicting CSS properties that fought with flex layout
- Donations: Shortcode amount buttons now display in a compact single row with explicit text color, fixing invisible text on themes that override button styles
- Volunteer Sign Up: New module β SignUpGenius-style sign-up sheets linked to TEC events, with activities/spots, frontend sign-up, confirmation and reminder emails,
[volunteer_signup]shortcode - Auction: Frontend overhaul β live countdown timer, confirm-bid modal, instant bid history updates (no page refresh), compact quick-bid button layout, dedicated Starting Bid admin field
- Product Fields: Children Profiles β parents manage multiple child profiles on their account; auto-populated during checkout
- Donations: Fixed admin AJAX handlers always registering so campaign management works regardless of frontend toggle
- Donations: New module with round-up at checkout, custom amounts, campaigns with goals/progress, and
[pta-donate]shortcode - Product Fields: Custom WooCommerce checkout fields saved to user accounts, applied by product category
- UI Overhaul: Consolidated admin into tabbed pages β Calendar (Embed/Sync/Upcoming), System (Logs/Schedules/Critical), Emails (Logs/Settings), Selling (Auction/Classes/Product Fields/Donations)
- System: Scheduled Jobs dashboard for all plugin cron jobs with Run Now and monitoring
- OneDrive Media: Replaced sync with one-time Import from OneDrive preserving folder structure; batched import with progress
- SSO: Adjusted sync frequency to hourly (configurable)
- β Backup: Granular plugin/theme selection with expandable checkboxes
- β Backup: Restore progress bar with real-time status tracking
- β Backup: Sync from Azure Storage β list and restore remote backups on new instances
- β Backup: Chunked Azure uploads, streamed downloads, streamed SQL restore (OOM prevention)
- β Backup: Async background processing, improved stale job detection, partial failure reporting
- β OneDrive Media: Recursive sync into year/month subfolders
- β OneDrive Media: Repair Missing Media tool for post-restore recovery
- β PTA Roles: Forminator integration β signup form in modal from org chart
- β PTA Roles: O365 group email display on org chart as mailto links
- β PTA Roles: Role-level O365 group mappings; Treasurer/Secretary support
- β SSO: External domain exclusion for sync and login
- β Dashboard: Plugin dependency badges link to WordPress plugin install page
- β Auction module: WooCommerce Auction product type, bidding, Buy It Now, winner flow
- β Calendar: Manual Sync Now button; sync history for TEC Integration
- β Major performance optimization (45-50% faster)
- β User-controlled debug mode, log rotation, scheduled maintenance
- Initial release with core modules
Current Focus: UI polish, Volunteer Sign Up, Auction improvements, Children Profiles
Code Quality: See review.md for details
Test Coverage: Manual testing (automated tests planned)
Documentation: README, GitHub Wiki, and inline admin help
Modules: SSO, Backup, Calendar (Embed + Sync + Upcoming + Volunteer Sign Up), Emails (Logs + Settings), PTA Roles, OneDrive Media, Classes, Newsletter, Event Tickets, Auction, Product Fields, Donations, System (Logs + Schedules + Critical)
Planned Improvements:
- Database query optimization, settings caching, CSS refactoring
- OAuth token handling consolidation
- Automated testing
See review.md for full roadmap and priorities.
Version: 3.46
Author: Jamie Burgess
Last Updated: March 2026
Plugin URI: https://github.com/jaburges/PTATools
Ready to get started? Follow the Initial Setup guide above!
Need help? Check Troubleshooting or review the Performance & Optimization section.