2

Ok I want to edit bp_core_screen_signup() is which is a function of buddypress that used to process the registration form. Basically this funtion checks for any errors produced and then loops through them using add_action() to inject them into register.php. Well I need to change the html tags it's using and I don't understand how. So first here is this big nasty function.

function bp_core_screen_signup() {
global $bp;

if ( !bp_is_current_component( 'register' ) )
    return;

// Not a directory
bp_update_is_directory( false, 'register' );

// If the user is logged in, redirect away from here
if ( is_user_logged_in() ) {
    if ( bp_is_component_front_page( 'register' ) )
        $redirect_to = trailingslashit( bp_get_root_domain() . '/' . bp_get_members_root_slug() );
    else
        $redirect_to = bp_get_root_domain();

    bp_core_redirect( apply_filters( 'bp_loggedin_register_page_redirect_to', $redirect_to ) );

    return;
}

$bp->signup->step = 'request-details';

if ( !bp_get_signup_allowed() ) {
    $bp->signup->step = 'registration-disabled';

// If the signup page is submitted, validate and save
} elseif ( isset( $_POST['signup_submit'] ) && bp_verify_nonce_request( 'bp_new_signup' ) ) {

    do_action( 'bp_signup_pre_validate' );

    // Check the base account details for problems
    $account_details = bp_core_validate_user_signup( $_POST['signup_username'], $_POST['signup_email'] );

    // If there are errors with account details, set them for display
    if ( !empty( $account_details['errors']->errors['user_name'] ) )
        $bp->signup->errors['signup_username'] = $account_details['errors']->errors['user_name'][0];

    if ( !empty( $account_details['errors']->errors['user_email'] ) )
        $bp->signup->errors['signup_email'] = $account_details['errors']->errors['user_email'][0];

    // Check that both password fields are filled in
    if ( empty( $_POST['signup_password'] ) || empty( $_POST['signup_password_confirm'] ) )
        $bp->signup->errors['signup_password'] = __( 'Please make sure you enter your password twice', 'buddypress' );

    // Check that the passwords match
    if ( ( !empty( $_POST['signup_password'] ) && !empty( $_POST['signup_password_confirm'] ) ) && $_POST['signup_password'] != $_POST['signup_password_confirm'] )
        $bp->signup->errors['signup_password'] = __( 'The passwords you entered do not match.', 'buddypress' );

    $bp->signup->username = $_POST['signup_username'];
    $bp->signup->email = $_POST['signup_email'];

    // Now we've checked account details, we can check profile information
    if ( bp_is_active( 'xprofile' ) ) {

        // Make sure hidden field is passed and populated
        if ( isset( $_POST['signup_profile_field_ids'] ) && !empty( $_POST['signup_profile_field_ids'] ) ) {

            // Let's compact any profile field info into an array
            $profile_field_ids = explode( ',', $_POST['signup_profile_field_ids'] );

            // Loop through the posted fields formatting any datebox values then validate the field
            foreach ( (array) $profile_field_ids as $field_id ) {
                if ( !isset( $_POST['field_' . $field_id] ) ) {
                    if ( !empty( $_POST['field_' . $field_id . '_day'] ) && !empty( $_POST['field_' . $field_id . '_month'] ) && !empty( $_POST['field_' . $field_id . '_year'] ) )
                        $_POST['field_' . $field_id] = date( 'Y-m-d H:i:s', strtotime( $_POST['field_' . $field_id . '_day'] . $_POST['field_' . $field_id . '_month'] . $_POST['field_' . $field_id . '_year'] ) );
                }

                // Create errors for required fields without values
                if ( xprofile_check_is_required_field( $field_id ) && empty( $_POST['field_' . $field_id] ) )
                    $bp->signup->errors['field_' . $field_id] = __( 'This is a required field', 'buddypress' );
            }

        // This situation doesn't naturally occur so bounce to website root
        } else {
            bp_core_redirect( bp_get_root_domain() );
        }
    }

    // Finally, let's check the blog details, if the user wants a blog and blog creation is enabled
    if ( isset( $_POST['signup_with_blog'] ) ) {
        $active_signup = $bp->site_options['registration'];

        if ( 'blog' == $active_signup || 'all' == $active_signup ) {
            $blog_details = bp_core_validate_blog_signup( $_POST['signup_blog_url'], $_POST['signup_blog_title'] );

            // If there are errors with blog details, set them for display
            if ( !empty( $blog_details['errors']->errors['blogname'] ) )
                $bp->signup->errors['signup_blog_url'] = $blog_details['errors']->errors['blogname'][0];

            if ( !empty( $blog_details['errors']->errors['blog_title'] ) )
                $bp->signup->errors['signup_blog_title'] = $blog_details['errors']->errors['blog_title'][0];
        }
    }

    do_action( 'bp_signup_validate' );

    // Add any errors to the action for the field in the template for display.
    if ( !empty( $bp->signup->errors ) ) {
        foreach ( (array) $bp->signup->errors as $fieldname => $error_message ) {
            // addslashes() and stripslashes() to avoid create_function()
            // syntax errors when the $error_message contains quotes
            add_action( 'bp_' . $fieldname . '_errors', create_function( '', 'echo apply_filters(\'bp_members_signup_error_message\', "<div class=\"error\">" . stripslashes( \'' . addslashes( $error_message ) . '\' ) . "</div>" );' ) );
        }
    } else {
        $bp->signup->step = 'save-details';

        // No errors! Let's register those deets.
        $active_signup = !empty( $bp->site_options['registration'] ) ? $bp->site_options['registration'] : '';

        if ( 'none' != $active_signup ) {

            // Make sure the extended profiles module is enabled
            if ( bp_is_active( 'xprofile' ) ) {
                // Let's compact any profile field info into usermeta
                $profile_field_ids = explode( ',', $_POST['signup_profile_field_ids'] );

                // Loop through the posted fields formatting any datebox values then add to usermeta - @todo This logic should be shared with the same in xprofile_screen_edit_profile()
                foreach ( (array) $profile_field_ids as $field_id ) {
                    if ( ! isset( $_POST['field_' . $field_id] ) ) {

                        if ( ! empty( $_POST['field_' . $field_id . '_day'] ) && ! empty( $_POST['field_' . $field_id . '_month'] ) && ! empty( $_POST['field_' . $field_id . '_year'] ) ) {
                            // Concatenate the values
                            $date_value = $_POST['field_' . $field_id . '_day'] . ' ' . $_POST['field_' . $field_id . '_month'] . ' ' . $_POST['field_' . $field_id . '_year'];

                            // Turn the concatenated value into a timestamp
                            $_POST['field_' . $field_id] = date( 'Y-m-d H:i:s', strtotime( $date_value ) );
                        }
                    }

                    if ( !empty( $_POST['field_' . $field_id] ) )
                        $usermeta['field_' . $field_id] = $_POST['field_' . $field_id];

                    if ( !empty( $_POST['field_' . $field_id . '_visibility'] ) )
                        $usermeta['field_' . $field_id . '_visibility'] = $_POST['field_' . $field_id . '_visibility'];
                }

                // Store the profile field ID's in usermeta
                $usermeta['profile_field_ids'] = $_POST['signup_profile_field_ids'];
            }

            // Hash and store the password
            $usermeta['password'] = wp_hash_password( $_POST['signup_password'] );

            // If the user decided to create a blog, save those details to usermeta
            if ( 'blog' == $active_signup || 'all' == $active_signup )
                $usermeta['public'] = ( isset( $_POST['signup_blog_privacy'] ) && 'public' == $_POST['signup_blog_privacy'] ) ? true : false;

            $usermeta = apply_filters( 'bp_signup_usermeta', $usermeta );

            // Finally, sign up the user and/or blog
            if ( isset( $_POST['signup_with_blog'] ) && is_multisite() )
                $wp_user_id = bp_core_signup_blog( $blog_details['domain'], $blog_details['path'], $blog_details['blog_title'], $_POST['signup_username'], $_POST['signup_email'], $usermeta );
            else
                $wp_user_id = bp_core_signup_user( $_POST['signup_username'], $_POST['signup_password'], $_POST['signup_email'], $usermeta );

            if ( is_wp_error( $wp_user_id ) ) {
                $bp->signup->step = 'request-details';
                bp_core_add_message( $wp_user_id->get_error_message(), 'error' );
            } else {
                $bp->signup->step = 'completed-confirmation';
            }
        }

        do_action( 'bp_complete_signup' );
    }

}

do_action( 'bp_core_screen_signup' );
bp_core_load_template( apply_filters( 'bp_core_template_register', array( 'register', 'registration/register' ) ) );
}
add_action( 'bp_screens', 'bp_core_screen_signup' );

Now on line 98 you'll see.. // Add any errors to the action for the field in the template for display.

Then it loops through the errors and you come to..

add_action( 'bp_' . $fieldname . '_errors', create_function( '', 'echo apply_filters(\'bp_members_signup_error_message\', "<div class=\"error\">" . stripslashes( \'' . addslashes( $error_message ) . '\' ) . "</div>" );' ) );

I need to edit those html tags in my bp-custom.php file without reproducing the entire function. How do I hook in correctly to do this?

  • 4
    That last code snippet you have should be raised as a bug with the buddypress team, it's an awful piece of code – Tom J Nowell Sep 11 '14 at 9:53
  • I would have no idea what to say if they asked me why. – user300979 Sep 11 '14 at 9:57
  • Direct theme here, and make noises about it being the equivalent to eval, and anonymous functions and objects – Tom J Nowell Sep 11 '14 at 10:39
4

Use the filter hook bp_members_signup_error_message

Try:

function signup_error_change( $error_message ) {
     $error_message = str_replace('<div class="error">', '<span class="val-error">', $error_message);
     $error_message = str_replace('</div>', '</span>', $error_message);
     return $error_message;
}
add_filter('bp_members_signup_error_message', 'signup_error_change', 1, 1);
| improve this answer | |
  • I'm confused what I'm doing in the middle for "do string find and replace". I need to change the html tags around $error_message. – user300979 Sep 11 '14 at 20:26
  • I don't know what you want to change. But you can change the tags by using php.net/manual/en/function.str-replace.php – shanebp Sep 11 '14 at 20:42
  • I want to change the <div> tags to <span class="val-error">. – user300979 Sep 11 '14 at 20:49
  • See above, answer edited. – shanebp Sep 11 '14 at 21:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.