# CP24 Membership Signup Developer Hooks

This document describes the developer hooks available in the CP24 Membership Signup system.

## Action Hooks

### cp24_before_signup_form

Triggered before the signup form is rendered.

```php
add_action( 'cp24_before_signup_form', 'my_custom_before_signup_form' );
function my_custom_before_signup_form() {
    echo '<div class="custom-signup-notice">Welcome to our signup process!</div>';
}
```

### cp24_after_signup_form

Triggered after the signup form is rendered.

```php
add_action( 'cp24_after_signup_form', 'my_custom_after_signup_form' );
function my_custom_after_signup_form() {
    echo '<div class="custom-signup-footer">Need help? Contact support.</div>';
}
```

### cp24_before_user_signup

Triggered before a user account is created.

```php
add_action( 'cp24_before_user_signup', 'my_custom_before_user_signup' );
function my_custom_before_user_signup( $user_data ) {
    // Log signup attempt
    error_log( 'User signup attempt: ' . $user_data['user_email'] );

    // Send notification to admin
    wp_mail(
        get_option( 'admin_email' ),
        'New User Signup',
        'A new user is signing up: ' . $user_data['user_email']
    );
}
```

### cp24_after_user_signup

Triggered after a user account is successfully created.

```php
add_action( 'cp24_after_user_signup', 'my_custom_after_user_signup', 10, 2 );
function my_custom_after_user_signup( $user_id, $user_data ) {
    // Add custom user meta
    update_user_meta( $user_id, 'signup_source', 'website' );
    update_user_meta( $user_id, 'signup_date', current_time( 'mysql' ) );

    // Send welcome email
    wp_mail(
        $user_data['user_email'],
        'Welcome to Our Site!',
        'Thank you for signing up. Your account has been created successfully.'
    );

    // Log successful signup
    error_log( 'User signup successful: ' . $user_data['user_email'] . ' (ID: ' . $user_id . ')' );
}
```

## Filter Hooks

### cp24_signup_form_fields

Modify the form fields displayed in the signup form.

```php
add_filter( 'cp24_signup_form_fields', 'my_custom_signup_form_fields' );
function my_custom_signup_form_fields( $form_fields ) {
    // Add a phone number field
    $form_fields['phone'] = array(
        'type'         => 'tel',
        'label'        => __( 'Phone Number', 'textdomain' ),
        'placeholder'  => __( 'Enter your phone number', 'textdomain' ),
        'required'     => false,
        'autocomplete' => 'tel',
        'class'        => 'cp24-form-input',
        'wrapper_class' => 'cp24-form-group',
        'order'        => 25,
    );

    // Add a company field
    $form_fields['company'] = array(
        'type'         => 'text',
        'label'        => __( 'Company', 'textdomain' ),
        'placeholder'  => __( 'Enter your company name', 'textdomain' ),
        'required'     => false,
        'autocomplete' => 'organization',
        'class'        => 'cp24-form-input',
        'wrapper_class' => 'cp24-form-group',
        'order'        => 26,
    );

    return $form_fields;
}
```

### cp24_signup_validation_rules

Modify the validation rules for signup form data.

```php
add_filter( 'cp24_signup_validation_rules', 'my_custom_validation_rules' );
function my_custom_validation_rules( $validation_rules ) {
    // Make first name optional
    $validation_rules['first_name_required'] = false;

    // Change minimum length for names
    $validation_rules['first_name_min_length'] = 1;
    $validation_rules['last_name_min_length'] = 1;

    // Disable suspicious input checking
    $validation_rules['check_suspicious'] = false;

    return $validation_rules;
}
```

### cp24_signup_redirect_url

Customize the redirect URL after successful signup.

```php
add_filter( 'cp24_signup_redirect_url', 'my_custom_signup_redirect', 10, 2 );
function my_custom_signup_redirect( $redirect_url, $user_data ) {
    // Redirect based on user role or other criteria
    if ( strpos( $user_data['user_email'], '@company.com' ) !== false ) {
        return home_url( '/company-welcome' );
    }

    // Redirectpersonalized welcome page
    return home_url( '/welcome?name=' . urlencode( $user_data['first_name'] ) );
}
```

### cp24_signup_user_meta

Add custom user meta data during signup.

```php
add_filter( 'cp24_signup_user_meta', 'my_custom_user_meta', 10, 2 );
function my_custom_user_meta( $user_meta, $form_data ) {
    // Add signup source
    $user_meta['signup_source'] = 'website_form';

    // Add custom fields if they exist in form data
    if ( ! empty( $form_data['phone'] ) ) {
        $user_meta['phone_number'] = sanitize_text_field( $form_data['phone'] );
    }

    if ( ! empty( $form_data['company'] ) ) {
        $user_meta['company_name'] = sanitize_text_field( $form_data['company'] );
    }

    // Add signup timestamp
    $user_meta['signup_timestamp'] = time();

    return $user_meta;
}
```

### cp24_signup_password_requirements

Customize password strength requirements.

```php
add_filter( 'cp24_signup_password_requirements', 'my_custom_password_requirements' );
function my_custom_password_requirements( $requirements ) {
    // Require stronger passwords
    $requirements['min_length'] = 10;
    $requirements['strong_min_length'] = 12;
    $requirements['require_number'] = true;
    $requirements['require_uppercase'] = true;
    $requirements['require_lowercase'] = true;

    // Add custom requirement for special characters
    $requirements['require_special'] = true;

    return $requirements;
}

// You would also need to add validation for the special character requirement
add_filter( 'cp24_signup_validation_rules', 'add_special_char_validation' );
function add_special_char_validation( $validation_rules ) {
    // This would require additional validation logic in the password strength method
    return $validation_rules;
}
```

## Complete Example: Custom Signup Flow

Here's a complete example that demonstrates using multiple hooks together:

```php
// Add custom fields to the signup form
add_filter( 'cp24_signup_form_fields', 'company_signup_fields' );
function company_signup_fields( $form_fields ) {
    $form_fields['company'] = array(
        'type'         => 'text',
        'label'        => __( 'Company Name', 'textdomain' ),
        'placeholder'  => __( 'Enter your company name', 'textdomain' ),
        'required'     => true,
        'class'        => 'cp24-form-input',
        'wrapper_class' => 'cp24-form-group',
        'order'        => 15,
    );

    $form_fields['job_title'] = array(
        'type'         => 'text',
        'label'        => __( 'Job Title', 'textdomain' ),
        'placeholder'  => __( 'Enter your job title', 'textdomain' ),
        'required'     => false,
        'class'        => 'cp24-form-input',
        'wrapper_class' => 'cp24-form-group',
        'order'        => 16,
    );

    return $form_fields;
}

// Add validation for custom fields
add_filter( 'cp24_signup_validation_rules', 'company_validation_rules' );
function company_validation_rules( $validation_rules ) {
    $validation_rules['company_required'] = true;
    $validation_rules['company_min_length'] = 2;
    return $validation_rules;
}

// Store custom data as user meta
add_filter( 'cp24_signup_user_meta', 'company_user_meta', 10, 2 );
function company_user_meta( $user_meta, $form_data ) {
    if ( ! empty( $form_data['company'] ) ) {
        $user_meta['company_name'] = sanitize_text_field( $form_data['company'] );
    }

    if ( ! empty( $form_data['job_title'] ) ) {
        $user_meta['job_title'] = sanitize_text_field( $form_data['job_title'] );
    }

    return $user_meta;
}

// Custom redirect based on company
add_filter( 'cp24_signup_redirect_url', 'company_signup_redirect', 10, 2 );
function company_signup_redirect( $redirect_url, $user_data ) {
    return home_url( '/company-onboarding' );
}

// Send notification to admin about new company signup
add_action( 'cp24_after_user_signup', 'notify_admin_company_signup', 10, 2 );
function notify_admin_company_signup( $user_id, $user_data ) {
    $company = get_user_meta( $user_id, 'company_name', true );
    $job_title = get_user_meta( $user_id, 'job_title', true );

    $message = sprintf(
        "New company signup:\n\nName: %s %s\nEmail: %s\nCompany: %s\nJob Title: %s",
        $user_data['first_name'],
        $user_data['last_name'],
        $user_data['user_email'],
        $company,
        $job_title
    );

    wp_mail(
        get_option( 'admin_email' ),
        'New Company Signup',
        $message
    );
}
```

## Hook Priority and Parameters

- All action hooks use default priority (10) unless specified
- Filter hooks should use priority 10 or higher to ensure they run after the default processing
- Always sanitize and validate data when using these hooks
- Use appropriate WordPress functions for security (sanitize_text_field, esc_html, etc.)

## Security Considerations

When using these hooks:

1. Always sanitize user input
2. Validate data before processing
3. Use appropriate WordPress security functions
4. Check user capabilities when necessary
5. Escape output when displaying data
6. Use nonces for form submissions if adding custom forms
