# "Request a Call Back" Form Shortcode

> Adds a short [wpide_callback_form] form where visitors leave their name, phone number and the best time to call, and emails the request to you.

- Type: PHP
- Runs: Run everywhere
- Category: [Forms](https://wpide.com/library/category/forms/)
- Tags: callback, shortcode, phone
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/form-callback-request/

## Code

```php
$wpide_callback = array(
    'to'    => '', // Recipient; empty = admin email.
    'slots' => array( 'Morning (9–12)', 'Afternoon (12–17)', 'Evening (17–19)', 'Any time' ),
);

add_action( 'template_redirect', function () use ( $wpide_callback ) {
    if ( empty( $_POST['wpide_cb_nonce'] ) ) {
        return;
    }

    $back = remove_query_arg( 'wpide_cb', wp_get_referer() ? wp_get_referer() : home_url( '/' ) );
    $done = function ( $status ) use ( $back ) {
        wp_safe_redirect( add_query_arg( 'wpide_cb', $status, $back ) . '#wpide-callback' );
        exit;
    };

    if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['wpide_cb_nonce'] ) ), 'wpide_cb' ) ) {
        $done( 'expired' );
    }
    if ( ! empty( $_POST['wpide_cb_hp'] ) ) {
        $done( 'sent' );
    }

    $ip  = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : '';
    $key = 'wpide_cb_' . md5( wp_salt() . $ip );
    if ( (int) get_transient( $key ) >= 3 ) {
        $done( 'limit' );
    }

    $name  = sanitize_text_field( wp_unslash( isset( $_POST['wpide_cb_name'] ) ? $_POST['wpide_cb_name'] : '' ) );
    $phone = preg_replace( '/[^0-9+()\s.\-]/', '', (string) wp_unslash( isset( $_POST['wpide_cb_phone'] ) ? $_POST['wpide_cb_phone'] : '' ) );
    $slot  = sanitize_text_field( wp_unslash( isset( $_POST['wpide_cb_slot'] ) ? $_POST['wpide_cb_slot'] : '' ) );
    $slot  = in_array( $slot, $wpide_callback['slots'], true ) ? $slot : 'Any time';

    if ( '' === $name || strlen( preg_replace( '/\D/', '', $phone ) ) < 7 ) {
        $done( 'invalid' );
    }

    $to   = is_email( $wpide_callback['to'] ) ? $wpide_callback['to'] : get_option( 'admin_email' );
    $sent = wp_mail( $to, 'Call back request: ' . $name, "Name: $name\nPhone: $phone\nBest time: $slot\nPage: $back" );

    set_transient( $key, (int) get_transient( $key ) + 1, HOUR_IN_SECONDS );
    $done( $sent ? 'sent' : 'error' );
} );

add_shortcode( 'wpide_callback_form', function () use ( $wpide_callback ) {
    $messages = array(
        'sent'    => 'Thanks! We will call you back at the time you chose.',
        'invalid' => 'Please enter your name and a valid phone number.',
        'limit'   => 'You have already sent a request. We will be in touch soon.',
        'expired' => 'The form expired. Please try again.',
        'error'   => 'Sorry, the request could not be sent. Please call us instead.',
    );
    $status = isset( $_GET['wpide_cb'] ) ? sanitize_key( $_GET['wpide_cb'] ) : '';

    $html  = '<div id="wpide-callback" class="wpide-form wpide-callback-form">';
    $html .= isset( $messages[ $status ] ) ? '<p class="wpide-form-notice" role="status">' . esc_html( $messages[ $status ] ) . '</p>' : '';
    $html .= '<form method="post" action="">';
    $html .= '<p><label for="wpide-cb-name">Name</label><br><input id="wpide-cb-name" name="wpide_cb_name" required autocomplete="name"></p>';
    $html .= '<p><label for="wpide-cb-phone">Phone number</label><br><input type="tel" id="wpide-cb-phone" name="wpide_cb_phone" required autocomplete="tel"></p>';
    $html .= '<p><label for="wpide-cb-slot">Best time to call</label><br><select id="wpide-cb-slot" name="wpide_cb_slot">';
    foreach ( $wpide_callback['slots'] as $slot ) {
        $html .= '<option>' . esc_html( $slot ) . '</option>';
    }
    $html .= '</select></p><p style="position:absolute;left:-9999px;" aria-hidden="true"><input name="wpide_cb_hp" tabindex="-1" autocomplete="off"></p>';
    $html .= wp_nonce_field( 'wpide_cb', 'wpide_cb_nonce', false, false );
    $html .= '<p><button type="submit">Call me back</button></p></form></div>';

    return $html;
} );
```

## Notes

Change the time slots and recipient at the top; works well in a sidebar or at the end of service pages.

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find ""Request a Call Back" Form Shortcode" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
