我一直在从事一个项目,在这个项目中,我必须通过单击submit按钮(Accept按钮)调用一个方法(接受用户id作为输入)。
我一直在尝试各种方法,但我面临的真正挑战是如何在前端获取用户id并将其传递给方法。
我的方法更新该特定用户的用户元。
Html code:
<div id="modal">
<div class="modalconent">
<h3 align=center>GDPR</h3>
<p>This is a GDPR Pop Up</p><br><br><br>
<form>
<input name="accept" type="checkbox" value="Gdpr" required/>I accept the GDPR
<input type="submit" id="accept-button" value="Accept">
</form>
</div>
</div>
<script>
window.onload = function () {
document.getElementById(\'accept-button\').onclick = function () {
document.getElementById(\'modal\').style.display = "none"
};
};
</script>
目前,单击“我的接受”按钮时仅显示“无”。我想在显示的同时调用该方法:none;
My PHP code:
function updateHasReadFlag($user) {
// I added support for using this function either with user ID or user object
if ( $user && is_int( $user ) ) {
$user_id = $user;
} else if ( ! empty( $user->ID ) ) {
$user_id = $user->ID;
} else {
return;
}
return update_user_meta( $user_id, \'META_KEY\', true );
}
The form code generated : <form method="post" action="<?php echo esc_url( home_url() ); ?>">
<input name="accept" type="checkbox" value="Gdpr" required=""> I accept the GDPR
<input type="submit" id="accept-button" value="Accept">
<!--?php wp_nonce_field( \'accept-gdpr\', \'accept_gdpr_nonce\' ); ?-->
</form>
我不理解为什么对nonce字段进行了注释。这正是生成的代码,我没有编辑代码中的任何内容。
最合适的回答,由SO网友:Sally CJ 整理而成
如果不想重新加载当前页面,可以使用AJAX;i、 e.单击“接受”按钮后,发出AJAX请求以更新用户元数据,所有操作都不离开当前页面。
然而,我提议的解决方案是使用AJAX,而不是使用AJAX;相反,我们只需提交表单(设置action
属性值),然后使用template_redirect
钩子以更新元数据(并重定向回上一页或引用页)。
这些步骤改变了form
标记到:
<form method="post" action="<?php echo esc_url( home_url() ); ?>">
并添加此
nonce 字段:
<?php wp_nonce_field( \'accept-gdpr\', \'accept_gdpr_nonce\' ); ?>
所以你的
form
现在看起来像:
<form method="post" action="<?php echo esc_url( home_url() ); ?>">
<input name="accept" type="checkbox" value="Gdpr" required /> I accept the GDPR
<input type="submit" id="accept-button" value="Accept" />
<?php wp_nonce_field( \'accept-gdpr\', \'accept_gdpr_nonce\' ); ?>
</form>
将此添加到主题中
functions.php
文件:
function accept_gdpr() {
// Check if the user is authenticated.
if ( ! is_user_logged_in() ) {
return;
}
// Check if we have all necessary data.
if ( empty( $_POST[\'accept_gdpr_nonce\'] ) || empty( $_POST[\'accept\'] ) ||
\'Gdpr\' !== $_POST[\'accept\'] ) {
return;
}
// Verify the nonce.
if ( ! wp_verify_nonce( $_POST[\'accept_gdpr_nonce\'], \'accept-gdpr\' ) ) {
return;
}
// Update the meta.
update_user_meta( get_current_user_id(), \'META_KEY\', \'1\' );
// Redirect back to the previous page.
wp_safe_redirect( wp_get_referer() );
exit;
}
add_action( \'template_redirect\', \'accept_gdpr\' );
Notes:
Gdpr
如中所示\'Gdpr\' !== $_POST[\'accept\']
与中的相同<input name="accept" type="checkbox" value="Gdpr" required />
在上面务必更换META_KEY
使用实际的元键
我认为GDPR的接受只针对登录用户,所以我使用了is_user_logged_in()
和get_current_user_id()
在上述代码/功能中。
更新wp_safe_redirect()
没有为OP工作,所以他用wp_redirect()
.
SO网友:LebCit
您需要使用wp_localize_script() 也可用here.
短篇小说:这是WordPress的通话方式PHP
在里面JS
因此您可以执行以下操作
FIRST 创建js
文件夹位于主题的根目录下,与样式处于同一级别。css,如果你还没有,那么在这个js
文件夹创建文件call-php.js
. 你可以随意命名,重要的是它必须是.js
在您的functions.php after 你的function updateHasReadFlag($user)
添加:
/**
* Hooking in JS code.
*/
function call_php_in_js() {
wp_enqueue_script( \'call-php-in-js\', get_template_directory_uri() . \'/js/call-php.js\', array( \'jquery\' ), filemtime( get_theme_file_path( \'/js/call-php.js\' ) ), true );
$php_to_js = array(
\'my_php_function\' => updateHasReadFlag( $user ),
);
wp_localize_script( \'call-php-in-js\', \'object_name\', $php_to_js );
}
add_action( \'wp_enqueue_scripts\', \'call_php_in_js\' );
SECOND, 在
call-php.js
文件添加:
( function( $ ) {
$( "#accept-button" ).click( function( e ) {
e.preventDefault();
$( "#modal" ).hide();
object_name.my_php_function;
});
} )( jQuery );
希望这能解决你的问题
我没有测试它,但它应该可以工作
测试后请告诉我。