Hooks & Filters Reference

Get Started

WB Ad Manager Pro provides a comprehensive set of actions and filters that let you extend and customize every aspect of the plugin. Use these hooks to integrate with third-party services, modify default behavior, or build custom features on top of the ad management system.


Actions

Advertiser Lifecycle

/**
 * Fires when a new advertiser is created.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_advertiser_created', $advertiser );

/**
 * Fires when advertiser status changes (active, suspended, banned, pending).
 *
 * @since 1.2.0
 * @param int    $advertiser_id Advertiser ID.
 * @param string $new_status    New status.
 * @param string $old_status    Previous status.
 */
do_action( 'wbam_advertiser_status_changed', $advertiser_id, $new_status, $old_status );

/**
 * Fires when an advertiser is deleted.
 *
 * @since 1.2.0
 * @param int   $advertiser_id Advertiser ID.
 * @param array $data          Advertiser data (snapshot before deletion).
 */
do_action( 'wbam_advertiser_deleted', $advertiser_id, $data );

/**
 * Fires when a new advertiser registers via the frontend registration form.
 *
 * @since 1.2.0
 * @param int        $user_id    WordPress user ID.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_advertiser_registered', $user_id, $advertiser );

Example: Send a Slack notification when an advertiser registers:

add_action( 'wbam_advertiser_registered', function( $user_id, $advertiser ) {
    $user = get_user_by( 'ID', $user_id );
    wp_remote_post( SLACK_WEBHOOK_URL, array(
        'body' => wp_json_encode( array(
            'text' => sprintf( 'New advertiser: %s (%s)', $user->display_name, $advertiser->company_name ),
        ) ),
    ) );
}, 10, 2 );

Advertiser Balance

/**
 * Fires when advertiser balance is credited (via Advertiser::credit_balance()).
 *
 * Note: This is distinct from wbam_wallet_credited which fires at the
 * Wallet_Manager transaction level.
 *
 * @since 1.2.0
 * @param int    $advertiser_id Advertiser ID.
 * @param float  $amount        Amount credited.
 * @param string $note          Transaction note.
 */
do_action( 'wbam_advertiser_balance_credited', $advertiser_id, $amount, $note );

/**
 * Fires when advertiser balance is debited (via Advertiser::debit_balance()).
 *
 * @since 1.2.0
 * @param int    $advertiser_id Advertiser ID.
 * @param float  $amount        Amount debited.
 * @param string $note          Transaction note.
 */
do_action( 'wbam_advertiser_balance_debited', $advertiser_id, $amount, $note );

Campaign Lifecycle

/**
 * Fires when a campaign is created.
 *
 * @since 1.2.0
 * @param Campaign $campaign Campaign object.
 */
do_action( 'wbam_campaign_created', $campaign );

/**
 * Fires when a campaign is updated (field changes, not status).
 *
 * @since 1.2.0
 * @param Campaign $campaign  Updated campaign object.
 * @param array    $old_data  Previous data snapshot.
 */
do_action( 'wbam_campaign_updated', $campaign, $old_data );

/**
 * Fires when campaign status changes (e.g., draft -> active, active -> paused).
 *
 * Covers all transitions: activation, pause, resume, completion, expiration, cancellation.
 *
 * @since 1.2.0
 * @param Campaign $campaign   Campaign object (with new status).
 * @param string   $old_status Previous status.
 * @param string   $new_status New status.
 */
do_action( 'wbam_campaign_status_changed', $campaign, $old_status, $new_status );

/**
 * Fires when a campaign is deleted.
 *
 * @since 1.2.0
 * @param int   $id   Campaign ID.
 * @param array $data Campaign data snapshot before deletion.
 */
do_action( 'wbam_campaign_deleted', $id, $data );

/**
 * Fires when a campaign expires (past end_date).
 * Triggered by cron via check_expired_campaigns().
 *
 * @since 1.2.0
 * @param int $campaign_id Campaign ID.
 */
do_action( 'wbam_campaign_expired', $campaign_id );

/**
 * Fires when a campaign is auto-completed (budget or limits exhausted).
 * Triggered by cron via check_campaign_budgets().
 *
 * @since 1.3.1
 * @param Campaign $campaign Campaign object.
 */
do_action( 'wbam_campaign_auto_completed', $campaign );

/**
 * Fires when an ad is auto-disabled because its campaign expired or completed.
 *
 * @since 1.3.1
 * @param int $ad_id WordPress ad post ID.
 */
do_action( 'wbam_ad_auto_disabled', $ad_id );

Example: Log campaign status changes to an external system:

add_action( 'wbam_campaign_status_changed', function( $campaign, $old_status, $new_status ) {
    error_log( sprintf(
        'Campaign #%d changed from %s to %s (advertiser: %d)',
        $campaign->id, $old_status, $new_status, $campaign->advertiser_id
    ) );
}, 10, 3 );

Billing & Budget

/**
 * Fires after hourly billing is processed for all eligible campaigns.
 *
 * @since 1.3.1
 * @param int   $processed_count Number of campaigns billed.
 * @param float $total_billed    Total amount billed across all campaigns.
 */
do_action( 'wbam_hourly_billing_completed', $processed_count, $total_billed );

/**
 * Fires when an individual campaign billing is processed (CPM/CPC charge).
 *
 * @since 1.3.1
 * @param Campaign    $campaign    Campaign object.
 * @param float       $amount      Amount billed.
 * @param Transaction $transaction Transaction object.
 */
do_action( 'wbam_campaign_billed', $campaign, $amount, $transaction );

/**
 * Fires when a campaign is paused due to insufficient wallet balance.
 *
 * The campaign is automatically paused and the advertiser should be notified.
 *
 * @since 1.3.1
 * @param Campaign $campaign Campaign object.
 * @param float    $amount   Unbilled amount that could not be charged.
 */
do_action( 'wbam_campaign_insufficient_balance', $campaign, $amount );

Example: Send email when campaign is paused for insufficient balance:

add_action( 'wbam_campaign_insufficient_balance', function( $campaign, $amount ) {
    $advertiser = \WBAM_Pro\Modules\Advertisers\Advertiser_Manager::get_instance()->get( $campaign->advertiser_id );
    if ( $advertiser ) {
        $user = get_user_by( 'ID', $advertiser->user_id );
        wp_mail(
            $user->user_email,
            'Campaign paused - insufficient balance',
            sprintf( 'Your campaign "%s" was paused. Please add at least $%.2f to resume.', $campaign->name, $amount )
        );
    }
}, 10, 2 );

Wallet & Transactions

/**
 * Fires when wallet is credited (any source: payment, refund, manual).
 *
 * This fires at the Wallet_Manager level after the atomic transaction completes.
 *
 * @since 1.2.0
 * @param Transaction $transaction Transaction object.
 * @param float       $amount      Amount credited.
 */
do_action( 'wbam_wallet_credited', $transaction, $amount );

/**
 * Fires when wallet is debited (any reason: campaign charge, package, etc.).
 *
 * @since 1.2.0
 * @param Transaction $transaction Transaction object.
 * @param float       $amount      Amount debited.
 */
do_action( 'wbam_wallet_debited', $transaction, $amount );

/**
 * Fires when an advertiser's balance falls below the low balance threshold.
 * Only fires once per 24 hours per advertiser (throttled).
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param float      $balance    Current wallet balance.
 * @param float      $threshold  Low balance threshold amount.
 */
do_action( 'wbam_advertiser_low_balance', $advertiser, $balance, $threshold );

/**
 * Fires when a manual fund request is submitted (via REST API or frontend form).
 *
 * @since 1.3.1
 * @param int        $transaction_id Transaction ID.
 * @param Advertiser $advertiser     Advertiser object.
 * @param float      $amount         Requested amount.
 */
do_action( 'wbam_fund_request_submitted', $transaction_id, $advertiser, $amount );

/**
 * Fires when an admin approves a pending fund request.
 *
 * @since 1.3.1
 * @param int        $transaction_id Transaction ID.
 * @param Advertiser $advertiser     Advertiser object.
 * @param float      $amount         Approved amount.
 */
do_action( 'wbam_fund_request_approved', $transaction_id, $advertiser, $amount );

/**
 * Fires when a Stripe webhook event is received.
 *
 * @since 1.2.0
 * @param array $event Stripe event data.
 */
do_action( 'wbam_stripe_webhook', $event );

Ad Submission Lifecycle

/**
 * Fires when an ad is submitted for review.
 *
 * @since 1.3.1
 * @param Ad_Submission $submission Submission object.
 */
do_action( 'wbam_ad_submitted', $submission );

/**
 * Fires when an ad submission is approved by admin.
 *
 * @since 1.3.1
 * @param Ad_Submission $submission Submission object (status = 'approved').
 */
do_action( 'wbam_ad_submission_approved', $submission );

/**
 * Fires when an ad submission is rejected by admin.
 *
 * @since 1.3.1
 * @param Ad_Submission $submission Submission object.
 * @param string        $reason     Rejection reason.
 */
do_action( 'wbam_ad_submission_rejected', $submission, $reason );

/**
 * Fires when admin requests changes on a submission.
 *
 * @since 1.3.1
 * @param Ad_Submission $submission Submission object.
 * @param string        $notes      Requested changes description.
 */
do_action( 'wbam_ad_submission_changes_requested', $submission, $notes );

/**
 * Fires when an advertiser resubmits a submission after changes.
 *
 * @since 1.3.1
 * @param Ad_Submission $submission Submission object (status reset to 'pending').
 */
do_action( 'wbam_ad_submission_resubmitted', $submission );

Ad Management (Portal)

/**
 * Fires when an ad is updated via the advertiser portal.
 *
 * @since 1.2.0
 * @param int        $ad_id      Ad post ID.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_ad_updated', $ad_id, $advertiser );

/**
 * Fires when an ad is deleted via the advertiser portal.
 *
 * @since 1.2.0
 * @param int        $ad_id      Ad post ID.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_ad_deleted', $ad_id, $advertiser );

Classifieds Lifecycle

/**
 * Fires when a classified listing is created.
 *
 * @since 1.2.0
 * @param Classified $classified Classified object.
 * @param array      $data       Original submission data.
 */
do_action( 'wbam_classified_created', $classified, $data );

/**
 * Fires when a classified listing is updated.
 *
 * @since 1.2.0
 * @param Classified $classified Classified object.
 * @param array      $data       Update data (changed fields only).
 */
do_action( 'wbam_classified_updated', $classified, $data );

/**
 * Fires when a classified listing is deleted.
 *
 * @since 1.2.0
 * @param int $classified_id Classified ID.
 * @param int $post_id       Associated WordPress post ID.
 */
do_action( 'wbam_classified_deleted', $classified_id, $post_id );

/**
 * Fires when a classified is approved by admin.
 *
 * @since 1.2.0
 * @param Classified $classified Classified object (status = 'active').
 */
do_action( 'wbam_classified_approved', $classified );

/**
 * Fires when a classified is rejected by admin.
 *
 * @since 1.2.0
 * @param Classified $classified Classified object.
 * @param string     $reason     Rejection reason.
 */
do_action( 'wbam_classified_rejected', $classified, $reason );

/**
 * Fires when a classified is marked as sold.
 *
 * @since 1.2.0
 * @param Classified $classified Classified object.
 */
do_action( 'wbam_classified_sold', $classified );

/**
 * Fires when a classified expires (past expiry date).
 *
 * @since 1.2.0
 * @param Classified $classified       Classified object.
 * @param string     $old_listing_type Previous listing type before expiration (e.g., 'featured').
 */
do_action( 'wbam_classified_expired', $classified, $old_listing_type );

/**
 * Fires when a classified is renewed (expiry date extended).
 *
 * @since 1.1.0
 * @param Classified $classified Classified object.
 * @param int        $days       Number of renewal days.
 */
do_action( 'wbam_classified_renewed', $classified, $days );

/**
 * Fires when a classified is bumped to the top of listings.
 *
 * @since 1.1.0
 * @param Classified $classified Classified object.
 */
do_action( 'wbam_classified_bumped', $classified );

/**
 * Fires when a classified is about to expire (warning notification).
 * Default warning intervals are 7 days and 3 days before expiry.
 *
 * @since 1.1.0
 * @param Classified $classified Classified object.
 * @param int        $days       Days until expiration.
 */
do_action( 'wbam_classified_expiring', $classified, $days );

/**
 * Fires when upgrades are applied to a classified (featured, highlighted, urgent, top).
 *
 * @since 1.2.0
 * @param Classified $classified Classified object.
 * @param array      $applied    Array of applied upgrade types.
 */
do_action( 'wbam_classified_upgraded', $classified, $applied );
/**
 * Fires after a classified is upgraded to featured status.
 *
 * @since 1.3.1
 * @param Classified $classified The classified object.
 * @param float      $fee        Monthly fee amount.
 * @param int        $duration   Duration in months.
 */
do_action( 'wbam_classified_featured_upgraded', $classified, $fee, $duration );

/**
 * Fires after a classified is downgraded from featured to standard.
 *
 * @since 1.3.1
 * @param Classified $classified The classified object.
 * @param string     $reason     Reason for downgrade (e.g., 'insufficient_funds').
 */
do_action( 'wbam_classified_featured_downgraded', $classified, $reason );

/**
 * Fires when featured billing fails due to insufficient wallet funds.
 * The classified will be automatically downgraded to standard.
 *
 * @since 1.3.1
 * @param Classified $classified The classified object.
 * @param object     $advertiser The advertiser object.
 * @param float      $fee        The fee amount that could not be charged.
 */
do_action( 'wbam_classified_featured_billing_failed', $classified, $advertiser, $fee );

/**
 * Fires after successful recurring featured billing renewal.
 *
 * @since 1.3.1
 * @param Classified $classified The classified object.
 * @param float      $fee        The fee amount charged.
 */
do_action( 'wbam_classified_featured_renewed', $classified, $fee );

/**
 * Fires when a classified is downgraded from featured via cron (upgrade expired).
 *
 * @since 1.3.1
 * @param int $classified_id Classified ID.
 */
do_action( 'wbam_classified_downgraded', $classified_id );

Inquiries

/**
 * Fires when an inquiry is received on a classified listing.
 *
 * @since 1.2.0
 * @param object $inquiry Inquiry object.
 */
do_action( 'wbam_inquiry_received', $inquiry );

/**
 * Fires when a seller replies to an inquiry.
 *
 * @since 1.2.0
 * @param object $inquiry Inquiry object.
 * @param string $message Reply message text.
 */
do_action( 'wbam_inquiry_replied', $inquiry, $message );

Seller Following

/**
 * Fires when a user follows a seller.
 *
 * @since 1.1.0
 * @param int $advertiser_id The seller's advertiser ID.
 * @param int $user_id       The user who followed.
 */
do_action( 'wbam_seller_followed', $advertiser_id, $user_id );

/**
 * Fires when a user unfollows a seller.
 *
 * @since 1.1.0
 * @param int $advertiser_id The seller's advertiser ID.
 * @param int $user_id       The user who unfollowed.
 */
do_action( 'wbam_seller_unfollowed', $advertiser_id, $user_id );

/**
 * Fires when followers are notified of a new listing by a seller they follow.
 *
 * @since 1.1.0
 * @param Classified $classified   Classified object.
 * @param array      $followers    Array of follower user data.
 */
do_action( 'wbam_followers_notified_new_listing', $classified, $followers );

Package Lifecycle

/**
 * Fires when an ad package is created.
 *
 * @since 1.2.0
 * @param Package $package Package object.
 */
do_action( 'wbam_package_created', $package );

/**
 * Fires when an ad package is updated.
 *
 * @since 1.2.0
 * @param Package $package  Updated package object.
 * @param array   $old_data Previous data snapshot.
 */
do_action( 'wbam_package_updated', $package, $old_data );

/**
 * Fires when an ad package is deleted.
 *
 * @since 1.2.0
 * @param int   $id   Package ID.
 * @param array $data Package data snapshot before deletion.
 */
do_action( 'wbam_package_deleted', $id, $data );
/**
 * Fires when Links Pro module initializes.
 *
 * @since 1.0.0
 * @param object $module Links Pro module instance.
 */
do_action( 'wbam_pro_links_module_init', $module );

/**
 * Fires when a post is scanned for links.
 *
 * @since 1.0.0
 * @param int   $post_id     Post ID scanned.
 * @param array $links_found Array of stored links from the scan.
 */
do_action( 'wbam_post_scanned', $post_id, $links_found );

/**
 * Fires when link health check batch completes.
 *
 * @since 1.0.0
 * @param array $results Batch of checked links with results.
 */
do_action( 'wbam_health_check_batch_complete', $results );

/**
 * Fires when batch link scan completes.
 *
 * @since 1.0.0
 * @param array $results Array of scanned posts.
 */
do_action( 'wbam_batch_scan_complete', $results );

/**
 * Fires on link redirect (for tracking).
 *
 * @since 1.0.0
 * @param object $link        Link object.
 * @param string $destination Destination URL.
 * @param array  $click_data  Click tracking data.
 */
do_action( 'wbam_pro_link_redirect', $link, $destination, $click_data );

Cron & Scheduled Tasks

/**
 * Fires after daily analytics aggregation completes.
 *
 * @since 1.0.0
 */
do_action( 'wbam_daily_aggregation_complete' );

/**
 * Fires after hourly cleanup completes (old analytics data purge).
 *
 * @since 1.0.0
 */
do_action( 'wbam_hourly_cleanup_complete' );

/**
 * Fires to trigger hourly CPM/CPC billing calculation.
 * Implemented by Wallet module (Billing_Manager).
 *
 * @since 1.3.1
 */
do_action( 'wbam_calculate_hourly_billing' );

/**
 * Fires to check and auto-pause campaigns with exhausted budgets.
 * Implemented by Campaign module.
 *
 * @since 1.3.1
 */
do_action( 'wbam_do_check_campaign_budgets' );

/**
 * Fires to check and alert low wallet balances.
 * Implemented by Wallet module.
 *
 * @since 1.3.1
 */
do_action( 'wbam_do_check_low_balances' );

/**
 * Fires after classifieds expiration cron runs.
 *
 * @since 1.0.0
 * @param int $count Number of expired classifieds.
 */
do_action( 'wbam_classifieds_expired', $count );

/**
 * Fires after classified upgrades expire.
 *
 * @since 1.3.1
 * @param int $count Number of expired upgrades.
 */
do_action( 'wbam_upgrades_expired', $count );

/**
 * Fires after audit log cleanup.
 *
 * @since 1.3.1
 * @param int $count Number of deleted audit log entries.
 */
do_action( 'wbam_audit_log_cleaned', $count );

/**
 * Fires before a cron job is manually triggered (via admin UI).
 *
 * @since 1.3.1
 * @param string $hook Job hook name.
 */
do_action( 'wbam_before_manual_cron', $hook );

/**
 * Fires after a cron job is manually triggered.
 *
 * @since 1.3.1
 * @param string $hook Job hook name.
 */
do_action( 'wbam_after_manual_cron', $hook );

Audit Log

/**
 * Fires after an audit log entry is created.
 *
 * @since 1.2.0
 * @param int   $log_id Log entry ID.
 * @param array $data   Log data (action, entity_type, entity_id, old_value, new_value, user_id).
 */
do_action( 'wbam_audit_logged', $log_id, $data );

Plugin Bootstrap

/**
 * Fires after all Pro modules are initialized.
 *
 * Use this to interact with loaded modules or register custom modules.
 *
 * @since 1.2.0
 * @param array $modules Array of active module instances.
 */
do_action( 'wbam_pro_modules_init', $modules );

Admin Settings

/**
 * Fires to render custom settings tab content.
 *
 * The hook name is dynamic: wbam_pro_settings_tab_{$tab_slug}.
 *
 * @since 1.2.0
 * @param array $settings Plugin settings.
 */
do_action( 'wbam_pro_settings_tab_' . $current_tab, $settings );

Example: Add a custom settings tab:

// 1. Register the tab via filter.
add_filter( 'wbam_pro_settings_tabs', function( $tabs ) {
    $tabs['my_custom'] = __( 'My Custom Tab', 'my-plugin' );
    return $tabs;
} );

// 2. Render tab content via action.
add_action( 'wbam_pro_settings_tab_my_custom', function( $settings ) {
    echo '<h2>My Custom Settings</h2>';
    // Render your settings fields.
} );

Portal & Form Actions

Advertiser Portal

/**
 * Fires in the portal tab header area (add action buttons, etc.).
 *
 * @since 1.2.0
 * @param string     $current_tab Current portal tab slug.
 * @param Advertiser $advertiser  Advertiser object.
 */
do_action( 'wbam_portal_tab_header_actions', $current_tab, $advertiser );

/**
 * Fires to render custom portal tab content.
 * Triggered when the active tab does not match any built-in tab.
 *
 * @since 1.2.0
 * @param string     $tab        Tab slug.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_portal_tab_content', $tab, $advertiser );

Example: Add a custom portal tab:

// 1. Register the tab.
add_filter( 'wbam_pro_portal_tabs', function( $tabs, $advertiser_id ) {
    $tabs['reports'] = __( 'Reports', 'my-plugin' );
    return $tabs;
}, 10, 2 );

// 2. Render content.
add_action( 'wbam_portal_tab_content', function( $tab, $advertiser ) {
    if ( 'reports' !== $tab ) return;
    echo '<h3>Custom Reports</h3>';
    // ... render reports.
}, 10, 2 );

Ad Creation Form

/**
 * Fires before the ad creation form.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_pro_ad_form_before', $advertiser );

/**
 * Fires after the scheduling section in the ad form.
 * Use this to add custom fields.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param string     $ad_type    Selected ad type (image, video, html, etc.).
 */
do_action( 'wbam_pro_ad_form_fields', $advertiser, $ad_type );

/**
 * Fires after the ad creation form.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_pro_ad_form_after', $advertiser );

/**
 * Fires before processing ad submission (before validation).
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param array      $post_data  Posted form data ($_POST).
 */
do_action( 'wbam_pro_ad_submission_before', $advertiser, $post_data );

/**
 * Fires after ad is saved to allow saving custom field data.
 *
 * @since 1.2.0
 * @param int        $ad_id      Ad post ID.
 * @param string     $ad_type    Ad type.
 * @param Advertiser $advertiser Advertiser object.
 * @param array      $post_data  Posted form data ($_POST).
 */
do_action( 'wbam_pro_ad_submission_save_meta', $ad_id, $ad_type, $advertiser, $post_data );

Ad Edit Form

/**
 * Fires at the start of the edit ad form.
 *
 * @since 1.2.0
 * @param WP_Post    $ad         Ad post object.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_edit_ad_form_start', $ad, $advertiser );

/**
 * Fires after scheduling fields in the edit ad form, before status info.
 *
 * @since 1.2.0
 * @param WP_Post    $ad         Ad post object.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_edit_ad_form_after_fields', $ad, $advertiser );

Campaign Forms

/**
 * Fires before the submit button in the create campaign form.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_campaign_form_before_submit', $advertiser );

/**
 * Fires before the submit button in the edit campaign form.
 *
 * @since 1.2.0
 * @param object     $campaign   Campaign object.
 * @param Advertiser $advertiser Advertiser object.
 */
do_action( 'wbam_edit_campaign_form_before_submit', $campaign, $advertiser );

Classified Form (My Classifieds Shortcode)

/**
 * Fires at the start of the my-classifieds form (before title field).
 *
 * @since 1.2.0
 * @param Classified|null $classified Classified object or null for new.
 * @param object          $advertiser Advertiser object.
 */
do_action( 'wbam_classified_form_start', $classified, $advertiser );

/**
 * Fires after basic fields (title, price, category, location).
 *
 * @since 1.2.0
 * @param Classified|null $classified Classified object or null for new.
 * @param object          $advertiser Advertiser object.
 */
do_action( 'wbam_classified_form_after_basic_fields', $classified, $advertiser );

/**
 * Fires after detail fields (description, images, contact info).
 *
 * @since 1.2.0
 * @param Classified|null $classified Classified object or null for new.
 * @param object          $advertiser Advertiser object.
 */
do_action( 'wbam_classified_form_after_details', $classified, $advertiser );

/**
 * Fires before the submit button.
 *
 * @since 1.2.0
 * @param Classified|null $classified Classified object or null for new.
 * @param object          $advertiser Advertiser object.
 */
do_action( 'wbam_classified_form_before_submit', $classified, $advertiser );

/**
 * Fires before the featured action buttons in the promote form.
 *
 * @since 1.2.0
 * @param object $classified Classified object.
 * @param object $advertiser Advertiser object.
 */
do_action( 'wbam_promote_form_before_actions', $classified, $advertiser );

Classified Form (Dashboard/Portal)

/**
 * Fires at the start of the dashboard classified form, before the title field.
 *
 * @since 1.2.0
 * @param object|null $classified Classified object (null for new).
 * @param Advertiser  $advertiser Advertiser object.
 */
do_action( 'wbam_dashboard_classified_form_start', $classified, $advertiser );

/**
 * Fires after category and location fields in the dashboard classified form.
 *
 * @since 1.2.0
 * @param object|null $classified Classified object (null for new).
 * @param Advertiser  $advertiser Advertiser object.
 */
do_action( 'wbam_dashboard_classified_after_basic_fields', $classified, $advertiser );

/**
 * Fires after detail fields (price, condition, description, images).
 *
 * @since 1.2.0
 * @param object|null $classified Classified object (null for new).
 * @param Advertiser  $advertiser Advertiser object.
 */
do_action( 'wbam_dashboard_classified_after_details', $classified, $advertiser );

/**
 * Fires after contact fields, before the submit button.
 *
 * @since 1.2.0
 * @param object|null $classified Classified object (null for new).
 * @param Advertiser  $advertiser Advertiser object.
 */
do_action( 'wbam_dashboard_classified_before_submit', $classified, $advertiser );

Profile & Registration Forms

/**
 * Fires after notification preferences in the profile form.
 * Use this to add custom profile fields.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param WP_User    $user       WordPress user object.
 */
do_action( 'wbam_pro_profile_form_fields', $advertiser, $user );

/**
 * Fires before processing profile update.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param WP_User    $user       WordPress user object.
 * @param array      $post_data  Posted form data ($_POST).
 */
do_action( 'wbam_pro_profile_update_before', $advertiser, $user, $post_data );

/**
 * Fires after profile update is processed.
 * Use this to save custom field data added via wbam_pro_profile_form_fields.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param WP_User    $user       WordPress user object.
 * @param array      $post_data  Posted form data ($_POST).
 */
do_action( 'wbam_pro_profile_update_after', $advertiser, $user, $post_data );

/**
 * Fires after standard registration form fields.
 * Use this to add custom registration fields.
 *
 * @since 1.2.0
 */
do_action( 'wbam_pro_registration_form_fields' );

/**
 * Fires after advertiser profile is created during registration.
 * Use this to save custom field data.
 *
 * @since 1.2.0
 * @param Advertiser $advertiser Advertiser object.
 * @param int        $user_id    WordPress user ID.
 * @param array      $post_data  Posted form data ($_POST).
 */
do_action( 'wbam_pro_registration_save_data', $advertiser, $user_id, $post_data );

Example: Add a custom field to registration:

// 1. Add the field to the form.
add_action( 'wbam_pro_registration_form_fields', function() {
    echo '<div class="wbam-form-group">';
    echo '<label for="tax_id">Tax ID</label>';
    echo '<input type="text" name="tax_id" id="tax_id">';
    echo '</div>';
} );

// 2. Save the data after registration.
add_action( 'wbam_pro_registration_save_data', function( $advertiser, $user_id, $post_data ) {
    if ( ! empty( $post_data['tax_id'] ) ) {
        update_user_meta( $user_id, '_wbam_tax_id', sanitize_text_field( $post_data['tax_id'] ) );
    }
}, 10, 3 );

Receipts & Email Templates

/**
 * Fires before receipt template renders.
 *
 * @since 1.1.0
 * @param object $transaction Transaction object.
 * @param object $advertiser  Advertiser object.
 */
do_action( 'wbam_before_receipt', $transaction, $advertiser );

/**
 * Add custom sections to receipt before total.
 *
 * @since 1.1.0
 * @param object $transaction Transaction object.
 * @param object $advertiser  Advertiser object.
 */
do_action( 'wbam_receipt_before_total', $transaction, $advertiser );

/**
 * Add custom content before benefits list in expiring email.
 *
 * @since 1.1.0
 * @param object $classified Classified object.
 * @param int    $days_left  Days until expiration.
 */
do_action( 'wbam_classified_expiring_email_before_benefits', $classified, $days_left );

Filters

Advertiser Filters

/**
 * Filter advertiser capabilities.
 *
 * @since 1.0.0
 * @param array $caps          Capabilities array.
 * @param int   $advertiser_id Advertiser ID.
 */
$caps = apply_filters( 'wbam_pro_advertiser_capabilities', $caps, $advertiser_id );

/**
 * Filter advertiser portal tabs.
 *
 * @since 1.0.0
 * @param array $tabs          Portal tab slug => label pairs.
 * @param int   $advertiser_id Advertiser ID.
 */
$tabs = apply_filters( 'wbam_pro_portal_tabs', $tabs, $advertiser_id );

/**
 * Filter to validate whether an advertiser can post classifieds.
 *
 * Return WP_Error to prevent posting with a custom message.
 *
 * @since 1.2.0
 * @param true|WP_Error $result     Validation result.
 * @param object        $advertiser Advertiser object.
 */
$result = apply_filters( 'wbam_validate_advertiser_can_post', true, $advertiser );

Example: Restrict posting to verified advertisers only:

add_filter( 'wbam_validate_advertiser_can_post', function( $result, $advertiser ) {
    if ( ! get_user_meta( $advertiser->user_id, '_verified_seller', true ) ) {
        return new WP_Error( 'not_verified', 'Only verified sellers can post classifieds.' );
    }
    return $result;
}, 10, 2 );

Campaign Filters

/**
 * Filter campaign pricing calculation.
 *
 * @since 1.0.0
 * @param float $price       Calculated price.
 * @param array $campaign    Campaign data.
 * @param array $impressions Impression data.
 */
$price = apply_filters( 'wbam_pro_campaign_price', $price, $campaign, $impressions );

/**
 * Filter available placements for package.
 *
 * @since 1.0.0
 * @param array $placements Available placements.
 * @param int   $package_id Package ID.
 */
$placements = apply_filters( 'wbam_pro_package_placements', $placements, $package_id );

/**
 * Filter bot detection patterns used for excluding bot traffic from analytics.
 *
 * @since 1.0.0
 * @param array $patterns Array of bot user agent pattern strings (lowercase).
 */
$patterns = apply_filters( 'wbam_bot_patterns', $patterns );

Payment & Wallet Filters

/**
 * Filter available payment gateways.
 *
 * @since 1.0.0
 * @param array $gateways Available gateways.
 */
$gateways = apply_filters( 'wbam_pro_payment_gateways', $gateways );

/**
 * Filter payment amount before processing.
 *
 * @since 1.0.0
 * @param float  $amount      Payment amount.
 * @param string $gateway_id  Gateway identifier.
 * @param array  $context     Payment context.
 */
$amount = apply_filters( 'wbam_pro_payment_amount', $amount, $gateway_id, $context );

/**
 * Filter minimum deposit amount for wallet funding.
 *
 * @since 1.0.0
 * @param float $amount Minimum amount (default: 5.00).
 */
$amount = apply_filters( 'wbam_pro_minimum_deposit', 5.00 );

/**
 * Filter available wallet payment methods shown in the frontend form.
 *
 * @since 1.0.0
 * @param array $methods Array of payment method slug => label pairs.
 */
$methods = apply_filters( 'wbam_wallet_payment_methods', $methods );

Classified Filters

/**
 * Filter classified listing output.
 *
 * @since 1.0.0
 * @param string $output        Listing HTML.
 * @param int    $classified_id Classified ID.
 * @param array  $args          Display arguments.
 */
$output = apply_filters( 'wbam_pro_classified_output', $output, $classified_id, $args );

/**
 * Filter classified search query args.
 *
 * @since 1.0.0
 * @param array $args   Query arguments.
 * @param array $search Search parameters.
 */
$args = apply_filters( 'wbam_pro_classified_search_args', $args, $search );

/**
 * Filter classifieds per page for listing pages.
 *
 * @since 1.0.0
 * @param int $per_page Number of items per page (default: 12).
 */
$per_page = apply_filters( 'wbam_classifieds_per_page', 12 );

/**
 * Filter classified bump cost.
 *
 * @since 1.1.0
 * @param float $cost Bump cost (default: 2.00).
 */
$cost = apply_filters( 'wbam_classified_bump_cost', 2.00 );

/**
 * Filter classified renewal cost.
 *
 * @since 1.1.0
 * @param float $cost Renewal cost (default: 0.00, free renewal).
 */
$cost = apply_filters( 'wbam_classified_renewal_cost', 0.00 );

/**
 * Filter classified renewal days.
 *
 * @since 1.1.0
 * @param int $days Default renewal days (default: 30).
 */
$days = apply_filters( 'wbam_classified_renewal_days', 30 );

/**
 * Filter individual upgrade prices. One filter per upgrade type.
 *
 * @since 1.2.0
 * @param float $price Default price.
 */
$prices = array(
    'featured'    => apply_filters( 'wbam_upgrade_price_featured', 5.00 ),
    'highlighted' => apply_filters( 'wbam_upgrade_price_highlighted', 3.00 ),
    'urgent'      => apply_filters( 'wbam_upgrade_price_urgent', 4.00 ),
    'top'         => apply_filters( 'wbam_upgrade_price_top', 6.00 ),
    'bump'        => apply_filters( 'wbam_upgrade_price_bump', 2.00 ),
);

/**
 * Filter upgrade durations (in days).
 *
 * @since 1.2.0
 * @param array $durations Associative array of upgrade_type => duration_days.
 */
$durations = apply_filters( 'wbam_classified_upgrade_durations', array(
    'featured'    => 30,
    'highlighted' => 14,
    'urgent'      => 7,
    'top'         => 7,
    'bump'        => 0,  // Instant, no duration.
) );

/**
 * Filter max images per classified.
 *
 * @since 1.0.0
 * @param int $max Max images allowed (default from settings, fallback: 10).
 */
$max = apply_filters( 'wbam_classified_max_images', 10 );

/**
 * Filter expiration warning days (when to send expiry warnings).
 *
 * @since 1.1.0
 * @param array $days Array of days before expiry to send warnings (default: [7, 3]).
 */
$days = apply_filters( 'wbam_classified_expiration_warning_days', array( 7, 3 ) );
/**
 * Filter affiliate domains for link scanner.
 *
 * @since 1.0.0
 * @param array $domains List of affiliate domains.
 */
$domains = apply_filters( 'wbam_affiliate_domains', array(
    'amazon.com', 'amzn.to', 'shareasale.com', 'commission-junction.com'
) );

/**
 * Filter whether to auto-link a post.
 *
 * @since 1.0.0
 * @param bool    $should Whether to process post (default: true).
 * @param WP_Post $post   Post object.
 */
$should = apply_filters( 'wbam_pro_should_auto_link_post', true, $post );

/**
 * Filter HTML tags excluded from auto-linking.
 *
 * @since 1.0.0
 * @param array $tags Tags to exclude (default: a, script, style, code, pre).
 */
$tags = apply_filters( 'wbam_pro_auto_link_excluded_tags', array( 'a', 'script', 'style', 'code', 'pre' ) );

/**
 * Filter click tracking data.
 *
 * @since 1.0.0
 * @param array $data    Click data (ip, user_agent, referrer, etc.).
 * @param int   $link_id Link ID.
 */
$data = apply_filters( 'wbam_pro_click_data', $data, $link_id );

/**
 * Filter whether to track a click.
 *
 * @since 1.0.0
 * @param bool $should Whether to track (default: true).
 */
$should = apply_filters( 'wbam_pro_should_track_click', true );

Analytics & Tracking Filters

/**
 * Filter whether the current visitor has given tracking consent.
 *
 * Returns false by default. Use this to integrate with cookie consent plugins.
 *
 * @since 1.2.0
 * @param bool $has_consent Whether tracking consent has been given (default: false).
 */
$has_consent = apply_filters( 'wbam_has_tracking_consent', false );

Example: Integrate with a cookie consent plugin:

add_filter( 'wbam_has_tracking_consent', function( $has_consent ) {
    // Check your consent management platform.
    if ( function_exists( 'my_cookie_consent_given' ) ) {
        return my_cookie_consent_given( 'analytics' );
    }
    return $has_consent;
} );

Template Filters

/**
 * Filter template arguments before loading.
 *
 * @since 1.2.0
 * @param array  $args     Template arguments.
 * @param string $template Template name (e.g., 'portal/tab-overview').
 */
$args = apply_filters( 'wbam_template_args', $args, $template );

/**
 * Filter placements from the free WB Ad Manager plugin.
 *
 * Used by Package to resolve placement names.
 *
 * @since 1.0.0
 * @param array $placements Associative array of placement_id => placement_data.
 */
$placements = apply_filters( 'wbam_get_placements', array() );

BuddyPress Filters

/**
 * Filter the seller xProfile fields displayed on classified detail pages.
 *
 * @since 1.2.0
 * @param array $fields  Array of field data arrays (name, value).
 * @param int   $user_id The seller's WordPress user ID.
 */
$fields = apply_filters( 'wbam_seller_xprofile_fields', $fields, $user_id );

Portal & Forms Filters

/**
 * Filter ad submission validation.
 * Return WP_Error to fail validation with a custom message.
 *
 * @since 1.0.0
 * @param true|WP_Error $valid      True or WP_Error.
 * @param string        $title      Ad title.
 * @param string        $url        Ad URL.
 * @param string        $ad_type    Ad type.
 * @param Advertiser    $advertiser Advertiser object.
 * @param array         $post_data  Posted form data ($_POST).
 */
$valid = apply_filters( 'wbam_pro_ad_submission_validation', true, $title, $url, $ad_type, $advertiser, $post_data );

/**
 * Filter registration validation.
 * Return WP_Error to fail validation with a custom message.
 *
 * @since 1.0.0
 * @param true|WP_Error $valid    True or WP_Error.
 * @param string        $username Username.
 * @param string        $email    Email address.
 * @param array         $post_data Posted form data ($_POST).
 */
$valid = apply_filters( 'wbam_pro_registration_validation', true, $username, $email, $post_data );

/**
 * Filter settings page tabs.
 *
 * @since 1.0.0
 * @param array $tabs     Associative array of tab_slug => label.
 * @param array $settings Current plugin settings.
 */
$tabs = apply_filters( 'wbam_pro_settings_tabs', $tabs, $settings );

/**
 * Filter registered cron jobs.
 *
 * @since 1.0.0
 * @param array $jobs Associative array of hook => job config.
 */
$jobs = apply_filters( 'wbam_pro_cron_jobs', $jobs );

Admin Table Filters

/**
 * Filter transaction list table columns.
 *
 * @since 1.1.0
 * @param array $columns Associative array of column_slug => label.
 */
$columns = apply_filters( 'wbam_transaction_table_columns', $columns );

/**
 * Filter transaction row actions.
 *
 * @since 1.1.0
 * @param array  $actions Associative array of action_slug => link HTML.
 * @param object $item    Transaction row item.
 */
$actions = apply_filters( 'wbam_transaction_row_actions', $actions, $item );

Email Template Filters

/**
 * Filter classified expiring email heading.
 *
 * @since 1.1.0
 * @param string $heading    Email heading text.
 * @param object $classified Classified object.
 * @param int    $days_left  Days until expiration.
 */
$heading = apply_filters( 'wbam_classified_expiring_email_heading', $heading, $classified, $days_left );

/**
 * Filter renewal benefits list in expiring email.
 *
 * @since 1.1.0
 * @param array  $benefits   Array of benefit strings.
 * @param object $classified Classified object.
 */
$benefits = apply_filters( 'wbam_classified_expiring_email_benefits', $benefits, $classified );

Quick Reference Table

Actions Summary

Hook Parameters Source
wbam_advertiser_created $advertiser Advertiser_Manager
wbam_advertiser_status_changed $advertiser_id, $new_status, $old_status Advertiser_Manager
wbam_advertiser_deleted $advertiser_id, $data Advertiser_Manager
wbam_advertiser_registered $user_id, $advertiser Advertiser_Shortcodes
wbam_advertiser_balance_credited $advertiser_id, $amount, $note Advertiser
wbam_advertiser_balance_debited $advertiser_id, $amount, $note Advertiser
wbam_campaign_created $campaign Campaign_Manager
wbam_campaign_updated $campaign, $old_data Campaign_Manager
wbam_campaign_status_changed $campaign, $old_status, $new_status Campaign_Manager
wbam_campaign_deleted $id, $data Campaign_Manager
wbam_campaign_expired $campaign_id Campaign_Manager
wbam_campaign_auto_completed $campaign Campaign_Manager
wbam_ad_auto_disabled $ad_id Campaign_Manager
wbam_hourly_billing_completed $processed_count, $total_billed Billing_Manager
wbam_campaign_billed $campaign, $amount, $transaction Billing_Manager
wbam_campaign_insufficient_balance $campaign, $amount Billing_Manager
wbam_wallet_credited $transaction, $amount Wallet_Manager
wbam_wallet_debited $transaction, $amount Wallet_Manager
wbam_advertiser_low_balance $advertiser, $balance, $threshold Wallet_Manager
wbam_fund_request_submitted $transaction_id, $advertiser, $amount Wallet_API / Shortcodes
wbam_fund_request_approved $transaction_id, $advertiser, $amount Pro_Admin
wbam_stripe_webhook $event Stripe_Integration
wbam_ad_submitted $submission Ad_Submission_Manager
wbam_ad_submission_approved $submission Ad_Submission_Manager
wbam_ad_submission_rejected $submission, $reason Ad_Submission_Manager
wbam_ad_submission_changes_requested $submission, $notes Ad_Submission_Manager
wbam_ad_submission_resubmitted $submission Ad_Submission_Manager
wbam_ad_updated $ad_id, $advertiser Advertiser_Shortcodes
wbam_ad_deleted $ad_id, $advertiser Advertiser_Shortcodes
wbam_classified_created $classified, $data Classified_Manager
wbam_classified_updated $classified, $data Classified_Manager
wbam_classified_deleted $classified_id, $post_id Classified_Manager
wbam_classified_approved $classified Classified_Manager
wbam_classified_rejected $classified, $reason Classified_Manager
wbam_classified_sold $classified Classified_Manager
wbam_classified_expired $classified, $old_listing_type Classified_Manager
wbam_classified_renewed $classified, $days Classified_Manager
wbam_classified_bumped $classified Classified_Manager
wbam_classified_expiring $classified, $days Classified_Manager
wbam_classified_upgraded $classified, $applied Classified_Manager
wbam_classified_featured_upgraded $classified, $fee, $duration Classified
wbam_classified_featured_downgraded $classified, $reason Classified
wbam_classified_featured_billing_failed $classified, $advertiser, $fee Classified
wbam_classified_featured_renewed $classified, $fee Classified
wbam_classified_downgraded $classified_id Cron_Manager
wbam_inquiry_received $inquiry Email_Notifications
wbam_inquiry_replied $inquiry, $message Classified_Manager
wbam_seller_followed $advertiser_id, $user_id Advertiser
wbam_seller_unfollowed $advertiser_id, $user_id Advertiser
wbam_followers_notified_new_listing $classified, $followers Email_Notifications
wbam_package_created $package Package_Manager
wbam_package_updated $package, $old_data Package_Manager
wbam_package_deleted $id, $data Package_Manager
wbam_audit_logged $log_id, $data Audit_Logger
wbam_pro_modules_init $modules Pro_Plugin
wbam_daily_aggregation_complete Cron_Manager
wbam_hourly_cleanup_complete Cron_Manager
wbam_calculate_hourly_billing Cron_Manager
wbam_do_check_campaign_budgets Cron_Manager
wbam_do_check_low_balances Cron_Manager
wbam_classifieds_expired $count Cron_Manager
wbam_upgrades_expired $count Cron_Manager
wbam_audit_log_cleaned $count Cron_Manager
wbam_before_manual_cron $hook Cron_Manager
wbam_after_manual_cron $hook Cron_Manager

Filters Summary

Hook Default Source
wbam_pro_advertiser_capabilities $caps
wbam_pro_portal_tabs $tabs
wbam_validate_advertiser_can_post true Classified_Shortcodes
wbam_pro_campaign_price $price
wbam_pro_package_placements $placements
wbam_bot_patterns $patterns Campaign_Manager
wbam_pro_payment_gateways $gateways
wbam_pro_payment_amount $amount
wbam_pro_minimum_deposit 5.00 Wallet_API
wbam_wallet_payment_methods $methods Advertiser_Shortcodes
wbam_pro_classified_output $output
wbam_pro_classified_search_args $args
wbam_classifieds_per_page 12 Classified_Shortcodes
wbam_classified_bump_cost 2.00 Ajax_Handler
wbam_classified_renewal_cost 0.00 Ajax_Handler
wbam_classified_renewal_days 30 Ajax_Handler
wbam_upgrade_price_featured 5.00 Ajax_Handler
wbam_upgrade_price_highlighted 3.00 Ajax_Handler
wbam_upgrade_price_urgent 4.00 Ajax_Handler
wbam_upgrade_price_top 6.00 Ajax_Handler
wbam_upgrade_price_bump 2.00 Ajax_Handler
wbam_classified_upgrade_durations array(...) Classified_Manager
wbam_classified_max_images 10 Shortcode_Assets
wbam_classified_expiration_warning_days [7, 3] Classified_Manager
wbam_has_tracking_consent false Analytics_Tracker
wbam_template_args $args Template_Loader
wbam_get_placements array() Package
wbam_seller_xprofile_fields $fields XProfile_Helper
wbam_pro_ad_submission_validation true Advertiser_Shortcodes
wbam_pro_registration_validation true Advertiser_Shortcodes
wbam_pro_settings_tabs $tabs Pro_Admin
wbam_pro_cron_jobs $jobs Cron_Manager
wbam_transaction_table_columns $columns Transactions_List_Table
wbam_transaction_row_actions $actions Transactions_List_Table
wbam_classified_expiring_email_heading $heading
wbam_classified_expiring_email_benefits $benefits
wbam_affiliate_domains array(...)
wbam_pro_should_auto_link_post true Keyword_Linker
wbam_pro_auto_link_excluded_tags array(...)
wbam_pro_click_data $data Link_Tracker
wbam_pro_should_track_click true Link_Tracker
Last updated: March 4, 2026