\WP_Stager_Integration\Component::render_event_tickets(): void

Description

Render the event tickets component.

If no ticket shops have been configured, this method will render all of the event's ticket groups with external links to the Stager-hosted ticket shop / membership sales pages. If ticket shops have been configured, this method will either render the "Advanced" event widget or a link to the full-screen "Basic" widget on the order page, depending on the integration type of the ticket shop.

Returns:

void

Information

Fileclass-component.php line 267

Full Code

/**
 * Render the event tickets component.
 *
 * If no ticket shops have been configured, this method will render all of the event's ticket groups with external links to
 * the Stager-hosted ticket shop / membership sales pages. If ticket shops have been configured, this method will either
 * render the "Advanced" event widget or a link to the full-screen "Basic" widget on the order page, depending on the integration type of the ticket shop.
 *
 *
 * @return void
 */
public static function render_event_tickets() {

    // Get data
    $event               = (array) (Event::get_single_event_data() ?: array());
    $event_ticket_groups = (array) ($event[ 'ticketGroups' ] ?? array());

    // Bail if event has no tickets added
    if ( ! $event_ticket_groups ) {
        return;
    }

    $event_end           = (string) ($event[ 'programEndAt' ] ?? '');
    $event_status        = (string) ($event[ 'status' ] ?? '');
    $ticket_shop_id      = (string) ($event[ 'shopId' ] ?? '');
    $event_end_timestamp = (int) ($event_end ? strtotime( $event_end ) : 0);
    $now                 = (int) wp_date( 'U' );
    $heading_html        = '<h2 class="wpstager-event-section__heading">' . esc_html__( 'Tickets', 'wp-stager-integration' ) . '</h2>';

    // Bail if event is not yet confirmed
    if ( Options::STAGER_EVENT_STATUS_CONFIRMED !== $event_status ) {
        return;
    }

    // Bail if event has finished
    if ( ! $event_end_timestamp || $now > $event_end_timestamp ) {
        return;
    }

    // Render heading
    echo wp_kses_post( $heading_html );

    // Get ticket shop data
    $ticket_shop                  = Options::has_ticket_shops() ? Ticket_Shop::get_ticket_shop( $ticket_shop_id ) : null;
    $ticket_shop_integration_type = (string) ($ticket_shop ? $ticket_shop->get_integration_type() : '');

    // Render "No tickets" message if event has no tickets, then bail
    if ( ! $event_ticket_groups ) {
        self::render( 'event-message-no-tickets', 'template-parts/event-page' );
        return;
    }

    // Check if ticket shop was found
    if ( $ticket_shop && 'basic' === $ticket_shop_integration_type ) {

        // Render "buy ticket" button component for "basic" integration type, then bail
        self::render( 'event-buy-tickets-button', 'template-parts/event-page', array(
            'order_page_url' => $ticket_shop->get_order_page_url(),
        ) );

        return;
    } else if ( $ticket_shop && 'advanced' === $ticket_shop_integration_type ) {

        // Render event ticket shop widget for "advanced" integration type, then bail
        self::render_ticket_shop_widget_event();

        return;
    }

    // Get data

    $event_shop_url       = (string) ($event[ 'publicationChannelTrackerUrl' ] ?? $event[ 'shopUrl' ] ?? '');
    $event_membership_url = (string) ($event[ 'membershipSalesUrl' ] ?? '');

    // Process ticket groups
    $ticket_groups = array();

    foreach ( $event_ticket_groups as $ticket_group ) {

        // Get data
        $name        = (string) ($ticket_group[ 'name' ] ?? '');
        $ticket_type = (string) ($ticket_group[ 'type' ] ?? '');

        // Skip tickets without a name
        if ( ! $name ) {
            continue;
        }

        // Continue for specific types
        if ( in_array( $ticket_type, array( 'FREE', 'LOCKED' ) ) ) {
            continue;
        }

        // Get data
        $currency_code               = 'EUR';
        $base_price                  = (int) ($ticket_group[ 'priceInCents' ] ?? 0);
        $online_sales_enabled        = (bool) ($ticket_group[ 'onlineSales' ] ?? false);
        $door_sales_enabled          = (bool) ($ticket_group[ 'doorSales' ] ?? false);
        $online_service_fee_fixed    = (int) ($ticket_group[ 'onlineServiceFeeFixedInCents' ] ?? 0);
        $online_service_fee_variable = (int) ($ticket_group[ 'onlineServiceFeeVariableInCents' ] ?? 0);
        $door_service_fee_fixed      = (int) ($ticket_group[ 'doorServiceFeeFixedInCents' ] ?? 0);
        $is_membership               = (string) ($ticket_type === 'MEMBERSHIP');
        $online_total_service_fee    = $online_service_fee_fixed + $online_service_fee_variable;
        $door_total_service_fee      = $door_service_fee_fixed;

        // Init
        $online_total_price = 0;
        $door_total_price   = 0;

        // Calculate online total price
        if ( $online_sales_enabled && $base_price > 0 ) {
            $online_total_price = $base_price + $online_total_service_fee;
        }

        // Calculate door total price
        if ( $door_sales_enabled && $base_price > 0 ) {
            $door_total_price = $base_price + $door_total_service_fee;
        }

        // Init
        $tickets                       = array();
        /*
         * Translators:
         * %1$s: The base price of a ticket
         * %2$s: The service fee of a ticket
         */
        $ticket_price_breakdown_string = _x( '%1$s + %2$s service fee', 'Ticket price breakdown: base price + service fee', 'wp-stager-integration' );

        if ( $online_sales_enabled ) {
            $tickets[] = array(
                'title'       => esc_html__( 'Online ticket', 'wp-stager-integration' ),
                'price'       => $online_total_price,
                'subtext'     => $online_total_service_fee > 0 ? $ticket_price_breakdown_string : '',
                'base_price'  => $base_price,
                'service_fee' => $online_total_service_fee,
                'url'         => $is_membership ? $event_membership_url : $event_shop_url,
            );
        }

        if ( $door_sales_enabled ) {
            $tickets[] = array(
                'title'       => esc_html_x( 'At the door', 'Displayed on event pages above tickets that are sold at the door (in person), as opposed to online.', 'wp-stager-integration' ),
                'price'       => $door_total_price,
                'subtext'     => $door_total_service_fee > 0 ? $ticket_price_breakdown_string : '',
                'base_price'  => $base_price,
                'service_fee' => $door_total_service_fee,
                'url'         => null,
            );
        }

        // Add processed ticket group
        $ticket_groups[] = array(
            'title'   => $name,
            'tickets' => $tickets,
        );
    }

    // Render the component
    self::render( 'event-ticket-groups', 'template-parts/event-page', array(
        'ticket_groups' => $ticket_groups,
    ) );
}

💡 If you ever get stuck or have a question, please check our FAQs, our Free Integration Service, our paid Full Integration Service, or reach out to us!

Get WP Stager Integration

🎁 Limited offer: Use code WELCOME26 to get your first month for free!