6

所以我正在再次修改我的登录页面......我遇到了另一个问题。这是场景......我有一个由两个组件组成的插件:一个重写登录/注册表单上的用户名字段的脚本,以及一个在注册时覆盖验证处理程序的函数。

以下是有问题的文件...

验证器.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/用户名rewrite.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);
                }
            }
        );
    }
});

问题是,如果我按当前的方式编写 wp_enqueue_script 行(脚本加载到标题中),则操作函数会得到正确处理,但重写永远不会发生。相反,如果我将其更改为将脚本加载到页脚中,则会发生重写,但不再正确处理该操作(用户名字段在提交之前被重置)。我完全不知所措。

第二个(次要)烦恼:页面加载和重写发生之间总是有轻微的延迟。任何关于如何使其更加透明的想法将不胜感激。

编辑:如果你要否决这个问题,你至少可以说明为什么......

4

2 回答 2

2

终于想通了!我这样做的方式太可怕了……我真的需要重新学习我的 JS/jQuery。这就是我最终得到的结果,它在我所有的测试用例中都能很好地工作,并且不仅重写了字段标签,还重写了消息......

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'));
        }
    );
});
于 2012-08-06T20:49:48.167 回答
0

您能否将您的功能包装在:

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

无需将 (jQuery) 放在您的函数后面。

如果在页面加载之前运行 DOM 修改,它就无法工作。您现在可以将其加载到标题中并放心它会触发。

我不太明白为什么在提交之前会重置字段,因为您没有绑定到任何提交事件处理程序......如果仍然发生这种情况,请告诉我们。

如果您在登录页面上,而不是调用if ($('body').hasClass('login'))您的 js,您可能想要签入 php(使用 login_head 操作)并且不将此 js 发送到您网站上的所有页面。但是在优化之前先让它工作。

如果提交没有到达后端,那可能是因为您的 javascript 使用与 wordpress 输入相同的 ID 重新创建输入,从而替换它们。据我所知,这根本不是你所追求的。只需替换现有标签即可。

于 2012-08-04T02:39:48.357 回答