6

そのため、ログインページの変更に再び取り組んでいます...別の問題に直面しています。シナリオは次のとおりです...ログイン/登録フォームのユーザー名フィールドを書き換えるスクリプトと、登録時に検証ハンドラーをオーバーライドする関数の 2 つのコンポーネントで構成されるプラグインがあります。

ここに問題のファイルがあります...

バリデータ.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);
                }
            }
        );
    }
});

問題は、wp_enqueue_script の行をそのまま (スクリプトがヘッダーに読み込まれている状態で) 記述すると、アクション関数は適切に処理されますが、書き換えが行われないことです。逆に、スクリプトがフッターにロードされるように変更すると、書き換えは発生しますが、アクションは適切に処理されなくなります (送信前にユーザー名フィールドがリセットされます)。私は完全に途方に暮れています。

2 つ目の (軽微な) 煩わしさ: ページの読み込みと書き換えの発生の間には、常にわずかな遅延があります。これをより透明にする方法についての考えは大歓迎です。

編集:質問に反対票を投じる場合、少なくともできることは理由を示すことです...

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 に答える