php - 修改函数以正确返回用户名,用于 wordpress 插件

标签 php wordpress

我有两个 Wordpress 插件,两个插件的作者都拒绝承认冲突/问题是他们的网站,但很明显,双方都可以很容易地解决问题。

我向一位插件作者提供了对他们的插件没有任何负面影响的修复程序,无论该人是否安装了第二个插件都不会造成任何问题,但他们不会将修复程序添加到他们的插件中插件,即使它增加了与不同插件的兼容性。

我不知道如何修复第二个插件,但我知道需要做什么...

插件 1 的代码片段(我提供了一个修复程序)

/* check if the user is valid */
if ( true === wlm_admin_in_admin() || true === $special_bypass ) {
    $validuser = username_exists( $data['username'] );

    if ( ! $validuser ) {
        $validuser        = email_exists( $data['email'] );
        $user_info        = get_userdata( $validuser );
        $data['username'] = $user_info->user_login;
    }

    $data['password'] = __( 'Already assigned', 'wishlist-member' );
} else {
    $validuser = wp_login( $data['username'], $data['password'] );
}
if ( $validuser ) {
    $user      = $this->Get_UserData( 0, $data['username'] );
    /* check for blacklist status */
    $blacklist = $this->CheckBlackList( $user->user_email );
}

现在,如果找到行:

$validuser = wp_login( $data['username'], $data['password'] );

并将其替换为:

//$validuser = wp_login( $data['username'], $data['password'] );
$tmpvaliduser = username_exists( $data['username'] );
if ($tmpvaliduser)
    $validuser = wp_login( $data['username'], $data['password'] );

if ( ! $validuser || !$tmpvaliduser) {     
    if((!$data['email'])  && !(false === strrpos($data['username'], "@")) ) {
        $validuser        = email_exists( $data['username'] );
        $user_info        = get_userdata( $validuser );
        $data['username'] = $user_info->user_login;
        $validuser = wp_login( $data['username'], $data['password'] );  
    }     
}

然后这解决了问题,因为它将 $data['username'] 变量更改为其实际用户名,这意味着插件 1 的其余部分将继续正确并将某些详细信息绑定(bind)到用户名 (帐户),而不是由他们的电子邮件组成的用户名(显然不作为用户名存在)

  • 如果用户名存在(他们尝试使用用户名和密码登录),那么它将像往常一样继续。
  • 如果用户名不存在,那么它会检查电子邮件是否存在,如果存在,那么它将从输入的电子邮件地址中获取用户名,并简单地将输入的用户名字段更改为他们的实际用户名而不是他们的电子邮件,然后像往常一样继续

插件 2 的片段(我需要修复的一个)

function email_login_authenticate( $user, $username, $password ) {
    if ( is_a( $user, 'WP_User' ) )
        return $user;
    if ( !empty( $username ) ) {
        $user = get_user_by( 'email', $username );
        if ( isset( $user, $user->user_login, $user->user_status ) && 0 == (int) $user->user_status ) {
            $username = $user->user_login;
        }
        $result = wp_authenticate_username_password( null, $username, $password );
        if (is_a ( $result, 'WP_User' ) ) {
            global $WishListMemberInstance;
            $WishListMemberInstance->WPMAutoLogin($user->ID);
            $_POST['log'] = $username;
            $WishListMemberInstance->Login();
        }
    }
    return wp_authenticate_username_password( null, $username, $password );
}

我不是 100% 确定上面的代码片段的完整功能,但我对它的理解足够好,我需要对其进行更改,以便它返回正确的用户名 以某种方式让$data['username'] 替换为用户名 而不是电子邮件(如果使用电子邮件)

最佳答案

首先是我的wordpress版本

Name        : wordpress                    Relocations: (not relocatable)
Version     : 4.4                               Vendor: Fedora Project
Release     : 1.el6                         Build Date: Wed 09 Dec 2015 11:40:49 AM EST

我的 centos6.4 上的插件会安装在这个位置:

/usr/share/wordpress/wp-content/plugins

请注意这个函数(在我的系统上)并不总是返回一个用户,WP_Error 也是如此

/**
 * Authenticate the user using the username and password.
 *
 * @since 2.8.0
 *
 * @param WP_User|WP_Error|null $user     WP_User or WP_Error object from a previous callback. Default null.
 * @param string                $username Username for authentication.
 * @param string                $password Password for authentication.
 * @return WP_User|WP_Error WP_User on success, WP_Error on failure.
 */
function wp_authenticate_username_password($user, $username, $password) {

我找到的 wp-email-login 可能适合你:

http://plugins.svn.wordpress.org/wp-email-login/trunk/email-login.php

为了更清楚,插件 2 中的代码段应更改为:

function email_login_authenticate( $user, $username, $password ) {
    if ( is_a( $user, 'WP_User' ) )
        return $user;
    if ( !empty( $username ) ) {


        // add this line to format email - propose change #1
            $username = str_replace( '&', '&', stripslashes( $username ) );
        $user = get_user_by( 'email', $username );
        if ( isset( $user, $user->user_login, $user->user_status ) && 0 == (int) $user->user_status ) {
            $username = $user->user_login;
        }
        $result = wp_authenticate_username_password( null, $username, $password );
        if (is_a ( $result, 'WP_User' ) ) {
            // These 4 lines came from plugin2 from your system, keep as is
            global $WishListMemberInstance;
            $WishListMemberInstance->WPMAutoLogin($user->ID);
            $_POST['log'] = $username;
            $WishListMemberInstance->Login();
        }


        // no need to authenticate another time, return - proposed change #2
        // authenticate twice could be a problem as well
        return $result;
    }
    return wp_authenticate_username_password( null, $username, $password );
}

关于php - 修改函数以正确返回用户名,用于 wordpress 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34647290/

相关文章:

php - 我无法从 MySql 中删除记录

php - 如何检查 Couchbase 中是否存在 key ?

css - 在wordpress中下拉类别主菜单

WordPress 循环 - 如何计算项目数

javascript - WordPress JSON API - 请求 header 错误

php - 无法修改标题信息 session Cookie创建吗?

php - 来自 mysql 的每个第二项在不同的 div 框中

PHP 如何保留链接中的所有 GET 变量?

php - Wordpress:Ajax 无法插入、查询和结果数据

php - 从 Wordpress 插件输出 HTML 的更简洁方法是什么?