Created
December 15, 2022 20:10
-
-
Save artikus11/e616e06dff1db8f1433081d70c8128d5 to your computer and use it in GitHub Desktop.
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 | |
class Blow_Roles { | |
public function __construct() { | |
$this->hooks(); | |
} | |
function hooks() { | |
add_filter( 'pre_update_option_rewrite_rules', [ $this, 'flush_roles' ] ); | |
add_filter( 'woocommerce_new_customer_data', [ $this, 'role_new_customer' ] ); | |
add_filter( 'manage_users_columns', [ $this, 'manage_users_columns' ] ); | |
add_filter( 'manage_users_custom_column', [ $this, 'manage_users_custom_column' ], 10, 3 ); | |
add_action( 'template_redirect', [ $this, 'guest_redirect' ] ); | |
add_action( 'admin_footer-users.php', [ $this, 'assets' ] ); | |
add_action( 'wp_ajax_change-role', [ $this, 'ajax_change_role' ] ); | |
add_filter( 'user_has_cap', [ $this, 'add_user_has_capabilities' ], 10, 4 ); | |
add_filter( 'map_meta_cap', [ $this, 'add_temp_capabilities' ], 10, 4 ); | |
} | |
/** | |
* Добавления прав просмотра заказов и смены статусов | |
* | |
* @param $allcaps | |
* @param $caps | |
* @param $args | |
* @param $user | |
* | |
* @return mixed | |
*/ | |
public function add_user_has_capabilities( $allcaps, $caps, $args, $user ) { | |
if ( ! empty( $allcaps['administrator'] ) ) { | |
$allcaps['switch_status'] = true; | |
$allcaps['view_order'] = true; | |
} | |
if ( ! empty( $allcaps['npa'] ) ) { | |
$allcaps['switch_status'] = true; | |
$allcaps['view_order'] = true; | |
} | |
if ( ! empty( $allcaps['beginner'] ) ) { | |
$allcaps['switch_status'] = true; | |
$allcaps['view_order'] = true; | |
} | |
return $allcaps; | |
} | |
/** | |
* Разрешает пользователю просмотр заказа "дочернего" пользователя. | |
* | |
* @param string[] $caps Текущие права пользователя. | |
* @param string $cap Текущее название проверяемого права. | |
* @param int $user_id ID юзера. | |
* @param array $args Adds the context to the cap. Typically the object ID. | |
* | |
* @return string[] | |
* | |
*/ | |
public function add_temp_capabilities( $caps, $cap, $user_id, $args ) { | |
if ( $cap !== 'view_order' ) { | |
return $caps; | |
} | |
$order = wc_get_order( $args[0] ); | |
// Разрешаем видеть свои заказы | |
if ( $order && $user_id === $order->get_user_id() ) { | |
return $caps; | |
} | |
// Разрешаем видеть заказы партнеров | |
if ( $caps[0] !== 'read_shop_order' && ! is_admin() && is_view_order_page() ) { | |
// Кто сделал заказ | |
$customer_id = $order->get_customer_id(); | |
// "Дочерние" пользователи текущего пользователя | |
$users = array_map( | |
function ( $user ) { | |
return (int) $user['user']->data->ID; | |
}, | |
blow_get_user_children( [ 'npa', 'beginner', 'guest' ], $user_id ) | |
); | |
// Есть ли в списке "дочерних" пользователей тот, кто сделал заказ | |
if ( ! in_array( $customer_id, $users ) ) { | |
$caps[0] = 'read_shop_order'; | |
} | |
} | |
return $caps; | |
} | |
/** | |
* Удаляет и заново добавляет роли проекта. | |
* | |
* @param mixed $value | |
* | |
* @return mixed | |
*/ | |
function flush_roles( $value ) { | |
$this->remove_roles(); | |
$this->add_roles(); | |
return $value; | |
} | |
function remove_roles() { | |
remove_role( 'npa' ); | |
remove_role( 'beginner' ); | |
remove_role( 'guest' ); | |
} | |
function add_roles() { | |
add_role( 'npa', 'НПА' ); | |
add_role( 'beginner', 'Новичок' ); | |
add_role( 'guest', 'Гость' ); | |
} | |
/** | |
* Изменяет роль при регистрации с "customer" на "guest". | |
* | |
* @param array $data | |
* | |
* @return array | |
*/ | |
function role_new_customer( $data ) { | |
$data['role'] = 'guest'; | |
return $data; | |
} | |
/** | |
* Запрещает "Новичку" просматривать страницы магазина и перенаправляет в личный кабинет. | |
* | |
* @return void | |
*/ | |
function guest_redirect() { | |
if ( is_woocommerce() && current_user_can( 'guest' ) ) { | |
wp_redirect( wc_get_account_endpoint_url( 'dashboard' ), 301 ); | |
exit; | |
} | |
} | |
function manage_users_columns( $columns ) { | |
unset( $columns['posts'] ); | |
$columns['activity'] = 'Действия'; | |
return $columns; | |
} | |
function manage_users_custom_column( $output, $column_name, $user_id ) { | |
if ( $column_name === 'activity' ) { | |
if ( user_can( $user_id, 'guest' ) ) { | |
$output = sprintf( '<button type="button" class="change-role button secondary-button" data-id="%d">Сделать Новичком</button>', $user_id ); | |
} else { | |
$output = '---'; | |
} | |
} | |
return $output; | |
} | |
function assets() { | |
?> | |
<style> | |
.change-role { | |
cursor: pointer; | |
} | |
</style> | |
<script> | |
( | |
function( $ ) { | |
$( '.change-role' ).click( function() { | |
var $btn = $( this ); | |
$btn.prop( 'disabled', true ); | |
$btn.text( 'Подождите...' ); | |
$.get( ajaxurl, { | |
action: 'change-role', | |
id: $btn.data( 'id' ), | |
}, function() { | |
$btn.closest( 'tr' ).find( '.column-role' ).text( 'Новичок' ); | |
$btn.text( 'Готово!' ); | |
} ); | |
} ); | |
} | |
)( jQuery ); | |
</script> | |
<?php | |
} | |
function ajax_change_role() { | |
if ( current_user_can( 'manage_woocommerce' ) ) { | |
wp_update_user( | |
[ | |
'ID' => filter_input( INPUT_GET, 'id', FILTER_VALIDATE_INT ), | |
'role' => 'beginner', | |
] | |
); | |
} | |
die(); | |
} | |
} | |
new Blow_Roles; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment