Probleme beim Ändern der WordPress-Anmeldeseite

Lesezeit: 5 Minuten

Benutzer-Avatar
Evertiro

Also arbeite ich wieder an meiner Änderung der Anmeldeseite … und ich stoße auf ein anderes Problem. Hier ist das Szenario … Ich habe ein Plugin, das aus zwei Komponenten besteht: einem Skript, das das Benutzernamenfeld im Anmelde-/Registrierungsformular umschreibt, und einer Funktion, die den Validierungs-Handler bei der Registrierung überschreibt.

Hier die besagten Dateien…

validator.php

<?php
// Rewrite registration form
function mpm_registration_form() {
    wp_enqueue_script('login_form', plugin_dir_url(__FILE__).'js/usernamerewrite.js', array('jquery'), false, false);
}
add_action('login_head', 'mpm_registration_form');

// Register actions
add_action('register_post', 'mpm_validator_verify_account', 10, 3);

// Check username against minecraft.net database
function mpm_validator_verify_account($login, $email, $errors) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_URL, 'http://www.minecraft.net/haspaid.jsp?user=".rawurlencode($login));
    $mcacct = curl_exec($curl);
    curl_close($curl);

    if($mcacct != "true') {
        if($mcacct == 'false') {
            $errors->add('mc_error', __('<strong>Error:</strong> Minecraft account is invalid.'));
            return $errors;
        } else {
            $errors->add('mc_error', __('<strong>Error:</strong> Unable to contact minecraft.net.'));
            return $errors;
        }
        add_filter('registration_errors', 'mpm_validator_verify_account', 10, 3);
    }
}

js/usernamerewrite.js

jQuery(document).ready(function ($) {
    'use strict';
    /*global document: false */
    /*global $, jQuery */
    var username, reset;
    if ($('body').hasClass('login')) {
        username = document.createElement("input");
        username.type="text";
        username.name="log";
        username.id = 'user_login';
        username.className="input";
        username.size="20";
        username.tabIndex = '10';
        reset = document.createElement("input");
        reset.type="text";
        reset.name="user_login";
        reset.id = 'user_login';
        reset.className="input";
        reset.size="20";
        reset.tabIndex = '10';
        $('label').each(
            function () {
                if ($(this).text().trim() === 'Username') {
                    $(this).html('Minecraft Username<br/>');
                    $(this).append(username);
                } else if ($(this).text().trim() === 'Username or E-mail:') {
                    $(this).html('Minecraft Username or E-mail:<br/>');
                    $(this).append(reset);
                }
            }
        );
    }
});

Das Problem ist, dass, wenn ich die Zeile wp_enqueue_script so schreibe, wie sie derzeit ist (wobei das Skript im Header geladen wird), die Aktionsfunktion ordnungsgemäß behandelt wird, aber das Umschreiben nie erfolgt. Wenn ich es umgekehrt so ändere, dass das Skript in die Fußzeile geladen wird, erfolgt die Umschreibung, aber die Aktion wird nicht mehr ordnungsgemäß behandelt (das Benutzernamenfeld wird vor dem Senden zurückgesetzt). Ich bin völlig ratlos.

Zweites (kleines) Ärgernis: Es gibt immer eine leichte Verzögerung zwischen dem Laden der Seite und dem Auftreten des Umschreibens. Alle Gedanken darüber, wie dies transparenter gemacht werden kann, wären sehr willkommen.

BEARBEITEN: Wenn Sie die Frage ablehnen, können Sie zumindest angeben, warum …

  • Warum erstellen Sie neue Eingabeelemente in Ihrem js? Wp bietet ihnen nein? Soweit ich weiß, möchten Sie am Frontend nur einen Text mit der Aufschrift „Minecraft-Benutzername“ anstelle von „Benutzername“ ersetzen und am Backend, das Sie validieren möchten. Ist das korrekt? In diesem Fall macht Ihr js zu viel …

    Benutzer1115652

    6. August 2012 um 16:33 Uhr


Benutzer-Avatar
Evertiro

Endlich verstanden! Die Art und Weise, wie ich es gemacht habe, war schrecklich … Ich muss wirklich mein JS/jQuery auffrischen. Hier ist, was ich herausgefunden habe, was in all meinen Testfällen wunderbar funktioniert und auch nicht nur die Feldbeschriftungen, sondern auch Nachrichten umschreibt …

jQuery(document).ready(function ($) {
'use strict';
/*global document: false */
/*global $, jQuery */
    $('label').each(
        function () {
            $(this).html($(this).html().replace('Username', 'Minecraft Username'));
        }
    );
    $('.message').each(
        function () {
            $(this).html($(this).html().replace('username', 'Minecraft username'));
        }
    );
});

  • Testen Sie auch mit deaktiviertem Javascript.

    – hakre

    10. August 2012 um 12:06 Uhr

Könnten Sie Ihre Funktion bitte einfach einschließen in:

jQuery( document ).ready
(
   function( $ )
   {
        // your js here
   }
);

Sie müssen die (jQuery) nicht hinter Ihre Funktion stellen.

Wenn Sie DOM-Änderungen ausführen, bevor die Seite geladen wurde, kann es nicht funktionieren. Sie können es jetzt in den Header laden und sicher sein, dass es ausgelöst wird.

Ich verstehe nicht ganz, warum die Felder vor dem Absenden zurückgesetzt werden, da Sie sich nicht an einen Submit-Event-Handler binden … Wenn dies immer noch passiert, lassen Sie es uns wissen.

Anstatt anzurufen if ($('body').hasClass('login')) In Ihrem Js möchten Sie wahrscheinlich PHP einchecken (verwenden Sie die Aktion login_head), wenn Sie sich auf der Anmeldeseite befinden, und dieses Js nicht an alle Seiten Ihrer Website senden. Aber bringen Sie es zuerst zum Laufen, bevor Sie es optimieren.

Wenn die Übermittlung nicht im Backend ankommt, liegt das wahrscheinlich daran, dass Ihr Javascript Eingaben mit denselben IDs wie die WordPress-Eingaben neu erstellt und sie somit ersetzt. Soweit ich das beurteilen kann, ist das überhaupt nicht das, wonach Sie suchen. Ersetzen Sie einfach die vorhandenen Etiketten.

  • Danke für den Tipp! Dies hat tatsächlich das Problem gelöst, dass es nicht richtig neu geschrieben wurde, aber jetzt funktioniert die Aktion überhaupt nicht.

    – Evertiro

    4. August 2012 um 19:19 Uhr

  • Angesichts der Tatsache, dass es Möglichkeiten gibt, die Anmelde-URL zu ändern, was ist Ihrer Meinung nach die bessere Methode, um festzustellen, ob sich der Benutzer auf der Anmeldeseite befindet?

    – Evertiro

    5. August 2012 um 21:45 Uhr

  • @ Ghost1227 das Wichtigste zuerst. Hast du sowas gemacht error_log( print_r( $_POST, true ) ); um zu sehen, ob das, was Sie zurückbekommen, genau das ist, was Sie wollen? und hat die Aktion überhaupt ausgelöst oder nicht? Wenn du die Aktion nicht finden kannst, überprüfe $_POST bei register_new_user() in wp-login.php. Wenn das fehlschlägt, überprüfen Sie es unter admin-ajax.php und sehen Sie, wo es schief geht.

    Benutzer1115652

    6. August 2012 um 11:38 Uhr

  • Wenn Sie Ihre Anmeldeseite erkennen, gibt es eine Aktion namens „login_head“, mit der Sie sich verbinden können, um Ihren Stil nur zu laden, wenn Sie sich auf der Anmeldeseite befinden.

    Benutzer1115652

    6. August 2012 um 11:57 Uhr

  • login_head hat super funktioniert! Es handhabt das Umschreiben tatsächlich viel reibungsloser als die Art und Weise, wie ich es getan habe! Also danke dafür … Was das andere Problem betrifft, hat das Hinzufügen der error_log-Zeile nichts zurückgegeben. Wenn ich das Formular absende, löscht es den Wert im Feld „Benutzername“ und gibt zwei Fehler zurück: „FEHLER: Bitte geben Sie einen Benutzernamen ein.“ und ‘FEHLER: Minecraft-Konto ist ungültig.’. Ich bin immer noch völlig ratlos, warum das Benutzernamenfeld gelöscht wird.

    – Evertiro

    6. August 2012 um 16:16 Uhr

1368550cookie-checkProbleme beim Ändern der WordPress-Anmeldeseite

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

Privacy policy