Modificar una función para devolver el nombre de usuario correctamente, para un complemento de wordpress

5 minutos de lectura

avatar de usuario
dennis silvia

Tengo dos complementos de WordPress y ambos autores de los complementos se niegan a admitir que el conflicto/problema es su sitio, pero está bastante claro que ambas partes pueden solucionar el problema muy fácilmente.

Proporcioné a un autor del complemento la solución que no tiene un impacto negativo en su complemento de ninguna manera, no causa ningún problema si la persona tiene el segundo complemento instalado o no, pero no agregará la solución a su complemento a pesar de que agrega compatibilidad con un complemento diferente.

No puedo averiguar cómo arreglar el segundo complemento, pero sé lo que hay que hacer…

Fragmento del Complemento 1 (uno al que proporcioné una solución)

/* 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 );
}

Ahora, si encuentra la línea:

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

Y reemplazarlo con:

//$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'] );  
    }     
}

Entonces esto soluciona el problema porque cambia el $data['username'] variable a su nombre de usuario real, lo que significa que el resto del complemento 1 continuará correctamente y vinculará ciertos detalles al nombre de usuario (cuenta) en lugar de un nombre de usuario que consiste en su correo electrónico (que obviamente no existe como nombre de usuario)

  • Si el nombre de usuario existe (intentaron iniciar sesión con nombre de usuario y contraseña), entonces continúa normalmente.
  • Si el nombre de usuario NO existe, verifica si el correo electrónico existe en su lugar, si lo hace, tomará el nombre de usuario de la dirección de correo electrónico que se ingresó y simplemente cambia el campo de nombre de usuario ingresado con su nombre de usuario real en lugar de su correo electrónico y luego continúa como de costumbre.

Fragmento del complemento 2 (uno para el que necesito una solución)

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

No estoy 100% seguro de lo que hace el fragmento anterior en su totalidad, pero lo entiendo lo suficientemente bien y necesito cambiarlo para que devuelve el nombre de usuario correcto de alguna manera para que $data['username'] se reemplaza con el nombre de usuario en lugar del correo electrónico (si se usa un correo electrónico)

  • de acuerdo a codex.wordpress.org/Function_Reference/wp_login wp_login() es obsoleto. Hace mucho tiempo que está en desuso. Combine esta evidencia circunstancial con la actitud del autor de Plugin1, tal vez sea hora de dejar de usar ese complemento.

    –James Jones

    07/01/2016 a las 23:37

  • @JamesJones Siendo que el wp_login() función no está en la lista obsoleta de funciones, supongo que han eliminado wp_login() completamente desde 4.4.1 y que el autor del complemento ha creado su propio wp_login() función. Para ser justos con el complemento 1, su WordPress y su complemento no anuncian la capacidad de iniciar sesión con el correo electrónico, por lo que no es realmente para ellos arreglarlo. En cambio, el autor del complemento 2 debería arreglarlo, ya que es su complemento el que tiene la falla.

    – Ryflex

    8 de enero de 2016 a las 3:58

  • ¿Cuáles son los complementos reales que estamos viendo aquí?

    – jbafford

    11 de enero de 2016 a las 0:38

  • ¿Cuál es el problema y qué estás tratando de lograr? Nadie responde porque la pregunta es extremadamente vaga.

    –Jim Maguire

    12 de enero de 2016 a las 13:58

  • ¿No podría simplemente actualizar el complemento 1 localmente? Si el complemento se actualiza, tendrá que arreglarlo nuevamente, pero podría omitir las actualizaciones. O crea un tenedor de él.

    – sricks

    13 de enero de 2016 a las 0:34

avatar de usuario
Pandilla

Primero, mi versión de 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

los complementos en mi centos6.4 se instalarían en esta ubicación:

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

Preste atención a que esta función (en mi sistema) no siempre devuelve un usuario, también 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) {

El wp-email-login que encontré podría ser adecuado para usted:

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

Para ser más claro, el fragmento del complemento 2 debe cambiarse a:

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

¿Ha sido útil esta solución?