Last active
October 4, 2024 09:45
-
-
Save cuxaro/51e7b28a80608b76527d3aa2e54a6dc8 to your computer and use it in GitHub Desktop.
Crear poderes de Sudo, para que el usuario pueda acceder a un role superior durante un tiempo limitado.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Acción para registrar el widget en el dashboard | |
add_action('wp_dashboard_setup', 'ibp_add_sudo_role_dashboard_widget'); | |
function ibp_add_sudo_role_dashboard_widget() | |
{ | |
wp_add_dashboard_widget( | |
'ibp_sudo_role_dashboard_widget', // ID del widget | |
'Sudo Role', // Título del widget | |
'ibp_sudo_role_dashboard_widget_display' // Función que muestra el contenido del widget | |
); | |
} | |
function ibp_sudo_role_dashboard_widget_display() | |
{ | |
$user_id = get_current_user_id(); | |
// Obtener el rol desde ACF | |
$acf_role = sanitize_text_field(get_field('role_sudo', 'user_' . $user_id)); | |
//filter hook to modify the role | |
$acf_role = apply_filters('ibp_sudo_role', $acf_role, $user_id); | |
// Si no hay rol asignado en ACF, mostrar un mensaje y salir de la función | |
if (empty($acf_role)) { | |
echo '<p>No tienes ningún rol sudo asignado.</p>'; | |
return; | |
} | |
$user = new WP_User($user_id); | |
// Verificar si el usuario ya tiene el rol activado | |
if (in_array($acf_role, $user->roles)) { | |
// Si el usuario ya tiene el rol, mostrar el botón "Desactivar Sudo Role" | |
if (isset($_POST['ibp_deactivate_sudo_role']) && check_admin_referer('ibp_deactivate_sudo_role_nonce')) { | |
ibp_remove_sudo_role_immediately($user_id, $acf_role); // Eliminar el rol inmediatamente | |
echo '<script type="text/javascript">window.location.reload();</script>'; // Recargar la página | |
} | |
echo '<form method="post">'; | |
wp_nonce_field('ibp_deactivate_sudo_role_nonce'); | |
submit_button('Desactivar Sudo Role', 'primary', 'ibp_deactivate_sudo_role'); | |
echo '</form>'; | |
} else { | |
// Si el usuario no tiene el rol, mostrar el botón "Activar Sudo Role" | |
if (isset($_POST['ibp_activate_sudo_role']) && check_admin_referer('ibp_activate_sudo_role_nonce')) { | |
ibp_assign_temporary_sudo_role($user_id); // Asignar el rol temporal | |
echo '<script type="text/javascript">window.location.reload();</script>'; // Recargar la página | |
} | |
echo '<cite>"Un gran poder conlleva una gran responsabilidad."</cite><br>'; | |
echo '<form method="post">'; | |
wp_nonce_field('ibp_activate_sudo_role_nonce'); | |
submit_button('Activar Sudo Role', 'primary', 'ibp_activate_sudo_role'); | |
echo '</form>'; | |
} | |
} | |
// Función para eliminar el rol de manera inmediata | |
function ibp_remove_sudo_role_immediately($user_id, $role) | |
{ | |
//filer hook to modify the role | |
$role = apply_filters('ibp_sudo_role', $role, $user_id); | |
// Validar que el ID del usuario y el rol sean válidos | |
if (!is_numeric($user_id) || empty($role)) { | |
return; // Detener si los parámetros son inválidos | |
} | |
$user = new WP_User($user_id); | |
// Remover el rol adicional si el usuario lo tiene | |
if (in_array($role, $user->roles)) { | |
$user->remove_role($role); | |
do_action('ibp_sudo_role_removed', $user_id, $role); | |
echo '<p>Rol sudo desactivado.</p>'; | |
} else { | |
echo '<p>No tienes el rol sudo asignado.</p>'; | |
} | |
} | |
// Asignar el rol temporal y programar la eliminación en 2 horas | |
function ibp_assign_temporary_sudo_role($user_id) | |
{ | |
// Obtener el rol del campo ACF | |
$acf_role = sanitize_text_field(get_field('role_sudo', 'user_' . $user_id)); | |
//filter hook to modify the role | |
$acf_role = apply_filters('ibp_sudo_role', $acf_role, $user_id); | |
// Validar que el rol existe y es válido | |
if (empty($acf_role) || !in_array($acf_role, array_keys(wp_roles()->roles))) { | |
wp_die('Rol no válido o no asignado.'); // Detener si el rol no es válido o no existe | |
} | |
$user = new WP_User($user_id); | |
// Verificar si el usuario ya tiene el rol | |
if (in_array($acf_role, $user->roles)) { | |
echo '<p>Ya tienes este rol asignado.</p>'; | |
return; | |
} | |
// Asignar el rol temporal | |
$user->add_role($acf_role); | |
// Generar un evento único para eliminar el rol en 2 horas | |
if (!wp_next_scheduled('ibp_remove_sudo_role', array($user_id, $acf_role))) { | |
//filter tiempo por defecto de sudo role | |
$tiempo = time() + 2 * HOUR_IN_SECONDS; | |
$tiempo = apply_filters('ibp_sudo_role_time', $tiempo, $user_id, $acf_role); | |
wp_schedule_single_event($tiempo, 'ibp_remove_sudo_role', array($user_id, $acf_role)); | |
} | |
echo '<p>Rol sudo activado durante 2 horas.</p>'; | |
} | |
// Hook para remover el rol después de 2 horas | |
add_action('ibp_remove_sudo_role', 'ibp_remove_sudo_role_callback', 10, 2); | |
function ibp_remove_sudo_role_callback($user_id, $role) | |
{ | |
// Validar ID de usuario y rol | |
if (!is_numeric($user_id) || empty($role)) { | |
return; // Detener si los parámetros son inválidos | |
} | |
$user = new WP_User($user_id); | |
// Remover el rol adicional si el usuario todavía lo tiene | |
if (in_array($role, $user->roles)) { | |
$user->remove_role($role); | |
} | |
} | |
add_action('acf/include_fields', function () { | |
if (! function_exists('acf_add_local_field_group')) { | |
return; | |
} | |
// Solo los administradores pueden ver este campo | |
if (!current_user_can('administrator')) { | |
return; // No mostrar el campo si no es administrador | |
} | |
acf_add_local_field_group(array( | |
'key' => 'group_66fdb82fcce01', | |
'title' => 'Sudo Role', | |
'fields' => array( | |
array( | |
'key' => 'field_66fdb81a2a80b', | |
'label' => 'Role Sudo', | |
'name' => 'role_sudo', | |
'aria-label' => '', | |
'type' => 'acfe_user_roles', | |
'instructions' => '', | |
'required' => 0, | |
'conditional_logic' => 0, | |
'wrapper' => array( | |
'width' => '', | |
'class' => '', | |
'id' => '', | |
), | |
'user_role' => array( | |
0 => 'administrator', | |
1 => 'editor', | |
), | |
'field_type' => 'select', | |
'default_value' => array( | |
0 => 'Editor', | |
), | |
'allow_null' => 1, | |
'multiple' => 0, | |
'ui' => 0, | |
'placeholder' => 'Selecciona Role sudo', | |
'allow_in_bindings' => 0, | |
'choices' => array(), | |
'ajax' => 0, | |
'search_placeholder' => '', | |
'layout' => '', | |
'toggle' => 0, | |
'allow_custom' => 0, | |
), | |
), | |
'location' => array( | |
array( | |
array( | |
'param' => 'user_form', | |
'operator' => '==', | |
'value' => 'all', | |
), | |
array( | |
'param' => 'user_role', | |
'operator' => '==', | |
'value' => 'editor', | |
), | |
), | |
array( | |
array( | |
'param' => 'user_form', | |
'operator' => '==', | |
'value' => 'all', | |
), | |
array( | |
'param' => 'user_role', | |
'operator' => '==', | |
'value' => 'author', | |
), | |
), | |
), | |
'menu_order' => 0, | |
'position' => 'normal', | |
'style' => 'default', | |
'label_placement' => 'left', | |
'instruction_placement' => 'label', | |
'hide_on_screen' => '', | |
'active' => true, | |
'description' => '', | |
'show_in_rest' => 0, | |
'acfe_display_title' => '', | |
'acfe_autosync' => '', | |
'acfe_form' => 0, | |
'acfe_meta' => '', | |
'acfe_note' => '', | |
)); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Se usa ACF para crear el campo en el perfil de usuari.
Ese role unicamente lo podrá editar el administrador del site.
A cada usuario se le podrá asignar un role al apretar sudo (limitado por defecto a Administrador y Editor)
Se cambiará el role y se generará un wp-cron para que en 2 horas elimine el role que se le ha asigando extra
Se podrá activar pulsando en el botón que saldrá en el widget del Dashboard
Si se quiere eliminar antes el role se puede pulsar en el botón que saldrá en el dashboard