Skip to content

Instantly share code, notes, and snippets.

@cuxaro
Last active October 4, 2024 09:45
Show Gist options
  • Save cuxaro/51e7b28a80608b76527d3aa2e54a6dc8 to your computer and use it in GitHub Desktop.
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.
<?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' => '',
));
});
@cuxaro
Copy link
Author

cuxaro commented Oct 4, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment