Skip to content

Pro Hooks Reference

This reference covers WP Career Board Pro 1.4.3.

WP Career Board Pro fires its own wcbp_* actions and filters (in addition to the Free hooks documented in the Free developer guide). Pro also participates in some wcb_* (Free namespace) hooks where it shares the contract surface with Free. The exact set ships in the audit manifest (audit/manifest.json) and is also summarised in docs/HOOKS.md.

Hook Args Use to
wcbp_application_stage_changed $app_id, $old_stage, $new_stage React when an application moves through the Kanban pipeline. Args are stage IDs (integers); old comes before new. Fired from api/endpoints/class-pipeline-endpoint.php.
wcbp_board_deleted $board_id Cleanup when a Pro board is removed. Cascades to applications and stage data.
wcbp_credit_consumed $user_id, $amount, $item_id A deduction row was written to the credit ledger. Use for audit logging or per-purchase notifications. Fired from modules/credits/class-credit-reconciler.php.
wcbp_credits_low $user_id, $balance The SDK reported a credit balance at or below the configured low threshold (re-emitted from the SDK’s wbcom_credits_low, scoped to this plugin).
wcbp_credits_topped_up $user_id, $amount, $note The SDK recorded a credit top-up (re-emitted from the SDK’s wbcom_credits_topped_up, scoped to this plugin).
wcbp_field_group_saved $group_id A field-builder group was created or updated.
wcbp_field_group_deleted $group_id A field-builder group was deleted.
wcbp_field_definition_saved $field_id, $group_id A field-builder field definition was created or updated ($group_id is 0 on update-by-id).
wcbp_field_definition_deleted $field_id A field-builder field definition was deleted.
wcbp_field_value_saved $post_id, $key, $value A custom field value on a job/company/candidate/resume was saved via the field builder.
wcbp_resume_published $resume_id, $post A candidate’s resume went public. $post is the WP_Post. Use for search indexing or notifications.
wcbp_send_alert_email $alert, $jobs Pro is about to send a job-alert email. $alert is the alert row, $jobs the matched jobs. Hook to send a parallel SMS, Slack, etc.
wcbp_open_to_work_before_item $resume, $user, $user_id Render extra markup before each Open-to-Work listing item.
wcbp_open_to_work_after_item $resume, $user, $user_id Render extra markup after each Open-to-Work listing item.
wcbp_ai_score_application $app_id Internal single-event cron action. Pro schedules it (via wp_schedule_single_event) to score a new application in the background when “Auto-score applicants on submit” is on.

Pro also fires Free hooks in places where the action semantically belongs to Pro but the contract is shared:

Hook Where Pro fires it Why
wcb_application_status_changed modules/pipeline/class-pipeline-module.php When a pipeline move reaches a terminal stage, Pro closes the application and fires this with ($app_id, $old_status, 'closed') so Free’s status listeners (notifications, BuddyPress) run.
wcb_resume_form_simple_extra_fields blocks/resume-form-simple/render.php Extension point for adding fields to the quick resume form. Passes $attributes.
wcb_add_more_info_hero_actions blocks/resume-single/render.php Extension point for adding buttons to the resume hero.
wcb_job_csv_imported modules/migration/class-csv-importer.php Fired once per imported job row with ($post_id, $data).
wcb_notification_created modules/notificationsbell/class-notifications-bell-module.php Fired after a bell notification row is inserted, with one array arg { user_id, event_type, message, link, id } (id = inserted row id), so a centralised notification center (BuddyNext) can mirror it. Shared wcb_ name so one listener covers Free + Pro; Free fires the same hook from its email send.
Hook Returns
wcbp_ai_provider_drivers array - registered AI provider drivers (Anthropic Claude, OpenAI, Ollama, custom)
wcbp_ai_provider_requires_api_key bool - does the active provider need a key?
wcbp_candidate_resume_data array - the resume data shape sent to AI for ranking/matching
wcbp_ai_candidate_matches array - the AI candidate-match results before they are returned (args: $matches, $user_id)
wcbp_ai_ranked_applications array - the AI applicant-ranking results before they are returned (args: $ranked, $job_id)
wcbp_ai_claude_model string - the Claude model id used for analysis/ranking (default reads the wcbp_ai_anthropic_model option)

wcbp_ai_anthropic_model is an option (set on the AI settings screen), not a filter. It stores the chosen Claude model id and is read with get_option() as the default value the wcbp_ai_claude_model filter then applies. Override the model at runtime through that filter; change the saved default through the option.

Hook Returns
wcbp_alert_dispatch_channels array - which channels to send job alerts through (email, in-bell-notification, future SMS/Slack)
Hook Returns
wcbp_consumer_cost int - actual credits charged for a consumer. Args: $base_cost, $user_id, $item_id, $board_id, $consumer_slug. Tier-pricing happens here (e.g. BpTieredCreditCost).
Hook Returns
wcbp_kanban_card_columns array - extra columns shown on each Kanban card
Hook Returns
wcbp_pwa_manifest array - the PWA manifest before it’s served at /wp-json/wcb/v1/pwa-manifest
Hook Returns
wcbp_resume_groups array - the resume-form field groups (Personal, Experience, Education, Skills, etc.)
wcbp_resume_textarea_fields array - fields rendered as textareas vs single-line inputs
wcbp_resume_checkbox_fields array - fields rendered as checkboxes
wcbp_resume_date_fields array - fields formatted as date inputs
wcbp_resume_field_label string - override the label of a specific field
wcbp_resume_pdf_renderer callable - swap out the resume-to-PDF rendering engine

Pro also extends these Free filters:

Hook What Pro returns
wcb_rest_prepare_board Adds Pro-specific board metadata to the boards response.
wcb_rest_prepare_board_stage Pipeline-stage data shape.
wcb_rest_prepare_notification Notifications bell response shape.
wcb_rest_prepare_resume Resume profile shape.
wcb_job_form_fields Injects custom job field groups (field builder).
wcb_company_form_fields Injects custom company field groups.
wcb_candidate_form_fields Injects custom candidate field groups.
wcb_resume_form_fields Injects custom resume field groups.
wcb_board_options_for_employer Restricts the board picker to the employer’s BuddyPress groups.

Per-board credit cost is not a Free filter. The cost is resolved inside Pro’s SDK consumer cost callback from BoardSettings::get() and then run through wcbp_consumer_cost.

Send a Slack message when a pipeline reaches a terminal stage

Section titled “Send a Slack message when a pipeline reaches a terminal stage”

wcb_application_status_changed fires with ($app_id, $old_status, $new_status). Pro fires it with a final status of closed when a Kanban move lands on a terminal stage:

add_action( 'wcb_application_status_changed', function ( $app_id, $old_status, $new_status ) {
if ( 'closed' !== $new_status ) {
return;
}
$job_id = (int) get_post_meta( $app_id, '_wcb_job_id', true );
$job_title = get_the_title( $job_id );
wp_remote_post( SLACK_WEBHOOK, array(
'body' => wp_json_encode( array( 'text' => "Application closed: {$job_title}" ) ),
'headers' => array( 'Content-Type' => 'application/json' ),
));
}, 10, 3 );
add_filter( 'wcbp_resume_groups', function ( $groups ) {
$groups['portfolio'] = array(
'label' => __( 'Portfolio links', 'my-addon' ),
'fields' => array(
'github' => array( 'type' => 'url', 'label' => 'GitHub' ),
'linkedin' => array( 'type' => 'url', 'label' => 'LinkedIn' ),
'dribbble' => array( 'type' => 'url', 'label' => 'Dribbble' ),
),
);
return $groups;
});
add_filter( 'wcbp_consumer_cost', function ( $cost, $user_id, $item_id, $board_id, $consumer ) {
if ( 'job_post' === $consumer && user_can( $user_id, 'wcb_employer_pro_tier' ) ) {
return max( 0, (int) ( $cost / 2 ) ); // 50% off for Pro-tier employers
}
return $cost;
}, 20, 5 );
Terminal window
grep -rn "do_action\\s*(\\s*'wcbp_credit_consumed'" wp-content/plugins/wp-career-board-pro/

The result is the file:line where Pro fires the hook; read the surrounding lines for the parameter shapes.