Skip to content

Instantly share code, notes, and snippets.

@artikus11
Created December 15, 2022 20:10
Show Gist options
  • Save artikus11/e616e06dff1db8f1433081d70c8128d5 to your computer and use it in GitHub Desktop.
Save artikus11/e616e06dff1db8f1433081d70c8128d5 to your computer and use it in GitHub Desktop.
<?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