Lesson 95 – Implementing the Watchlist System with AJAX in Flipnzee Auctions
Series: Building the Flipnzee Auctions Plugin
Lesson: 95
Project: Flipnzee Auctions – A WordPress Auction Plugin for Websites & Digital Assets
Introduction
In the previous lesson, we designed the Watchlist feature for Flipnzee Auctions. The objective was to allow registered users to bookmark auctions they are interested in and easily revisit them later from a dedicated My Watchlist page.
This implementation transformed that design into a working feature by introducing a dedicated Watchlist Manager, AJAX-powered interactions, frontend buttons, and a Watchlist shortcode. As with many real-world development tasks, the implementation also involved extensive debugging and refinement to ensure the feature integrates correctly with the rest of the plugin.
Objectives
The primary objectives of this lesson were:
- Implement a Watchlist Manager for database operations.
- Allow logged-in users to add auctions to their watchlist.
- Allow users to remove auctions from their watchlist.
- Prevent duplicate watchlist entries.
- Display a personalised Watchlist page.
- Implement secure AJAX requests using WordPress nonces.
- Integrate the Watchlist button into auction listings.
Files Added and Updated
New Components
includes/class-watchlist-manager.phpincludes/class-watchlist-ajax.phpassets/js/watchlist.js
Updated Components
includes/class-shortcodes.phpflipnzee-auctions.php
Building the Watchlist Manager
A dedicated manager class was introduced to centralise all watchlist-related database operations.
Its responsibilities include:
- Initialising database access.
- Checking whether an auction already exists in a user’s watchlist.
- Adding auctions.
- Removing auctions.
- Retrieving all saved auctions.
- Counting the number of users watching an auction.
Separating these responsibilities into a dedicated class improves maintainability and follows the plugin’s object-oriented architecture.
Preventing Duplicate Entries
Before inserting a new record, the manager verifies whether the auction has already been saved.
Example:
if ( self::is_in_watchlist( $auction_id, $user_id ) ) {
return true;
}
This ensures that repeated clicks do not create duplicate database entries.
AJAX Integration
Dedicated AJAX handlers were implemented for both watchlist actions.
The handlers perform:
- Nonce verification
- Login validation
- Input sanitisation
- Database updates
- JSON success/error responses
This allows watchlist operations to be performed without navigating away from the current page.
Rendering the Watchlist Button
A reusable Watchlist button renderer was implemented.
Depending on the current state, it automatically displays:
❤ Add to Watchlist
or
❤ Remove from Watchlist
This state is determined dynamically by checking whether the current auction already exists in the logged-in user’s watchlist.
Creating the Watchlist Shortcode
A dedicated shortcode was implemented to display the user’s saved auctions.
The shortcode performs the following steps:
- Retrieves the current user’s watchlist.
- Loads each saved auction.
- Retrieves the associated website listing.
- Displays auction information.
- Provides a link back to the listing.
Current output includes:
- Listing title
- Auction ID
- Auction status
- Current bid
- Listing link
This provides users with a simple dashboard for managing their saved auctions.
Database Operations
The Watchlist Manager now supports:
- Adding auctions
- Removing auctions
- Checking whether an auction is already saved
- Retrieving all saved auctions
- Counting watchers
These methods provide a reusable backend API for future watchlist-related features.
Security Considerations
Several WordPress security practices were implemented throughout this lesson.
These include:
- Nonce verification using
check_ajax_referer() - Login verification
- Sanitising incoming POST values
- Prepared SQL statements
- Escaping frontend output
- Using the WordPress database API
These measures help protect the feature against common attack vectors.
Debugging and Troubleshooting
A considerable portion of this lesson involved debugging and integration testing.
Issues encountered included:
- Duplicate method declarations
- Missing manager methods
- PHP fatal errors
- AJAX HTTP 500 errors
- JavaScript event binding problems
- Cached JavaScript during development
- Leftover debugging statements
- Plugin activation failures
- Watchlist manager integration issues
Resolving these problems reinforced the importance of systematic debugging, incremental testing, and verifying both backend and frontend behaviour throughout development.
Current Functionality
The Watchlist feature now successfully:
- Adds auctions to a user’s watchlist.
- Removes auctions from a user’s watchlist.
- Prevents duplicate entries.
- Retrieves saved auctions.
- Displays a personalised Watchlist page.
- Uses secure AJAX communication.
- Integrates with the auction interface.
Known Limitation
One frontend enhancement remains.
After adding or removing an auction using AJAX, the underlying database is updated correctly, but the visible page does not immediately reflect the change until the page is refreshed.
The backend functionality is fully operational. The remaining work is limited to improving frontend state synchronisation after successful AJAX requests.
This enhancement will be addressed during a future UI refactoring lesson.
Lessons Learned
This implementation highlighted several important software engineering practices:
- Keep business logic separate from presentation.
- Build reusable manager classes.
- Secure every AJAX endpoint.
- Prevent duplicate database records.
- Validate all user input.
- Test incrementally.
- Use browser developer tools alongside server logs for debugging.
- Separate backend functionality from frontend user experience improvements.
Download Source Code
Download the starting version of the plugin before the lesson:
Download the completed version after this lesson:
Future Roadmap
The Watchlist system provides a strong foundation for several upcoming enhancements, including:
- Instant UI updates after AJAX operations.
- Reusable auction card rendering.
- Watcher counters.
- Email notifications.
- Auction alerts.
- User dashboard improvements.
- Real-time watchlist interactions.
Conclusion
Lesson 95 marks another significant milestone in the development of Flipnzee Auctions.
The plugin now includes a functional Watchlist system that enables registered users to save auctions for future reference using secure AJAX-powered interactions.
Although a minor frontend synchronisation enhancement remains, the underlying architecture is complete, extensible, and ready to support future features such as notifications, live updates, and personalised auction management.
Git Commit
Lesson 95: Implement Watchlist system with AJAX, shortcode, and database manager
This lesson also reinforces an important principle of plugin development: building a reliable backend first creates a solid foundation upon which frontend enhancements can be safely and incrementally added.


