Charitable Documentation

Learn how to make the most of Charitable with clear, step-by-step instructions.

Disable the Auto-Created Single Campaign Page

When you create a campaign in Charitable, WordPress automatically gives it its own public URL at /campaigns/[campaign-slug]/. That happens because Charitable registers campaigns as a public custom post type, which is what allows search engines and direct links to reach a campaign’s own page.

That works well if you want every campaign to have its own landing page. But if you only want donors to reach your campaign through a specific page on your site, for example a single /donate/ page where you’ve embedded the campaign with the shortcode or block, the auto-created URL becomes a second, unwanted entry point.

This page covers two ways to remove that entry point. Both options leave your campaign embed working exactly as before, because the embed reads the campaign record directly from the database. It does not rely on the single campaign URL being publicly accessible.

When you’d use this

  • You embed your campaign on a dedicated donate page and want that to be the only place donors land.
  • A campaign URL is showing up in search results or being shared, and you want to send those visitors to your donate page instead.
  • You only run one campaign at a time and the single-campaign URL is redundant.

Why the URL exists in the first place

Charitable registers campaign as a WordPress custom post type with public => true and publicly_queryable => true. Those two flags are what tell WordPress to generate a URL for each campaign and serve it through the single-post template.

The URL pattern is [your-permalink-front]/campaigns/[campaign-slug]/. If your WordPress permalink structure has a front, for example /news/%postname%/, the campaign URL becomes /news/campaigns/[campaign-slug]/. That’s standard WordPress behavior, not a Charitable setting.

There’s no built-in toggle in the Charitable settings to disable the single campaign URL. The two snippets below are the supported ways to turn it off.

Option 1: Redirect single campaign URLs to your donate page (recommended)

This is the option to choose if there’s any chance a campaign URL has already been shared, indexed, or linked from elsewhere. Visitors who land on the campaign URL get sent to your donate page with a 301 redirect, which search engines respect over time.

Add this snippet using a code snippets plugin (such as WPCode) or your child theme’s functions.php:

add_action( 'template_redirect', function() {
    if ( is_singular( 'campaign' ) ) {
        wp_safe_redirect( home_url( '/donate/' ), 301 );
        exit;
    }
} );

Change /donate/ to whatever URL you want to send visitors to. After saving the snippet, open your campaign’s URL in a private browser window to confirm it now lands on your donate page.

Option 2: Make the campaign post type non-public

This option turns off the single campaign URL entirely. Anyone visiting /campaigns/[slug]/ will see a standard WordPress 404. Use this if you’d rather the URL not exist at all than redirect.

Add this snippet using a code snippets plugin or your child theme’s functions.php:

add_filter( 'charitable_campaign_post_type', function( $args ) {
    $args['public']              = false;
    $args['publicly_queryable']  = false;
    $args['exclude_from_search'] = true;
    return $args;
} );

After adding the snippet, flush your permalinks: go to Settings > Permalinks in your WordPress admin and click Save Changes. You don’t need to change anything on that screen. The act of saving regenerates the rewrite rules so the campaign URL stops resolving.

What happens to the campaign embed

Both options leave the campaign embed untouched:

  • The [charitable_campaign] shortcode keeps rendering on your donate page.
  • The Charitable campaign block keeps rendering on your donate page.
  • The campaign’s title, story, goal, and donation form all keep loading.
  • New donations still attach to the campaign and update its progress.

The embed reads the campaign post directly by ID, so it doesn’t matter whether the campaign’s own URL is public, redirected, or returning a 404.

Which option should you pick?

Use Option 1 (redirect) if…Use Option 2 (non-public) if…
A campaign URL might already be shared, indexed, or linked from somewhere.The campaign URL has never been shared and isn’t in search results.
You want a graceful handoff for any visitor who finds the old URL.You’d prefer the URL not to resolve at all.
You want search engines to follow the 301 and drop the old URL over time.You don’t care about preserving the URL’s search presence.

In most cases, Option 1 is the safer choice because it handles both new visitors and anyone who already has the URL.

Frequently asked questions

Will this affect how donations are tracked?

No. Donations are attached to the campaign record itself, not the URL. Whether someone donates through your embedded form on /donate/ or (before the redirect) the auto-created campaign page, the donation lands on the same campaign and counts toward the same goal.

Does this remove the campaign from the WordPress admin?

No. The campaign still shows up in Charitable > Campaigns in your admin. You can edit it, archive it, see its donations, and so on. Only the public URL changes.

Can I do this for one campaign but not others?

Yes – narrow the redirect by checking the specific campaign ID:

add_action( 'template_redirect', function() {
    if ( is_singular( 'campaign' ) && get_queried_object_id() === 123 ) {
        wp_safe_redirect( home_url( '/donate/' ), 301 );
        exit;
    }
} );

Replace 123 with the ID of the campaign you want to redirect. Other campaigns will continue to use their normal URLs. (Option 2 is all-or-nothing because it changes the post type registration.)

What about the campaign archive page?

Charitable already has the campaign archive turned off (has_archive => false), so visiting /campaigns/ on its own doesn’t render a Charitable archive. You don’t need to do anything extra to disable it.


Developer reference

The rest of this page is for developers who want more control over the campaign post type registration.

The filter

charitable_campaign_post_type runs on init (priority 5) just before register_post_type() is called. It receives the full arguments array used to register the campaign post type, so you can change any of these:

ArgumentDefaultEffect
publictrueMaster switch for front-end visibility and admin UI.
publicly_queryabletrueWhether /campaigns/[slug]/resolves to a single template.
exclude_from_searchfalseWhether /?s= searches include campaigns.
has_archivefalseThe campaign archive is already off by default.
rewritearray( 'slug' => 'campaigns', 'with_front' => true )The URL slug for single campaigns.
show_in_nav_menustrueWhether campaigns can be added to nav menus from Appearance > Menus.

Changing the URL slug instead of disabling it

If you’d rather keep the single campaign page but change its URL prefix, filter the rewrite slug. For example, to change /campaigns/[slug]/ to /fundraise/[slug]/:

add_filter( 'charitable_campaign_post_type', function( $args ) {
    $args['rewrite']['slug'] = 'fundraise';
    return $args;
} );

Flush permalinks after the change (Settings > Permalinks > Save Changes).

Why with_front matters

The default 'with_front' => true means WordPress prepends your permalink front to the campaign URL. If your WordPress permalink structure is /news/%postname%/, your campaign URLs will be /news/campaigns/[slug]/. Set 'with_front' => false to ignore the permalink front:

add_filter( 'charitable_campaign_post_type', function( $args ) {
    $args['rewrite']['with_front'] = false;
    return $args;
} );

Flush permalinks after the change.

How the embed keeps working

The [charitable_campaign] shortcode and the campaign block both resolve to Charitable_Campaign queries that load the post by ID. Those queries use get_post() and direct meta lookups, which are independent of the public and publicly_queryable flags. The flags only control whether the WordPress front-end controller will route a request to the single campaign template. Disabling them does not block PHP code from reading the post.

Hook reference

HookTypeUse it to
charitable_campaign_post_typeFilterModify the arguments passed to register_post_type() for campaigns. Runs on init priority 5.
template_redirectActionFire your redirect after WordPress has parsed the request and chosen a template, but before the template is loaded. Standard WordPress hook.
is_singular( 'campaign' )ConditionalTrue when the current request is a single campaign URL. Use it inside template_redirect to scope the redirect.

Still have questions? We’re here to help!

Last Modified:

What's New In Charitable

View The Latest Updates
🔔 Subscribe to get our latest updates
📧 Subscribe to Emails

Email Subscription

Join our Newsletter

We won’t spam you. We only send an email when we think it will genuinely help you. Unsubscribe at any time!

ambassadors New

🖨️ Introducing Fliers and Posters: Raise Money Away From the Screen!

A lot of peer-to-peer fundraising happens away from a screen: at the finish line of a 5K, on a school noticeboard, in an office kitchen. Charitable Ambassadors 3.4.7 adds 2 printables, a fundraiser flier carrying each fundraiser’s own story and QR code, and a recruitment poster that signs new fundraisers up. Both open as a normal web page and print straight from the browser. Why this is important:

  • 🏁 A flier for every fundraiser: Each one carries that fundraiser’s own photo, story and goal, with a QR code that opens their page rather than your main campaign.
  • 📌 A poster that recruits: It shows “Now Recruiting” above your campaign name with a large QR code that opens your sign-up form, so someone can start fundraising without waiting on a link from you.
  • 🪄 No design tool needed: Both printables render as a normal web page and print from the browser, with no PDF plugin and no designer.
  • 📄 2 flier layouts: Hand out carries the full story for giving to friends and family, and Post up carries a short hook with 5 tear-off tabs for a noticeboard.
  • 🛡️ Off until you switch it on: Fliers stay off after the update until you enable them under Charitable » Ambassadors » Other » Fliers, and only the owner or an administrator can open one.

Check out our announcement here.

Improvement Payments

💸 Introducing Tiered Rates for Fee Relief: Match the Ask to the Gift!

Fee Relief asks your donors one short question at checkout: would you like to cover the processing fee on this gift? Until now that question used a single rate for every donation on a gateway, so a $10 gift and a $500 gift were asked for the same percentage. Fee Relief 1.3.0 lets you set as many donation bands as you like, each carrying its own rate. Why this is important:

  • 🪙 Gentler on small gifts: A fixed transaction cost is a far bigger share of a $10 donation than a $500 one, so bands let you ask for less at the bottom.
  • 🎚️ As many bands as you need: Each band carries its own percentage and its own fixed amount, and the top band runs on with no upper limit.
  • 🛑 An optional ceiling: A Maximum fee field stops any donor being asked for more than a number you choose, however large the gift.
  • 🔌 Set per payment gateway: Stripe can run on four bands while Windcave and Payfast stay on a single rate, because bands belong to a gateway and not to your whole site.
  • 🛡️ Nothing changes until you say so: Your current rates stay exactly as they are until you switch Use Tiered Rates on under Charitable » Settings » Advanced » Fee Relief.

Check out our announcement here.

Donations Improvement

📊 Your Pro Dashboard Can Now Compare, Export, and Score!

Most fundraising dashboards only tell you how much you have raised. Charitable Pro 1.8.19 rebuilds the dashboard and the Reports Overview around the harder questions: whether anything is broken, whether this period beat the last one, and which single change would make the most difference today. Why this is important:

  • 📈 Every figure has a trend: Pick a period and the tiles and the chart move together, with each total shown against the previous period.
  • 🗓️ Charts that stay readable: Short ranges group donations day by day, while longer ranges group by week or month, so a full year reads as a curve instead of a flat line.
  • 🔀 Compare any 2 periods: Not just consecutive ones, so you can ask how this December did against last December. That matters because fundraising is seasonal.
  • 📤 Export the whole summary: Send the full overview out as CSV or PDF, ready for a board pack or a funder report.
  • 🎯 Score your setup for free: Have your fundraising setup scored, so the one change worth making next is the one you can see.

Check out our announcement here.

Feature New

🎟️ Introducing Charitable Events: Sell Tickets Inside Your Campaigns!

Most nonprofits sell event tickets in one tool and collect donations in another, which leaves two sets of reports and a manual match at the end of the year. Charitable Events brings both together, selling tickets through the same donation forms and payment gateways you already run in Charitable. Why this is important:

  • 🎟️ Every ticket is a donation: Ticket sales run through the gateway you already use and count toward the campaign goal, with everything managed under Charitable » Events.
  • 📱 QR check-in from any phone: Each attendee gets their own QR code on the receipt, and volunteers scan at the door through a check-in link that needs no WordPress account.
  • 🧾 Receipts ready for tax time: Give each ticket type a fair market value, and Charitable puts the correct tax-deductible amount on every donor receipt.
  • 📋 Attendee details at checkout: Ask every guest for a meal choice, shirt size, or access needs, with a separate attendee record created for each ticket.
  • 🗓️ Blocks and calendars included: Three editor blocks plus Sugar Calendar and The Events Calendar support put your events where supporters already look.

Check out our announcement here.

ai New

🚀 Unleash AI Power in Charitable!

Your AI assistant can now build, edit, and manage your Charitable fundraising campaigns directly — just by asking. With Charitable Pro adding write support for the WordPress Abilities API, tools like ChatGPT, Claude, and Cursor can handle full administrative actions safely through MCP. Why this is important:

  • 🤖 Campaign creation in plain language: Prompt your assistant with a goal like “Set up a fundraiser for the shelter with a $5,000 goal”, and it builds a real draft campaign complete with suggested donation tiers.
  • 🎨 Instant donation form tweaks: Add custom fields, change button colors, or reorder elements without diving into form settings.
  • 📝 Offline gift logging: Tell your assistant about cash or check gifts, and it will match donor emails and record transactions into your history.
  • 🛡️ Safety and control by default: Write access stays strictly off until turned on in Charitable » Tools » AI MCP, keeping read-only reporting safe by default.
  • 📜 Full audit logging: Every change made by an AI assistant is tracked under Charitable » Tools » Logs, so you always know who (or what) updated your site.

Check out our announcement here.