Charitable Blog

Everything you need to know about Charitable and our team.

AWARE: 30 for 30 campaign banner

An Inside Look at AWARE Whistler’s Unique “30 for 30” Fundraiser (Tutorial)

Last updated on

  • By

AWARE Whistler is a charity committed to protecting the natural environment of Whistler, Canada. It marks its 30th anniversary as an organisation this year and is celebrating the occasion by launching the 30 for 30 Fundraiser.

The goal of the 30 for 30 Fundraiser is to raise $60,000, with $30,000 raised from businesses and $30,000 raised from individual donations.

AWARE are using Charitable’s campaign-driven fundraising approach to power this campaign, with two individual fundraising campaigns set up: one for businesses, and one for individuals.

The challenge

Of course, unique campaigns like this tend to have unique needs, and the 30 for 30 Fundraiser is no exception.

Since one of the two fundraising campaigns is specifically focused on getting donations from businesses, a Company Name field is needed in that campaign’s donation form. Also, when donors are shown on the site (using the Donors shortcode or widget), it’s the company’s name that should be shown — not the name of the person donating.

Thankfully, Charitable’s flexibility is ideally suited for AWARE’s needs. Let’s see how.

Step 1. Add a “Company Name” field

The first thing we need to do is to create a new donation field, using the Donation Fields API.

Let’s look at the code required to achieve that:

/**
 * STEP 1: Register the "Company Name" Donation Field.
 *
 * On the `init` hook, we create a new Donation Field. It has a
 * key of `company_name` (this is how we will reference it later),
 * and it's set up as a required field in the donation form, shown
 * after the `last_name` field.
 */
add_action( 'init', function() {
        /**
         * Add a "Company Name" field.
         */
        $field = new Charitable_Donation_Field(
            'company_name',
            [
                'label' => 'Company Name',
                'data_type' => 'user',
                'donation_form' => [
                    'show_after' => 'last_name',
                    'required' => true,
                ],
                'admin_form' => true,
                'show_in_meta' => true,
                'show_in_export' => true,
                'email_tag' => [
                    'description' => 'The company name',
                ],
            ]
        );

        /**
         * Register the field.
         */
        charitable()->donation_fields()->register_field( $field );
}, 100 );

There’s a bit going on here. First of all, right at the top, we are setting up a function to be run on the init hook. This is the best hook to use any time you want to register a new donation field.

Inside of our function, we create a new Donation Field with the Charitable_Donation_Field object. Let’s take a closer look at that bit:

$field = new Charitable_Donation_Field(
     'company_name',
     [
         'label' => 'Company Name',
         'data_type' => 'user',
         'donation_form' => [
             'show_after' => 'last_name',
             'required' => true,
         ],
         'admin_form' => true,
         'show_in_meta' => true,
         'show_in_export' => true,
         'email_tag' => [
             'description' => 'The company name',
         ],
     ]
 );

What we’re doing here is creating a field with a key of company_name (we’ll need this later on). We have set a label, defined it as a user field, and set up some basic rules for how it should appear in the donation form: right after the last_name field and as a required field.

We’ve also set it up to show in the admin donation form, the donation meta and donations export file. We even told Charitable to create an email tag for it, so we can use it in our donation receipt emails.

Finally, we register this field with the Donation Fields API:

charitable()->donation_fields()->register_field( $field );

Step 2. Only show the “Company Name” field on one campaign

By default, when you set up a donation field, it will show up in every campaign’s donation form. For the “30 for 30” campaign though, AWARE only want the field to appear in the donation form of the Business fundraiser.

Here’s how we achieve that:

/**
 * STEP 2: Only show the field on a specific campaign.
 *
 * We only want the field to show up on a single campaign's
 * form, so we *remove* it from all other campaigns' donation
 * forms.
 */
add_filter( 'charitable_donation_form_user_fields', function( $fields, Charitable_Donation_Form $form ) {
    /**
     * Check the campaign ID of the donation form being
     * shown. If it isn't the one where we want the field,
     * remove the field using the unset() function.
     */
    if ( 123 != $form->get_campaign()->ID ) {
        unset( $fields['company_name'] );
    }

    return $fields;
}, 10, 2 );

The way we solve this problem is by removing the company_name field when we are not showing the Business campaign’s donation form. All the magic happens rights here:

if ( 123 != $form->get_campaign()->ID ) {
     unset( $fields['company_name'] );
 }

In this case, we’re imaging that the Business campaign has an ID of 123. So when we’re looking at the fields in a particular form, we check the ID of the campaign for the form, and if it isn’t 123, we use the unset() function to get rid of our field, referencing to it by the key of company_name, which we set in Step 1.

Step 3. Customise the donor name in the Donors shortcode or widget

Now that we’ve added our Company Name field, all that’s left is for us to use that instead of the donor’s first and last name when showing donations to the Businesses campaign.

Let’s see the code:

/**
 * STEP 3: Use the company name for the donor name.
 *
 * When showing the donor name for a particular donation,
 * check if the donation was to the campaign with our
 * Company Name field. If it was, show the Company Name
 * instead of the individual's name.
 */
add_filter( 'charitable_donor_loop_donor_name', function( $name, $args ) {
    /**
     * Get the Donor object from the argument array.
     */
    $donor = $args['donor'];

    /**
     * Check if there is a Donation object associated
     * with this Donor.
     */
    $donation = $donor->get_donation();

    if ( ! $donation ) {
        return $name;
    }

    /**
     * Get the campaign that received the donation.
     */
    $campaign_id = current( $donation->get_campaign_donations() )->campaign_id;

    /**
     * If this was a donation to our campaign,
     * let's change the donor name.
     */
    if ( 123 == $campaign_id ) {
        $name = $donation->get( 'company_name' );
    }

    return $name;
}, 15, 2 );

First of all, notice that this is set up as a function called on the charitable_donor_loop_donor_name hook. We use this hook since it is shown whenever a list of donors is shown with the Donors widget or shortcode.

Inside the function, we first get the Charitable_Donor object from the $args parameter. We then get the Charitable_Donation object through the $donor->get_donation() method:

/**
 * Check if there is a Donation object associated
 * with this Donor.
 */
$donation = $donor->get_donation();

if ( ! $donation ) {
    return $name;
}

You may wonder why we check whether $donation is set. The reason for this is because sometimes, Charitable_Donor is not set up with a specific donation. One such example is when the Donors widget/shortcode is set up to group multiple donations by the same donor into one — in that case, no Charitable_Donation object is called up, and we will just show the donor’s name.

Therefore, an important caveat of this approach is that this will only work if the Donors widget/shortcode is set up to show each donation individually, instead of grouping multiple donations by the same person.

Moving on, we use the Charitable_Donation object to find out which campaign was donated to, and check if it’s our Business campaign (the one with an ID of 123):

/**
 * Get the campaign that received the donation.
 */
$campaign_id = current( $donation->get_campaign_donations() )->campaign_id;

/**
 * If this was a donation to our campaign,
 * let's change the donor name.
 */
if ( 123 == $campaign_id ) {
    $name = $donation->get( 'company_name' );
}

The last part of this simply checks that the $campaign_id is 123. If it is, we get the company name like this:

$donation->get( 'company_name' );

Note that company_name matches the key of the donation field we registered back in step 1.

And with that, we’re all done!

The complete solution

You can see all the code put together in one place in our Github code library:

https://github.com/Charitable/library/blob/master/tutorials/new-donation-field-plus-customized-donor-name.php

To see it in action – and if you would like to show your support for the important work done by AWARE Whistler – visit the 30 for 30 Fundraiser page on their website.

Final word

If you enjoyed this tutorial and would like to see us write one about a different topic, let us know! You can reach us via email by filling out the form over at our Support page, or leave a comment below.

author avatar
Eric Daams

Disclosure: Our content is reader-supported. This means if you click on some of our links, then we may earn a commission. We only recommend products that we believe will add value to our readers.

Leave a Reply

Your email address will not be published. Required fields are marked *

Get free tips and resources right in your inbox, along with 60,000+ others

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!

Featured Video:

Watch more videos on our YouTube channel.

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!

Integration page builder

Divi Fans Rejoice! Native Divi 5 Campaign Progress Bar Module!

With our new native Divi 5 module, you can anchor your microsites with real-time fundraising stats directly on the visual canvas. Here’s how it works, and why it’s worth turning on today.

Create campaign updates that are VISUAL AND LIVE. You can also:

📊 Campaign Progress Bar: Drop a live progress bar into any Divi 5 layout and show goal progress in real time.

🎨 Deep styling controls: Easily customize the bar and track color, height, and radius to match your brand perfectly.

👁️ Visual Builder ready: Configure and preview everything directly on the Divi canvas as a first-class module.

🔁 Identical rendering: The same exact engine powers this module, meaning consistent design without legacy shims.

✅ Faster launches: Never leave the Divi 5 interface to configure shortcodes or guess how your goal labels will look.

Learn more here.

author avatar
Eric Daams
Integration page builder

👉🏻 New in Charitable: Native Elementor Widgets for Seamless Campaign Building

With native Elementor widgets, you design donation campaigns right alongside the rest of your page without touching code. Here’s how it works, and why it’s worth turning on today.

Create fundraising pages that are VISUAL, NATIVE, AND SHORTCODE-FREE. You can also:

⚡ Mini Donation: Add a compact, high-converting donation widget with preset amounts and full color control.

⏳ Campaign Countdown: Build urgency for a deadline-driven appeal, complete with optional confetti when the goal is hit.

📣 Donation Feed: Prove momentum by showing visitors the social proof of real people giving right now.

🏆 Donor Leaderboard: Celebrate top supporters with gold, silver, and bronze styling to spark friendly giving.

🖼️ Campaign Showcase: Feature multiple campaigns in a landing page grid or carousel, with search, filters, and badges.

Learn more here.

author avatar
Eric Daams
Addon New

🗒️ Custom Receipts… New Addon!

With Custom Receipts, you decide which page your donors see, on every campaign. Here’s how it works, and why it’s worth turning on today.

Left side shows a donation receipt with donation number, date, total, and payment method for a  gift to Anywhere, titled 'One Family Gets Clean Water For A Week.'

Create receipts that are CUSTOM TO THE DONOR OR CAMPAIGN. You can also:

📅 Year-end appeal: Reinforce the goal and invite donors to share while momentum is high.

🎗️ Memorial or tribute campaign: Give a gentle, respectful thank-you that fits the moment.

💎 Major gifts: Show a special message only to donors who give above a threshold.

🔁 Recurring growth: Invite one-time donors to become monthly supporters right on the receipt.

🌍 Global campaigns: Surface a country-specific note, like a Gift Aid reminder, only where it applies.

Learn more here.

author avatar
Eric Daams
New templates

🤩 New Beacon Campaign Templates w/ “Hero” Block!

With the new Beacon Campaign Templates for Charitable Pro, you can launch a stunning, full-width fundraising page that instantly captures visitor attention above the fold.

Fundraising page header for Save Maple Grove Park with a donation widget and a small square photo of a sunlit tree thumbnail on the left.

🔦 Above-the-Fold Impact: Lead with a full-width hero image, your logo, and your goal with a donation widget locked right on top of the banner so your ask and momentum register instantly without scrolling.

📐 Two Flexible Layouts: Choose between a structured two-column layout for side-by-side storytelling and supporting details, or a clean one-column view designed for uninterrupted long-form narratives.

⚡ All-in-One Hero Field: Powered by the new Campaign Hero field, bringing background media, live progress bars, custom donation amounts, and recurring giving tabs together into a single cohesive block that can be dropped into any layout.

🎨 Automatic Theme Matching: The hero banner and donation widget automatically inherit your campaign theme’s button and accent colors, ensuring your entire presentation stays beautifully on-brand without touching a line of CSS.

Learn more here.

author avatar
Eric Daams
donation form Feature New

📝 Donation Form Block: Embed a Working Donation Form Anywhere

With the new Donation Form Block for Charitable Pro, you can drop a fully working donation form directly onto any page or post in the WordPress block editor. No redirects, no page reloads, and zero friction between reading your story and making a contribution.

📝 Drop Forms Anywhere: Place a working form directly onto your homepage, inside a story-driven blog post, on a dedicated landing page, or within a campaign announcement.

🎯 Dynamic Campaign Binding: Easily choose a specific campaign from the block sidebar or set it to automatically bind to whichever campaign is currently being viewed.

📐 Full vs. Minimal Form Views: Switch between a full layout or a compact minimal view to perfectly fit sidebars, narrow columns, or wide landing pages.

🎨 Scoped No-Code Styling: Customize typography, container spacing, border radius, amount buttons, and accent colors independently for every form instance without touching a line of CSS.

Learn more here.

author avatar
Eric Daams