如何修改核心函数循环内的Add_action()

时间:2014-09-11 作者:user300979

好的,我想编辑bp\\u core\\u screen\\u signup(),这是buddypress的一个函数,用于处理注册表。基本上,这个函数检查产生的任何错误,然后使用add\\u action()遍历它们,将它们注入寄存器。php。我需要更改它使用的html标记,但我不知道如何更改。首先是一个大的讨厌的函数。

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\' );
现在在第98行,您将看到..//将所有错误添加到模板中字段的操作中以供显示。

然后,它循环遍历错误,然后得出。。

add_action( \'bp_\' . $fieldname . \'_errors\', create_function( \'\', \'echo apply_filters(\\\'bp_members_signup_error_message\\\', "<div class=\\"error\\">" . stripslashes( \\\'\' . addslashes( $error_message ) . \'\\\' ) . "</div>" );\' ) );
我需要在我的bp自定义中编辑这些html标记。php文件,而不复制整个函数。我该如何正确地连接才能做到这一点?

1 个回复
最合适的回答,由SO网友:shanebp 整理而成

使用筛选器挂钩bp\\u members\\u signup\\u error\\u消息

尝试:

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);

结束

相关推荐

动态添加页面子目录,就像BuddyPress一样

我有一页写着slug/namecharts. 所以url看起来像http://domain.tld/charts/ 用于图表页面。当我键入url时http://domain.tld/charts/(something) 或http://domain.tld/charts/(something)/(something), 我得到的错误并没有找到,逻辑上应该是这样的,因为并没有具有给定名称的子页。现在想要的是,什么时候去http://domain.tld/charts/(something) 或http://