WordPress

hooks – WordPress Backend – Niestandardowy przepływ logowania

  • 13 czerwca, 2023
  • 4 min read
hooks – WordPress Backend – Niestandardowy przepływ logowania


Co chcę osiągnąć:
Logowanie na podstawie numeru telefonu komórkowego i hasła jednorazowego za każdym razem, gdy użytkownik się loguje, na jego numer zostanie wysłane hasło jednorazowe. Usługa OTP jest połączona z zewnętrznym serwerem, co oznacza, że ​​mam zewnętrzną bazę danych, a ta baza danych ma logowanie i weryfikację punktów końcowych oraz ma włączoną usługę OTP.

Ogólny przepływ pracy jest następujący:

  1. użytkownik wprowadza numer telefonu i klika na logowanie.
  2. skonsumuj punkt końcowy logowania, ten punkt końcowy wyśle ​​hasło jednorazowe na numer użytkownika.
  3. jeśli odpowiedź się powiedzie, pokaż pole kodu OTP, a gdy użytkownik wypełni pole kodu i prześle.
  4. odpal punkt końcowy Verify,
  5. jeśli odpowiedź się powiedzie, to zaloguj go do WordPressa.

Co próbowałem do tej pory:

1- Stworzyłem formularz w HTML i javascript oraz przetestowałem punkty końcowe API. ale nie mogłem wymyślić, jak połączyć kod z loginem WordPress.

 //set up the verification API
            var settings = {
              url: "https:------------------------------------/login/verify",
              method: "POST",
              timeout: 0,
              headers: {
                "Content-Type": "application/json",
              },
              data: JSON.stringify({
                phoneNumber: tempPhone,
                code: tempOTP,
              }),
            };

            //-------fire verify api --------------------------
            $.ajax(settings)
              .done(function (response) {
                console.log("Can Login");

                event.preventDefault();

                //----------------------------Do WordPress Login............


              })
              .error(function (jqXHR) {
                event.preventDefault();
                console.log("failed");
                ErrorHandule(jqXHR);
              });
          });

2- próbował utworzyć nowy formularz za pomocą JetformBuilder i dodał akcję do tego zaczepienia go do formularza, aby rozpocząć testowanie tego formularza, ale chyba skrypt się nie uruchamia.

// Login hoocks------------------------------------------------------------------
add_action( 'jet-form-builder/custom-action/Send_OTP', function() {

    // Create a new form using JetFormsBuilder.
    $form = new Jet_Form( 'test_login' );

    // Add a phone number field to the form.
    $form->add_field( array(
        'name' => 'phone_number',
        'label' => 'Phone Number',
        'type' => 'text',
    ) );

    // Add a submit button to the form.
    $form->add_submit_button( 'Login' );

    // Hook the form submission to the custom function.
    $form->add_action( 'jet_form_submit', 'custom_login_form_submit' );

} );


function custom_login_form_submit( $form ) {

    // Get the phone number from the form submission.
    $phone_number = $form->get_field_value( 'phone_number' );

    // Make a call to the login endpoint on the external server.
    $response = wp_remote_post(
        '
        array(
            'body' => array(
                'phone_number' => $phone_number,
            ),
        )
    );

    // Check if the response was successful.
    if ( wp_remote_retrieve_response_code( $response ) === 200 ) {

        // Get the OTP from the response.
        $otp = wp_remote_retrieve_body( $response );

        // Display an OTP field on the login form.
        $form->add_field( array(
            'name' => 'otp',
            'label' => 'OTP',
            'type' => 'text',
        ) );

    } else {

        // Display an error message.
        $form->add_error( 'Error logging in.' );

    }

}

if ( isset( $_POST['otp'] ) ) {

    // Make a call to the verify endpoint on the external server.
    $response = wp_remote_post(
        '
        array(
            'body' => array(
                'phone_number' => $phone_number,
                'otp' => $_POST['otp'],
            ),
        )
    );

    // Check if the response was successful.
    if ( wp_remote_retrieve_response_code( $response ) === 200 ) {

        // Log the user into WordPress.
        wp_signon( array(
            'user_login' => $phone_number,
            'user_password' => null,
            'remember' => true,
        ) );

    } else {

        // Display an error message.
        echo 'Error verifying OTP.';

    }

}

za 1, Jak mogę korzystać z funkcji wp_signon w tym kontekście?

Warto przeczytać!  Wtyczka wordpress plik require_once — nie można używać funkcji wordpress

dla 2, jest kilka rzeczy, których nie jestem pewien, na przykład $form = new Jet_Form( 'test_login' ); wewnątrz `Jet_Form’ mam wpisać nazwę formularza? lub identyfikator formularza? albo coś innego? Zajrzałem do ich dokumentacji, ale nie mogłem tego rozgryźć.

Jest jeszcze jedna logiczna rzecz, której nie mogę przeboleć. Jeśli WordPress pozwala nam logować się tylko za pomocą nazwy użytkownika lub adresu e-mail, jak mogę umożliwić logowanie za pomocą numeru telefonu??? i w ogóle nie ma hasła?


Źródło