Отключить назначение роли пользователя при переходе по URL
Есть сайт на WordPress. У меня есть функция: назначить роль n_course2 если пользователь перешел по URL site.com/c1-projden
add_action('wp', 'add_new_role_2', 10, 2);
function add_new_role_2() {
global $wp;
$current_slug = add_query_arg( array(), $wp->request );
if (is_user_logged_in() && $current_slug == 'c1-projden') {
$u = new WP_User( get_current_user_id() );
$u->set_role( 'n_course2' );
}
}
Как отключить эту функцию (или перестать назначать роль), если URL site.com/c1-projden в определенный промежуток времени редиректит на другую страницу?
Ответы (1 шт):
пример того как вы можете назначить пользователю который перешел на эту страницу роль через ajax после того как он начнет скролить страницу (js ивент можно заменить на любой другой). Так же это будет работать если пользователь авторизированный и у него еще нет такой роли. Для пользователей с ролью администратор я думаю не стоит присваивать эту роль поэтому ajax для них не выполняется. Так же я бы хотел обратить ваше внимание на то что метод set_user_role перезапишет текущие роли пользователя, возможно лучшим вариантом будет использовать add_user_role что бы добавить к текущей роли еще одну
add_action( 'wp_footer', 'add_setting_user_role_script' );
function add_setting_user_role_script() {
global $post;
if ( $post->post_name !== 'c1-projden' || ! is_user_logged_in() ) {
return;
}
$user = wp_get_current_user();
if ( in_array( 'n_course2', (array) $user->roles ) || current_user_can( 'manage_options' ) ) {
return;
}
?>
<script>
jQuery( function( $ ) {
let setRoleAction = false;
$( document ).on( 'scroll', function() {
if ( setRoleAction ) {
return;
}
let data = {
action: 'set_user_role',
nonce: '<?php echo wp_create_nonce( 'role_nonce' ); ?>',
};
setRoleAction = true;
$.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>' , data, function( response ) {
if ( response.success ) {
console.log( response.data );
}
} );
} );
} );
</script>
<?php
}
add_action( 'wp_ajax_set_user_role', 'wp_ajax_set_user_role_callback' );
function wp_ajax_set_user_role_callback() {
if ( ! wp_verify_nonce( $_POST['nonce'], 'role_nonce' ) ) {
wp_send_json_error( 'Nonce not valid' );
}
$current_user = new WP_User( get_current_user_id() );
$current_user->set_role( 'n_course2' );
wp_send_json_success( 'Set role success' );
}