Ändern einer Funktion, um den Benutzernamen für ein WordPress-Plugin korrekt zurückzugeben

Lesezeit: 5 Minuten

Benutzeravatar von Dennis Sylvian
Dennis Silvia

Ich habe zwei WordPress-Plugins und beide Autoren der Plugins weigern sich zuzugeben, dass der Konflikt / das Problem ihre Website ist, aber es ist ziemlich klar, dass beide Parteien das Problem sehr einfach beheben können.

Ich habe einem Plugin-Autor den Fix zur Verfügung gestellt, der in keiner Weise negative Auswirkungen auf sein Plugin hat. Es verursacht keine Probleme, ob die Person das zweite Plugin installiert hat oder nicht, aber sie wird den Fix nicht zu ihrem Plugin hinzufügen, obwohl es fügt Kompatibilität mit einem anderen Plugin hinzu.

Ich kann nicht herausfinden, wie ich das zweite Plugin reparieren kann, aber ich weiß, was getan werden muss …

Ausschnitt aus Plugin 1 (eines, für das ich einen Fix bereitgestellt habe)

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

Wenn Sie nun die Zeile finden:

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

Und ersetzen Sie es durch:

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

Dann behebt dies das Problem, weil es die ändert $data['username'] Variable zu ihrem tatsächlichen Benutzernamen, was bedeutet, dass der Rest des Plugins 1 korrekt fortfährt und bestimmte Details an den Benutzernamen (Konto) bindet und nicht an einen Benutzernamen, der aus ihrer E-Mail besteht (die offensichtlich nicht als Benutzername existiert).

  • Wenn der Benutzername existiert (sie haben versucht, sich mit Benutzername und Passwort anzumelden), wird es wie gewohnt fortgesetzt.
  • Wenn der Benutzername NICHT existiert, wird stattdessen geprüft, ob die E-Mail existiert. Wenn dies der Fall ist, wird der Benutzername aus der eingegebenen E-Mail-Adresse abgerufen und das eingegebene Benutzernamensfeld einfach durch den tatsächlichen Benutzernamen anstelle der E-Mail-Adresse ersetzt und dann wie gewohnt fortgesetzt

Ausschnitt aus Plugin 2 (Eines, für das ich eine Korrektur benötige)

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

Ich bin mir nicht 100% sicher, was das obige Snippit vollständig macht, aber ich verstehe es gut genug und muss es so ändern, dass es funktioniert gibt den korrekten Benutzernamen zurück irgendwie so das $data['username'] wird durch den Benutzernamen ersetzt anstelle der E-Mail (falls eine E-Mail verwendet wird)

  • entsprechend codex.wordpress.org/Function_Reference/wp_login wp_login() ist veraltet. Es ist schon seit langem veraltet. Kombinieren Sie diesen Indizienbeweis mit der Einstellung des Autors von Plugin1, vielleicht ist es an der Zeit, dieses Plugin nicht mehr zu verwenden.

    – James Jones

    7. Januar 2016 um 23:37 Uhr

  • @JamesJones Das ist das wp_login() Funktion nicht in der veralteten Liste der Funktionen ist, würde ich davon ausgehen, dass sie entfernt wurden wp_login() vollständig von 4.4.1 und dass der Plugin-Autor sein eigenes Custom erstellt hat wp_login() Funktion. Um fair zu Plugin 1 zu sein, werben ihr WordPress und ihr Plugin nicht für die Möglichkeit, sich mit E-Mail anzumelden, also ist es nicht wirklich ihre Aufgabe, das Problem zu beheben. Stattdessen sollte der Autor von Plugin 2 es beheben, da es sein Plugin ist, das den Fehler hat.

    – Ryflex

    8. Januar 2016 um 3:58 Uhr

  • Was sind die eigentlichen Plugins, die wir uns hier ansehen?

    – jbafford

    11. Januar 2016 um 0:38 Uhr

  • Was ist das Problem und was versuchst du zu erreichen? Niemand antwortet, weil die Frage äußerst vage ist.

    – Jim Maguire

    12. Januar 2016 um 13:58 Uhr

  • Könntest du Plugin 1 nicht einfach lokal aktualisieren? Wenn das Plugin aktualisiert wird, müssen Sie es erneut reparieren, aber Sie können Updates dafür umgehen. Oder erstellen Sie einen Fork davon.

    – Sricks

    13. Januar 2016 um 0:34 Uhr

Benutzeravatar der Gang
Gang

Zuerst meine WordPress-Version

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

Plugins auf meinem Centos6.4 würden an diesem Ort installiert:

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

Bitte beachten Sie, dass diese Funktion (auf meinem System) nicht immer auch einen Benutzer, WP_Error, zurückgibt

/**
 * 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) {

Der von mir gefundene wp-email-login könnte für dich passen:

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

Um es klarer zu machen, sollte das Snippet von Plugin 2 geändert werden in:

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

1402790cookie-checkÄndern einer Funktion, um den Benutzernamen für ein WordPress-Plugin korrekt zurückzugeben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy