Skip to content

Filters Reference

All apply_filters() hooks in Ignition Crowdfunding. Use these to modify data before it is used or displayed.

Filter Parameters Description
igcf_is_reward_levels_enabled $enabled Override whether the reward levels feature is active. Default: true.
igcf_is_pwyw_with_rewards $enabled Override whether the “Pledge What You Want” option appears alongside reward tiers. Default: true.
igcf_reward_level_post_type_args $args Modify the reward level custom post type registration arguments.
igcf_reward_level_editable_fields $fields, $campaign Modify which reward level fields remain editable after a campaign leaves Draft status. $fields is an array of field names (e.g., title, description, image_id, active).
igcf_rest_prepare_reward_level $response, $post, $request Filter reward level data before it is returned in a REST response. $response is a WP_REST_Response.
Filter Parameters Description
igcf_campaign_locked_fields $fields, $campaign, $user_id Modify which campaign fields are locked for a given campaign and user. $fields is an array of field keys (e.g., title, goal, categories). Add-ons can selectively unlock fields — for example, allowing creators to edit descriptions on active campaigns.
Filter Parameters Description
igcf_campaign_form_args $args, $mode, $campaign Modify the arguments passed to the campaign form template.
igcf_campaign_form_state $state, $campaign Modify the form state (buttons, read-only flag, messages).
igcf_campaign_form_readonly_message $message, $campaign Change the message shown when the form is read-only.
igcf_campaign_form_placeholder_tags $tags, $campaign Customize the placeholder tag suggestions shown in the campaign form tag field when no tags are selected. $tags is an array of tag names (up to five most-used public tags by default). $campaign is the WP_Post being edited, or null in create mode. Useful for category-aware lists or add-on-driven suggestions.
igcf_campaign_form_submit_button $button, $campaign_status Filter the final-step submit button on draft and rejected campaigns. $button is an array { value, label, class }. Add-ons swap it (for example, Ignition Platform Mode relabels it “Submit for Review”); mutate value / label and preserve class.
igcf_determine_initial_status $status, $request, $campaign_id Override the computed initial status of a campaign submission. $request is the WP_REST_Request. Core’s default resolves a direct-mode preview / active status; add-ons route submissions to pending review instead.
Filter Parameters Description
igcf_template_args $args, $template_name, $template_path Modify arguments passed to any plugin template.
igcf_locate_template $located, $template_name, $template_file Override the resolved template file path.
Filter Parameters Description
igcf_campaign_display_data $data, $post_id Modify the data used to display a campaign.
igcf_single_campaign_args $data, $post_id Modify data passed to the single campaign template.
igcf_single_campaign_date_format $format Change the PHP date format on single campaign pages.
igcf_archive_campaign_query_statuses $statuses Change which statuses appear in the campaign archive.
Filter Parameters Description
igcf_campaign_post_type_args $args Modify the custom post type registration arguments.
igcf_campaign_statuses $statuses Modify the registered custom post statuses. In a direct-mode core install the moderation statuses (igcf_pending_review, igcf_rejected) are not registered; Ignition Platform Mode hooks this filter to add them.
igcf_campaign_meta_fields $meta_fields Modify the meta field definitions.
igcf_is_moderation_enabled $enabled Whether campaign moderation is active. Core defaults it to false (direct mode has no review gate); Ignition Platform Mode filters it on when its moderation feature is enabled. Consumers read it via igcf_is_moderation_enabled().
Filter Parameters Description
igcf_campaign_transitions $transitions Modify the campaign state machine. $transitions is an associative array of status => allowed_next_statuses[]. Core’s direct-mode machine is draft → preview/active → paused → ended → closed; add-ons register new statuses and edges here (for example, Ignition Platform Mode adds the pending-review and rejected moderation edges).
Filter Parameters Description
igcf_campaign_withdraw_allowed $allowed, $campaign_id Control whether a campaign can be withdrawn from review.
igcf_campaign_detail_lifecycle_verbs $verbs, $status, $flags, $campaign_id Filter the ordered lifecycle-verb list on the wp-admin campaign detail actions bar. $verbs is a string[]; $flags is an array of per-campaign flags. Add-ons inject verbs core omits in direct mode (for example, Ignition Platform Mode adds Approve / Reject).
igcf_campaign_duplicate_meta_keys $meta_keys, $post_id, $new_post_id Control which meta keys are copied when duplicating.
igcf_campaign_duplicate_taxonomies $taxonomies, $post_id, $new_post_id Control which taxonomies are copied when duplicating.
Filter Parameters Description
igcf_campaign_admin_columns $columns Modify the columns in the admin campaign list table.
igcf_campaign_row_actions $actions, $post Modify row actions in the admin campaign list.
igcf_campaign_bulk_actions $actions, $current_status Modify available bulk actions by status.
igcf_admin_menu_badges $badges, $mode Modify admin menu badge counts. $mode is the resolved Live/Test view mode ('live' or 'test') — see below.

Badge counts and the Live/Test view mode. $mode tells a subscriber which view the admin is currently looking at. If your count comes from campaign, pledge, or update data, count only data belonging to that mode, so the bubble agrees with the screen it links to. If it counts configuration instead (an unset setting, an inactive dependency), ignore $mode.

Receiving $mode is opt-in: register with accepted_args of 2. Subscribers on the default of 1 never see it and keep working unchanged.

add_filter( 'igcf_admin_menu_badges', 'my_addon_badge', 10, 2 );
function my_addon_badge( $badges, $mode = 'live' ) {
// Give the parameter a default — WordPress calls a filter with however many
// arguments the caller passed, so a required second parameter can throw.
$badges[] = array(
'menu_slug' => 'edit.php?post_type=igcf_campaign',
'submenu_slug' => 'edit.php?post_type=igcf_campaign',
'count' => my_addon_count_for_mode( $mode ),
);
return $badges;
}

Seams on the wp-admin pledge detail page, so an add-on that takes a share of a pledge can show its working where the operator reads the totals. There are two kinds. Settlement terms say where a charge went, and are documented below. Column filters add descriptive columns to the Payment Attempts and Refunds tables further down the same page, and are listed here. Core owns ordering and escaping on both; a contribution that is not the documented shape is discarded rather than rendered, so a misbehaving listener degrades to core’s own figures instead of breaking the page.

Filter Parameters Description
igcf_pledge_detail_attempt_columns $columns, $pledge Add columns to the Payment Attempts table.
igcf_pledge_detail_attempt_cells $cells, $attempt, $pledge Supply this attempt’s values for those columns, keyed to match.
igcf_pledge_detail_refund_columns $columns, $pledge Add columns to the Refunds table.
igcf_pledge_detail_refund_cells $cells, $refund, $attempt, $pledge Supply this refund’s values for those columns, keyed to match.

igcf_pledge_settlement_terms answers the other half of the money question on the pledge detail page: not what the charge was made of (that is igcf_pledge_breakdown_components) but where the charge went. Core applies it once per succeeded payment attempt, seeding its own Returned to backer term first and appending Net afterwards as the residual.

Filter Parameters Description
igcf_pledge_settlement_terms $terms, $attempt, $pledge Declare one settlement term per destination your add-on owns. $attempt is an Igcf_Payment_Attempt and $pledge an Igcf_Pledge — there is no context array, because every settlement figure is already keyed by attempt ID. Read the attempt you are handed; a pledge can carry more than one and core renders a block for each.

A term is:

array(
'key' => string, // sanitize_key()'d, unique. First writer of a key wins.
// 'returned' and 'net' are reserved for core.
'label' => string, // Plain text, in YOUR add-on's text domain. Core escapes it.
'destination' => string, // 'gateway' | 'platform' | 'creator' | 'backer'.
'amount' => int, // Minor units, >= 0. Never a float, never a formatted string.
'state' => string, // 'received' | 'owed' | 'reversed'. Optional, default 'received'.
'order' => int, // Sort weight. Optional, default 0.
)

Core owns ordering, signs, totalling, the destination wording, escaping, its own two terms and both arithmetic checks. There is deliberately no sign field and no way to choose a position: core sorts by order then key and derives the sign from destination and state. Recommended weights are processing 200, commission 300 and tip 400; returned (100) and net (900) belong to core.

Declare a term whenever your add-on holds a record for this attempt, whatever the amount — a fully reversed commission is 'amount' => 0, 'state' => 'reversed' and renders as $0.00. Declare nothing when there is no record, and no row appears. Those are different facts, so resolve presence and amount from two different reads.

Malformed input degrades rather than breaking the page: a callback returning a non-array leaves core’s own terms standing, and a term that is not an array, carries a non-scalar key/label/destination, claims a value outside either enum, repeats a key, uses a reserved key, or carries a negative or non-integer amount is dropped whole. Every drop other than plain malformation also fires _doing_it_wrong(), visible under WP_DEBUG.

add_filter(
'igcf_pledge_settlement_terms',
// Do not type-hint $terms. A callback at a lower priority that forgets its
// return hands you null, and `array $terms` turns that into a TypeError that
// takes the whole admin pledge page down. Check the type instead.
function ( $terms, $attempt, $pledge ) {
if ( ! is_array( $terms ) ) {
return $terms;
}
$charge = My_Addon_Ledger::charge_for_attempt( (int) $attempt->id );
if ( null === $charge ) {
return $terms; // No record for this attempt — declare nothing.
}
$held = My_Addon_Ledger::net_for_attempt( (int) $attempt->id );
$terms[] = array(
'key' => 'commission',
'label' => __( 'Commission', 'my-addon' ),
'destination' => 'platform',
'amount' => (int) $held,
'state' => $held < $charge ? 'reversed' : 'received',
'order' => 300,
);
return $terms;
},
10,
3
);

Register the callback behind an is_admin() check: the statement exists on one wp-admin screen, so a globally registered callback runs its queries on every checkout and receipt render for no output.

The pledge, payment-attempt, and refund entities each expose the same three-filter shape (status registry, transitions map, and a pre-transition gate), plus a creation gate and a query-args filter. See the Service Layer for the data model.

Filter Parameters Description
igcf_pledge_before_create $data, $campaign_id Modify pledge data before database insertion. Return WP_Error to block creation.
igcf_pledge_query_args $args Modify query arguments passed to Igcf_Pledge_Service::query().
igcf_pledge_statuses $statuses Modify the registered pledge statuses. Default: pending, succeeded, canceled.
igcf_pledge_transitions $transitions Modify the pledge state machine. Default: pending → [succeeded, canceled]; both targets terminal.
igcf_pledge_before_{$new_status} $pre, $pledge_id, $actor_id Fires before a pledge transitions to a specific status. Return WP_Error to block. Default $pre is null.
igcf_pledge_cancel_reasons $reasons The registry of valid cancel-reason strings (requested_by_backer, duplicate, campaign_failed, fraudulent, admin_void, payment_abandoned). Gateway add-ons extend it.
igcf_pledge_expiry_minutes $minutes Minutes of inactivity before a pending, non-durable pledge becomes eligible for the abandoned-pledge sweep. Default 60.
igcf_pledge_durable_methods $methods Payment methods the abandoned-pledge sweep never touches. Default ['offline'].
igcf_pledge_is_expirable $expirable, $pledge Per-pledge veto over the abandoned-pledge sweep, applied to each stale candidate. $pledge is an Igcf_Pledge. Default true.
Filter Parameters Description
igcf_payment_attempt_before_create $pre, $args Fires before a payment attempt is created. Return WP_Error to block.
igcf_payment_attempt_query_args $args Modify query arguments passed to Igcf_Payment_Attempt_Service::query().
igcf_payment_attempt_statuses $statuses Default: pending, succeeded, failed.
igcf_payment_attempt_transitions $transitions Default: pending → [succeeded, failed].
igcf_payment_attempt_before_{$new_status} $pre, $attempt_id, $actor_id Pre-transition gate. Return WP_Error to block.
igcf_payment_attempt_failure_codes $codes The registry of valid failure codes (card_declined, insufficient_funds, expired_card, processing_error, network_error, authorization_expired, campaign_failed, payment_abandoned, pledge_canceled). Core stamps pledge_canceled on every still-open attempt when its pledge is cancelled.
Filter Parameters Description
igcf_refund_query_args $args Modify query arguments passed to Igcf_Refund_Service::query().
igcf_refund_statuses $statuses Default: pending, succeeded, failed.
igcf_refund_transitions $transitions Default: pending → [succeeded, failed].
igcf_refund_before_{$new_status} $pre, $refund_id, $actor_id Pre-transition gate. Return WP_Error to block.
igcf_refund_reasons $reasons The registry of valid refund reasons (requested_by_customer, duplicate, fraudulent, campaign_failed, dispute_lost, goodwill, chain_reorg).
igcf_refund_failure_codes $codes The registry of refund failure codes (code => label) shown against a failed refund. Ships empty from core — core writes no refund failure code of its own; gateway add-ons add theirs. Mirrors igcf_payment_attempt_failure_codes.

Refusals Igcf_Refund_Service::create() returns

Section titled “Refusals Igcf_Refund_Service::create() returns”

Two WP_Error codes were added in 0.22.0, both raised before any row is written:

  • igcf_payment_attempt_not_refundable — the target attempt has not succeeded. A refund carrying a gateway_reference is admitted anyway and flagged with a note in the audit log, because a gateway reporting a refund means real money moved and refusing it would destroy the only record of it.
  • igcf_refund_partial_not_attributable — a partial refund with no gateway_reference, against an attempt charged more than its pledge. Core cannot say which of those minor units were pledge money and which were voluntary additions, so it declines rather than guess. Refund in full, or anchor the refund with a gateway reference.

Igcf_Refund_Service::create() runs its budget check and insert inside a transaction. If it wrongly believes none is open it issues START TRANSACTION, which on MySQL implicitly commits whatever the caller had open — silently ending someone else’s transaction on a money path. These two filters decide what it believes.

Filter Parameters Default Description
igcf_db_in_transaction $in_transaction null Declare whether a transaction is already open on this connection. Return true before calling Igcf_Refund_Service::create() from inside your own transaction and it will use a savepoint, leaving yours intact; return false to declare none; return null (the default, meaning “no opinion”) to defer to the server. A declaration always wins — a caller that opened a transaction knows better than any probe. Read through Igcf_Refund_Service::in_transaction().
igcf_db_server_reports_transaction_state $reports true on MariaDB, false elsewhere Whether the database server can answer for itself. MariaDB exposes @@in_transaction; MySQL has no equivalent, so core assumes nothing is open rather than guessing. Server flavour is detected once per request.

These filters give gateway and fee add-ons their composition points. Core defines the contracts; the fee/net filters below are documented seams that core does not consume itself (the Platform Fees and gateway add-ons apply them).

Filter Parameters Default Description
igcf_pledge_amount_to_charge $amount, $pledge the pledge amount The amount a payment attempt should charge. Fee Recovery raises this to add a backer-paid cover. Consumed by core on every attempt create.
igcf_payment_attempt_application_fee_components $components, $attempt empty array The application fee broken into named parts, array<string,int> in minor units (e.g. [ 'commission' => 500, 'tip' => 100 ]). Each add-on contributes one distinct key — Platform Fees adds commission, Contributions adds tip (a callback returns e.g. $components['tip'] = 100;) — so callback priority is cosmetic. Core normalises on read (keys through sanitize_key(), values through max( 0, (int) )), and the sum equals the scalar igcf_payment_attempt_application_fee. Resolve it with Igcf_Payment_Attempt_Service::get_application_fee_components() rather than calling apply_filters() yourself.
igcf_payment_attempt_application_fee $fee, $attempt the sum of the named components above (0 when there are none) The platform’s cut, in minor units, for gateway-aware charging. A callback must be additive — returning a bare literal clobbers every contributed component. Core clamps the result to max( 0, (int) ).
igcf_payment_attempt_settles_application_fee $settles, $attempt false Whether a gateway will actually settle this attempt’s application fee at capture. Answered by a split-capable gateway add-on for the attempts it owns — it is a claim about the gateway, not about configuration. Platform Fees reads it to decide whether to contribute a commission and whether to record a charge row, so on an install with no split-capable gateway the default false keeps commission entirely inert. Resolve it with Igcf_Payment_Attempt_Service::settles_application_fee() rather than calling apply_filters() yourself.
igcf_projected_charge_context $defaults, $context settles_application_fee: false, components: [] The attempt-free, campaign-keyed sibling of the two filters above, so checkout can ask “what would a charge look like?” before any Igcf_Payment_Attempt row exists. $context carries campaign_id (int), pledge_amount (int, minor units), payment_method (string) and currency (string, ISO 4217). Returns array{settles_application_fee:bool, components:array<string,int>}. Priority is load-bearing here (unlike the components seam): a gateway add-on sets settles_application_fee first at a low priority, then Platform Fees (e.g. igcf-fees::project_commission) adds components['commission'] only when the share settles — settlement must resolve before commission is added. Resolve it with Igcf_Payment_Attempt_Service::projected_charge_context().
igcf_payment_attempt_processing_fee $fee, $attempt 0 What the payment processor kept out of this attempt, in minor units. Exactly one gateway answers per attempt: a callback MUST check $attempt->payment_method first and return the incoming value untouched for an attempt that is not its own, or it will overwrite a foreign gateway’s figure. Core clamps to max( 0, (int) ) and consumes the result — it is subtracted from the igcf_payment_attempt_net_to_creator default below. Resolve it with Igcf_Payment_Attempt_Service::get_processing_fee().
igcf_payment_attempt_net_to_creator $net, $attempt the attempt amount minus the processing fee The net to the creator after add-on cuts, for reporting. Per-attempt; for the per-pledge equivalent that display surfaces actually render through, use igcf_pledge_net_amounts below. Since 0.22.0 the result is no longer floored at zero and can be negative — a fully refunded card payment leaves it under zero because the processor keeps its fee. It is computed before refunds and is a display figure, not a payout basis.
igcf_pledge_net_amounts $net, $ids map of pledge id → gross − refunded The per-pledge net-to-creator seam. $net is an array keyed by pledge ID; an absent key means no money flowed for that pledge, and listeners must preserve that (do not add keys). Applied in two places: the batch read Igcf_Pledge_Service::get_net_for_pledges() that list screens and exports use, and the single-pledge render read behind the wp-admin pledge detail page — so one deduction reaches every creator- and admin-facing net figure consistently. A listener must not floor its answer at zero: the surfaces that render it now show a signed figure. Not applied to backer-facing figures, which render the backer’s own gross − refunded.
igcf_pledge_processing_fees $fees, $pledge_ids empty array The batched, per-pledge sibling of igcf_payment_attempt_processing_fee, so a reconciliation surface can show the fee beside the net rather than only their difference. $fees is a map of pledge ID → minor units; $pledge_ids is a sanitized list of positive IDs. Same one-answerer rule. Absence is not zero: a callback must not add a key for a pledge it has no settled figure for, because callers render an empty cell for an absent key and 0.00 for a present zero. Read by the wp-admin and creator pledge exports through Igcf_Pledge_Service::get_processing_fees_for_pledges().
igcf_payment_attempt_operator_custody $custody, $pledge, $payment_method ! igcf_pledges_go_to_creator() Whether the operator holds a new payment attempt’s money. Answered by the gateway or platform add-on that owns the payment method — check $payment_method first and return $custody untouched for methods you do not own. Applied exactly once, at attempt-create time, and stamped on the row; it is never re-derived on read, so answer from durable facts rather than a setting that could change later. Core casts the result to a definite bool.
igcf_payment_attempt_operator_still_holds $still, $attempt the custody stamp above Whether the operator is holding this payment’s money right now. The stamp records that the operator was holding it, which never stops being true; this answers the current state, which stops being true once a payout covers the payment. An answerer MUST guard with $attempt instanceof Igcf_Payment_Attempt before using the second argument, so a one-argument dispatch degrades rather than fatals. Core reads it to decide whether the pledge statement’s Net row says owed or received. Resolve it with Igcf_Payment_Attempt_Service::operator_still_holds().
igcf_pledge_breakdown_components $rows, $context seeded with the canonical pledge row The line-item rows behind a pledge’s money breakdown, produced by the Igcf_Pledge_Breakdown service. Contributors append rows shaped array{key:string, label:string, amount:int, order:int} (amount in integer minor units, never a formatted string); Contributions adds all three of its rows here — cover_commission (order 200), cover_processing (400) and tip (500) — through the one callback, on the projected branch and the recorded-attempt branch alike (e.g. igcf-contributions::contribute_components). $context carries source ('attempt' or 'projection'), campaign_id, pledge_id, pledge_amount, currency, and — when source is 'attempt' — the attempt object; a callback that only understands one branch should return $rows untouched for the other. Core owns the canonical pledge row: a filter may reorder or relabel it, but its amount is forced back to the authoritative pledge amount and the row is restored if a filter drops it, so the total is always pledge + Σ components.
igcf_refund_proportional_fee_reversal $reversal, $refund 0 A proportional fee clawback computed by Platform Fees.
igcf_payment_methods $map offline + registered gateways The registry of payment methods (id => label). Gateway add-ons register themselves here.

These let add-ons (e.g. Creator Controls) relax the admin-only mutation abilities to creators under their own policy gating.

Filter Parameters Description
igcf_can_record_offline_payment $can, $pledge_id, $user_id Override who may record an offline payment.
igcf_can_cancel_pledge $can, $pledge_id, $user_id Override who may cancel a pledge (backer-owner is allowed by default).
igcf_can_issue_refund $can, $payment_attempt_id, $user_id Override who may issue a refund.
Filter Parameters Description
igcf_pledge_form_args $args, $igcf_args Modify the arguments passed to the pledge form template.
Filter Parameters Description
igcf_checkout_args $args Modify the arguments passed to the checkout template.
igcf_checkout_pre_submission_error $error, $post_data, $campaign_id Refuse a checkout submission before anything is created. Fires after nonce verification and input sanitisation but before identity is resolved, so a refusal creates no pledge, no payment attempt and no guest WordPress account. $error defaults to null. $post_data is the raw $_POST array — callbacks must unslash and sanitize anything they read. $campaign_id is the campaign being pledged to. Return contract: a non-empty string halts the submission (core re-renders the review step with that string as an alert notice); a null, empty-string, or non-string return proceeds unchanged. Contributions uses it (e.g. igcf-contributions::refuse_stale_total) to refuse when the disclosed igcf_total_shown no longer matches the recomputed total.
igcf_checkout_payment_method $payment_method, $post_data, $campaign_id Filter the payment method gateway add-ons want to claim from the backer’s checkout POST. $payment_method is the sanitized value from $_POST['igcf_payment_method'] (when the field is absent Core defaults it to the first gateway available for the campaign). $post_data is the raw POST array (nonce-verified by Core before the filter runs). $campaign_id is the campaign being pledged to. Return the gateway id Core should record on the new pledge. A return that is not a registered gateway id is treated as “no opinion” and discarded in favour of the backer’s own submitted value; a registered id is a real claim. Whichever value wins must be available for the campaign (see campaign-aware availability) — if it is not, Core refuses the pledge and re-renders the checkout review step with a notice, rather than substituting a different method. See Registering a Payment Gateway.
igcf_checkout_identity_html $default_html, $context Wrap or fully replace the rendered identity section HTML on the pledge review step. The filtered string is echoed as-is — add-ons that mutate the markup own their own escaping (the default $default_html passed in is fully escaped). $context has the same shape as the igcf_checkout_identity_before action.
igcf_gateway_available_for_campaign $available, $gateway_id, $campaign_id Older yes/no form — use igcf_gateway_unavailable_reasons in new code. Fires only for an enabled gateway that has no reasons against it so far, with $available always true. Returning false removes the gateway from the campaign; returning true never adds one back. A gateway removed here is shown to administrators on the campaign’s page as hidden by another plugin, with no reason given. Checkout hides it and refuses a submission that asks for it rather than quietly substituting another (ADR-043).
igcf_pledge_requires_shipping $default, $context Override whether a pledge in a given context requires a shipping address. $default reflects the per-tier _igcf_requires_shipping meta. $context is an array carrying reward_level_id (int) and campaign_id (int). Useful for region- or add-on-driven overrides.
igcf_pledge_shipping_field_schema $fields Modify the shipping field schema. $fields is an array of field definitions; each entry has key (string), label (string), required (bool), and autocomplete (string). Return value falls back to the defaults if not an array.
igcf_pledge_shipping_address $decoded, $pledge_id Filter a decoded shipping address on read. $decoded is the JSON-decoded associative array keyed by schema field key. Useful for redaction or for layering on data from another source.

igcf_gateway_unavailable_reasons — parameters $reasons, $gateway_id, $campaign_id.

The list of reasons an enabled gateway is not offered on one campaign. It fires for every enabled gateway, including ones whose own get_unavailable_reasons() already returned reasons, so you can add yours alongside. A gateway is offered only when the final list is empty.

Each reason is an array with three string keys:

Key Meaning
code A stable identifier, prefixed with your add-on’s prefix.
message One plain, translated sentence. It is escaped on output, so don’t pass HTML.
fix_url An admin URL where an administrator can fix the problem, or ''.

Add a reason to hide a gateway at checkout and tell the administrator why: the reasons appear in the Payment methods row of the campaign detail page. You can hide a gateway but never put one back: if a gateway already had reasons, an empty list returned here is ignored. Malformed entries are dropped and each key is cast to a string.

add_filter( 'igcf_gateway_unavailable_reasons', function ( $reasons, $gateway_id, $campaign_id ) {
if ( 'offline' === $gateway_id && my_addon_is_card_only( $campaign_id ) ) {
$reasons[] = array(
'code' => 'my_addon_card_only',
'message' => __( 'This campaign only accepts card payments.', 'my-addon' ),
'fix_url' => '',
);
}
return $reasons;
}, 10, 3 );

Read the result through Igcf_Payment_Gateway_Service::explain_availability(). Checkout’s gateway list is built from the same result, so the admin explanation and checkout never disagree.

Filter Parameters Description
igcf_currency $currency Override the site currency code. Receives the stored currency setting. Must return a valid ISO 4217 code.
Filter Parameters Description
igcf_logout_redirect_url $url Rewrite the destination of the dashboard’s logout link. The default value is home_url() with the igcf_logged_out=1 query arg appended (which triggers a one-shot post-logout flash notice on the next page). Return any URL to redirect elsewhere after logout.
Filter Parameters Description
igcf_auth_form_args $args Modify the auth form template arguments.
igcf_registration_fields $errors, $email Add validation rules to the registration form.
igcf_registration_redirect_url $url, $user_id Change the redirect URL after registration.
igcf_auth_context_messages $messages Modify context-specific messages shown on the auth form (e.g., 'pledge' context). Add-ons can register additional context keys.
igcf_registration_role $role, $context, $email Override the role assigned to new users. $context is 'pledge' or empty. Core’s default is 'igcf_backer' (a direct-mode install has no campaign-creator role). Add-ons register their own callbacks at a later priority to apply KYC, approval gates, or alternate role logic — Ignition Platform Mode uses this seam to assign the campaign-creator role to organic sign-ups when public campaign creation is enabled.
igcf_can_create_campaign $can, $user_id Gate access to the campaign-creation form per-user. Returned value is (bool)-cast before branching, so malformed returns fail closed. Scoped to create mode only — editing existing campaigns is unaffected.
igcf_welcome_set_password_url $set_password_url, $user, $key Filter the set-password URL embedded in the branded welcome email. $user is a WP_User; $key is the reset key. Useful for tracking parameters or routing through a custom set-password surface.
Filter Parameters Description
igcf_account_tab_sections $sections Register, remove, or reorder sections in the dashboard Account tab. $sections is an associative array keyed by section ID; each entry has label (string) and template (string — resolved via igcf_get_template() relative to public/views/). Default sections: profile, email, password, notifications, privacy.
igcf_notification_categories $categories Register additional notification toggles for the Account → Notifications section. $categories is an associative array keyed by category ID; each entry requires label, description, group ('backer', 'creator' or 'admin'), and email_types (array of email IDs this toggle controls). The page shows each group only to people with the permission Igcf_Notification_Category_Registry::get_group_capabilities() maps it to (igcf_create_pledge, edit_igcf_campaigns, igcf_staff), and its save ignores switches from a group the person can’t see. Categories in any other group are not shown on that page and keep their stored state.
igcf_password_reset_url $reset_url, $user, $key Filter the password-reset URL embedded in the branded password-reset email. $user is a WP_User; $key is the reset key. Useful for appending tracking parameters or routing through a custom reset surface.
Filter Parameters Description
igcf_sanitize_settings $sanitized, $input Modify settings after sanitization.
igcf_is_backer_list_enabled $enabled Override whether the backer list is shown on campaign pages.
igcf_is_guest_checkout_enabled $enabled Override whether guest checkout is available during the pledge flow.
igcf_is_terms_acceptance_required $required Override whether terms and conditions acceptance is required.

igcf_operator_settings — parameter $map.

Declares which keys of a settings option an operator may change. Every key you don’t list stays administrator-only. Return the map with your entry added:

add_filter( 'igcf_operator_settings', function ( $map ) {
$map['my_addon_settings'] = array(
'group' => 'my_addon_settings_group', // The group you passed to register_setting().
'keys' => array( 'notice_*', 'max_items' ),
'addon' => 'my-addon', // Your add-on's catalog slug.
);
return $map;
} );
Entry key Meaning
group The settings group the option is registered in.
keys Keys within the option an operator may change. A key ending in * matches by prefix: notice_* covers notice_text.
addon The slug of the add-on that owns the option.

What a declaration does:

  • Opens the group’s save to operators. WordPress’s options.php normally asks for manage_options before saving a group. For a declared group it asks for igcf_manage_settings instead.
  • Guards the save. When someone who has igcf_manage_settings but not manage_options saves, every key not on your list keeps its stored value, even if a hand-crafted request sends a new one. An option registered in a declared group with no declaration of its own is kept whole. Administrators, scheduled jobs and the command line are not affected.
  • Shows your settings page to operators. An add-on whose entry lists at least one key appears on an operator’s Settings → Add-ons tab, and its settings sub-page opens for them. An add-on that declares nothing stays administrator-only.

The guard does the enforcing, so hiding a field is a matter of presentation. To decide whether to render a field, ask Igcf_Settings_Guard::can_edit( $option, $key ). Core declares its own operator keys in igcf_settings through this same filter, at priority 5. An entry that isn’t this shape is dropped. See Registering Add-on Settings.

Filter Parameters Description
igcf_pledges_go_to_creator $to_creator The site-wide answer to “does a pledge go to the platform, or straight to the campaign’s creator?” Core returns false — a plain install collects centrally. Read it through the igcf_pledges_go_to_creator() wrapper rather than calling apply_filters() yourself.
igcf_pledge_routing_consequences $consequences, $to_creator empty array (nothing is lost)

This is the one seam every payment method consults, so an operator answers the question once instead of once per gateway. Ignition Platform Mode answers it from its Who Receives Pledges setting; without that add-on nothing overrides the false.

Gateways branch on it to decide which credentials to ask for and which to use. Core’s Offline method uses it to decide whether a single site-wide instructions field makes sense at all. If you write a gateway that can split a payment, gate that behaviour here:

if ( igcf_pledges_go_to_creator() ) {
// Register the marketplace credential fields, split at capture.
}

Prefer a predicate that also checks your own preconditions — the routing setting being on does not mean your add-on is installed and configured.

If your add-on stops working under one of the two routing choices, say so through igcf_pledge_routing_consequences so the operator is warned before they switch rather than after. Append through the igcf_pledge_routing_consequence() helper, never by hand: add-ons answer one after another, each handed the list built so far, and an add-on that returns something that is not a list would make the next add-on’s append a fatal error — taking the whole settings screen down, not just the broken add-on’s entry. Core’s own cast runs only after every add-on has had its turn, so it cannot prevent that. Pass strings already run through your own __(), since each add-on translates in its own text domain.

add_filter(
'igcf_pledge_routing_consequences',
function ( $consequences, $to_creator ) {
if ( ! $to_creator ) {
return $consequences; // Only the "pledges go to each creator" choice costs us anything.
}
return igcf_pledge_routing_consequence(
$consequences,
__( 'Platform commission', 'my-addon' ),
__( 'commission is taken out of a payment the platform collects, and this choice sends payments straight to the creator', 'my-addon' )
);
},
10,
2
);
Filter Parameters Description
igcf_addon_settings $pages The registry of add-on settings pages, keyed by add-on slug with a render callback as the value. Add-ons register here to surface a settings page under Settings → Add-ons. See Registering Add-on Settings.
igcf_addon_settings_url $urls Absolute settings URLs keyed by add-on slug, for add-ons whose settings screen already lives somewhere else — a payment gateway’s own screen under the Payments tab, say. Use this instead of igcf_addon_settings when you do not want a second, near-empty page under Settings → Add-ons. The value must be an absolute http/https URL; a relative path or another scheme is dropped rather than rendered as a broken link. A callback registered for the same slug via igcf_addon_settings wins.
igcf_addons_catalog $catalog The curated catalog of add-ons shown on the Add-ons tab. Each entry is an array with slug, name, description, plugin_file, download_url, version, and optional hidden. Add-ons (or a remote source) can inject entries; a hidden entry stays registered for slug resolution but is omitted from the catalog listing.

The creator dashboard’s per-campaign export (one row per pledge) and the wp-admin Pledges screen’s two exports (per-pledge across campaigns, and aggregated per-backer with status pivot) each expose their own column-list and row filters.

Filter Parameters Description
igcf_creator_pledge_export_columns $columns, $campaign_id Modify the column headers for the creator dashboard’s pledge CSV export.
igcf_creator_pledge_export_row $row, $pledge, $backer, $campaign_id Modify a single row in the creator dashboard’s pledge CSV export. $pledge is an Igcf_Pledge, $backer is a WP_User or null if deleted.
Filter Parameters Description
igcf_admin_pledge_export_columns $columns Modify the column headers for the admin pledge CSV export (filter-aware, one row per pledge across campaigns).
igcf_admin_pledge_export_row $row, $pledge, $backer, $campaign, $creator Modify a single row in the admin pledge CSV export. $pledge is an Igcf_Pledge, $backer and $creator are WP_User or null, $campaign is a WP_Post or null.
Filter Parameters Description
igcf_admin_backer_export_columns $columns Modify the column headers for the admin backer CSV export (aggregated per (backer, currency) with a per-status pivot).
igcf_admin_backer_export_row $row, $agg, $backer Modify a single row in the admin backer CSV export. $agg is a stdClass carrying the aggregated counts and totals returned by Igcf_Pledge_Service::query_backer_aggregates(); $backer is a WP_User or null if the user has been deleted.
igcf_pledge_backer_aggregates_args $args Modify the query args passed to Igcf_Pledge_Service::query_backer_aggregates().
Filter Parameters Description
igcf_archive_campaign_args $card_data, $post_id Modify campaign card data before rendering in the archive grid.
igcf_archive_campaign_empty_message $message, $has_filters Customize the “no campaigns found” message.
igcf_archive_campaign_query_vars $vars Register additional query vars for archive filtering.
igcf_archive_campaign_sort_options $options Modify sort options in the archive filter dropdown.
igcf_archive_campaign_default_sort $default Change the default sort order (default: 'ending_soon').
igcf_archive_campaign_filter_args $args Modify template arguments for the filter form.
igcf_archive_campaign_status_options $options Modify status options in the archive filter dropdown.
igcf_archive_campaign_card_image_size $size Change the image size for campaign cards (default: 'medium').
Filter Parameters Description
igcf_campaign_thumbnail $html, $campaign_id, $size Modify campaign thumbnail HTML output.
igcf_campaign_placeholder_svg $svg Modify the SVG placeholder for campaigns without a featured image.

These modify the frontend dashboard shell (nav, account, pledges) and the per-campaign management view that core renders.

Filter Parameters Description
igcf_dashboard_args $args Modify arguments passed to the dashboard template.
igcf_dashboard_detail_args $args, $campaign_id Modify arguments for the campaign detail view.
igcf_dashboard_detail_sections $sections, $campaign_id Modify sections in the campaign detail view.
igcf_dashboard_pledge_detail_args $args, $pledge_id Modify arguments for the pledge detail view in the dashboard.
igcf_dashboard_pledge_row_args $row, $pledge Modify one backer-dashboard pledge-list row’s template args — for example append link actions (an actions array of entries with url, label, and optional class) or override the status label. $pledge is the Igcf_Pledge model for that row (note the detail filter above passes the pledge ID instead).
igcf_dashboard_campaign_pledge_row_args $row, $pledge The creator-table counterpart to igcf_dashboard_pledge_row_args. Core leaves overflow_actions empty; an add-on may append entries shaped array( 'action' => string, 'label' => string ) to put per-row actions such as “Mark payment received” on a creator’s campaign-pledges table.
igcf_dashboard_subview_args $args, $subview, $campaign_id Modify arguments for any dashboard subview template.
Filter Parameters Description
igcf_is_frontend_only_user $is_frontend_only, $user Filter whether a user is confined to the frontend (blocked from wp-admin). $user is a WP_User. Core returns false for everyone by default; add-ons that register a frontend-only role (such as Ignition Platform Mode, whose campaign creators live entirely on the frontend) filter it to include their users.
igcf_creator_redirect_url $url, $user_id Change the redirect URL sent to a frontend-only user who lands on a wp-admin request.
Filter Parameters Description
igcf_update_display_data $data, $update_id Modify data used to display a campaign update.
igcf_update_post_type_args $args Modify post type registration arguments for updates.
igcf_determine_update_status $status, $campaign_id, $update_id Override the status applied to a campaign update on submission. Default: 'publish' (direct mode publishes updates immediately). Add-ons route updates to pending — for example, Ignition Platform Mode sends them for review.
Filter Parameters Description
igcf_update_admin_columns $columns Modify columns in the admin update list table.
igcf_update_row_actions $actions, $post Modify row actions in the admin update list.
igcf_update_bulk_actions $actions, $current_status Modify bulk actions for updates by status.
Filter Parameters Description
igcf_campaign_grid_query_args $args, $atts Modify the WP_Query arguments used by the Campaign Grid block before the query runs. $atts is the resolved block/shortcode attribute array.
igcf_campaign_featured_resolved_id $resolved_id, $atts Override the campaign post ID resolved by the Featured Campaign block. Runs after auto/manual resolution but before the hero renders — return 0 to suppress output.
Filter Parameters Description
igcf_emit_social_meta $emit, $campaign_id Return false to suppress the bundled og:* meta tags on a single campaign permalink. Useful when a dedicated SEO plugin (Yoast, Rank Math, SEOPress, etc.) is already emitting its own social meta. Default: true.
Filter Parameters Description
igcf_better_sharing_is_available $available Override whether the Better Sharing integration is available. Defaults to the result of function_exists( 'better_sharing_render' ). Useful as a kill-switch during incident response or to force-disable the integration in tests.
igcf_better_sharing_is_installed $installed Override whether the Better Sharing plugin is detected as installed. Drives the install-vs-activate state of the Sharing settings panel.
igcf_better_sharing_is_active $active Override whether the Better Sharing plugin is detected as active. Drives the activate-vs-ready state of the Sharing settings panel.
igcf_sharing_locations $locations Modify the Better Sharing location registry. $locations is keyed by slug; each entry is [ label, default_enabled, view_style ] where view_style is 'compact' or 'inline'. Add-ons can register new sharing surfaces here.
igcf_sharing_render_args $render_args, $location, $campaign_id Filter the args passed to better_sharing_render() for an Ignition sharing location. Useful for appending tracking parameters to the share URL, overriding the UI template, or customizing the email pre-fill per location.
Filter Parameters Description
igcf_email_enabled $enabled, $email_id Override whether a specific email type is enabled.
igcf_email_subject $subject, $email_id, $data Modify the email subject before merge tags are resolved.
igcf_email_body $body, $email_id, $data Modify the rendered email body before the HTML layout is applied.
igcf_email_html $html, $email_id, $data Modify the final HTML email after the layout wrapper is applied.
igcf_email_data $data, $email_id Inject additional data into the email context before sending.
igcf_email_recipients $recipients, $email_id, $data Modify the recipient list for an email. Add CC addresses or exclude unsubscribed users.
igcf_email_before_send $args, $email_id, $data Intercept wp_mail() arguments before the email is sent. Useful for email queuing add-ons.
igcf_email_preview_data $sample_data, $email_id Customize the sample data used for email previews in the admin.
Filter Parameters Description
igcf_rest_campaigns_query_args $args, $request Modify WP_Query arguments for the campaign collection endpoint.
igcf_rest_prepare_campaign $response, $post, $request Filter campaign data before it is returned in a REST response. $response is a WP_REST_Response.
igcf_rest_pre_insert_campaign $prepared, $request Filter campaign data prepared for database insertion or update.
igcf_rest_prepare_update $response, $post, $request Filter update data before it is returned in a REST response. $response is a WP_REST_Response.
igcf_rest_prepare_pledge $response, $pledge, $request Filter pledge data before it is returned in a REST response. $response is a WP_REST_Response, $pledge is an Igcf_Pledge.
igcf_rest_prepare_payment_attempt $response, $attempt, $request Filter payment-attempt data before it is returned in a REST response. $attempt is an Igcf_Payment_Attempt.
igcf_rest_prepare_refund $response, $refund, $request Filter refund data before it is returned in a REST response. $refund is an Igcf_Refund.