所以Wordfence 使用JavaScript将验证码字段添加到登录/注册表单中,但默认情况下仅在https://example.com/wp-login.php
.
如果要将字段添加到表单中,或将CAPTCHA安全性与自定义登录表单集成,请执行以下步骤:
将(重新)验证码脚本排队,最好仅在具有自定义表单的页面上:
add_action( \'wp_enqueue_scripts\', function () {
if ( is_page( \'my-page\' ) &&
class_exists( \'\\WordfenceLS\\Controller_WordfenceLS\' )
) {
\\WordfenceLS\\Controller_WordfenceLS::shared()->_login_enqueue_scripts();
}
} );
以上内容将仅在
my-page
页,因此您应该更改slug或使用另一个条件标记,如
is_single()
.
您的自定义表单必须满足以下条件:
用户名字段必须命名log
(例如。<input name="log" />
).
密码字段必须命名pwd
(例如。<input name="pwd" />
).
“提交”按钮的id
必须是wp-submit
(例如。<input id="wp-submit" type="submit" />
).
不得有其他表单包含这些字段,即不得有其他表单字段包含same name
or id
.
Wordfence将运行AJAX请求来检查凭据,当出现错误(如密码错误)时,Wordfence将在h1
(标题级别1)在元素内部id
属于login
.
所以你需要确保这两个要素(#login
和#login > h1
) 两者都存在&mdash;请参见下面的示例表单代码。
不幸的是,这些都是Wordfence自定义登录脚本中的限制,您可以在wp-content/plugins/wordfence/modules/login-security/js
文件名如下所示login.1581523568.js
(即。login.<numbers>.js
). 您可以复制和修改脚本(即删除这5个限制),然后将其排入队列,而不是默认值,但您需要自己尝试这样做。
此外,如果您使用wp_login_form()
(带有自定义action
值),您只需要添加上面#5中提到的元素。
Code I used for testing:
表单,如所示
https://example.com/my-page/
:
<div id="login">
<h1>Login</h1>
<!-- Wordfence places AJAX error here -->
<form method="post" action="">
<input name="log" type="text" placeholder="Username" />
<input name="pwd" type="password" placeholder="Password" />
<input type="hidden" name="action" value="my_login" />
<?php wp_nonce_field( \'my-login\' ); ?>
<input type="submit" id="wp-submit" />
</form>
</div>
PHP调用
wp_signon()
:
add_action( \'init\', function () {
if (
wp_doing_ajax() || empty( $_POST[\'_wpnonce\'] ) ||
( ! ( isset( $_POST[\'log\'], $_POST[\'pwd\'] ) ) ) ||
! wp_verify_nonce( $_POST[\'_wpnonce\'], \'my-login\' )
) {
return;
}
$creds = array();
$creds[\'user_login\'] = $_POST[\'log\'];
$creds[\'user_password\'] = $_POST[\'pwd\'];
$creds[\'remember\'] = true;
$user = wp_signon( $creds, false );
if ( is_wp_error( $user ) ) {
wp_die( $user );
} else {
wp_redirect( home_url( wp_get_referer() ) );
exit;
}
} );
附加注释
如我在评论中所述,如果您只想在执行以下操作时绕过验证码验证
wp_signon()
, 您可以使用
wordfence_ls_require_captcha
filter:
add_filter( \'wordfence_ls_require_captcha\', \'__return_false\' );
// call wp_signon() here
remove_filter( \'wordfence_ls_require_captcha\', \'__return_false\' );