Trang chủ WordpressWordpress Development Hướng dẫn phân quyền User cho một Category

Hướng dẫn phân quyền User cho một Category

bởi

Hiện nay các doanh nghiệp và cá nhân đã sử dụng WordPress như một công cụ để làm việc và kinh doanh, với một trang web làm bằng WordPress và đa người dùng cùng quyền như nhau sẽ nảy sinh ra các vấn đề về phân quyền người dùng, đặc biệt WordPress là một trong các CMS “yếu” về phân quyền nhất nếu so với 3 mã nguồn lớn khác như Drupal, Joomla, PhPBB.

Hôm nay tôi cùng các bạn sẽ nghiên cứu một chủ đề khá thú vị này trong WordPress, tôi cũng thấy có ít người chia sẻ thông tin này nên mạo muội làm một bài viết về phân quyền người dùng đơn giản nhất, các bạn hãy đọc kỹ bài viết để hiểu về bản chất để áp dụng cho các tình huống khác nữa !

Vấn đề phân quyền người dùng

Vấn đề phân quyền người dùng trong đăng bài

Phần I: Tình huống về phân quyền

Một công ty có nhiều ngành nghề kinh doanh khác nhau và có hàng ngàn nhân viên cùng viết blog hoặc đăng nội dung cho một website có mã nguồn bằng WordPress, công ty này đặt category “Làm đẹp” là category mặc định, bỗng một hôm có một nhân viên buồn ngủ quá, đang trong lúc đăng bài viết về “cách nấu canh cá nóc kho tỏi” thì chả chọn category nào mà bấm submit luôn, vậy là chuyên mục mặc định được chỉ định vào trường hợp này, một category toàn các bài viết nói về làm đẹp, trắng da hiện lên một bài viết nấu cá nóc.

Sếp tức giận mà rằng: Bắt cậu này chỉ được đăng vào category nấu ăn thôi, nó không biết làm đẹp đâu … IT xử nhanh cho anh…

Thứ nữa, sếp muốn kiểm tra nhân viên của mình về năng lực và tốc độ viết, sếp cần biết rằng người này chỉ được đăng vào một category để quy trách nhiệm cho rõ ràng, không thể nhầm lẫn và chối cãi.

Phần II: Phân tích vấn đề

Như đã nói ở trên, do vô tình mà anh editor đã đăng nhầm bài đăng của mình sang một category khác mà bạn ấy không được phép đăng lên, nhưng vì mặc định của WordPress là bài viết nào mà không chọn category thì sẽ về chuyên mục mặc định, ngoài ra sẽ còn nhiều tình huống khác nảy sinh trong tương lai như chọn nhầm category, hoặc làm những việc ngoài chuyên môn của mình, trong tình huống này ta phân tích dữ liệu như sau:

1.Super Admin có quyền đăng mọi thứ và mọi lúc mọi nơi.

2. Author sẽ chỉ được đăng vào một chuyên mục nếu anh ấy bị chỉ định như thế, những người dùng khác không ảnh hưởng.

3. Cần phải gán được giá trị của Category ID vào Author để xác định anh ấy chỉ có quyền đăng vào Category ID ấy.

4. Không cho phép anh ấy chọn bất kỳ một category nào từ checkbox trong editor nhằm tránh “lộn” thêm nữa.

Phần III: Triển khai

Vấn đề thứ nhất: SuperAdmin sẽ chỉ định một người vào một category

Để làm được việc này cần phải hook được vào phần Profile của user, thêm một lựa chọn cho admin là người này có phải chỉ định vào một category không, sau đó kiểm tra nếu là admin thì thêm dữ liệu cấm vào anh User này, tôi lấy ví dụ hình ảnh sau:

Trong phần edit user sẽ hiện thêm một dropdown Box để lựa chọn

Trong phần edit user sẽ hiện thêm một dropdown Box để lựa chọn

Ta sẽ sử dụng code sau để hook vào:

add_action('show_user_profile', 'restrict_user_form');
add_action('edit_user_profile', 'restrict_user_form');

function restrict_user_form($user)
{
$args = array(
'show_option_all' => '',
'show_option_none' => '',
'orderby' => 'ID',
'order' => 'ASC',
'show_count' => 0,
'hide_empty' => 0,
'child_of' => 0,
'exclude' => '',
'echo' => 1,
'selected' => get_user_meta($user->ID, '_access', true),
'hierarchical' => 0,
'name' => 'allow',
'id' => '',
'class' => 'postform',
'depth' => 0,
'tab_index' => 0,
'taxonomy' => 'category',
'hide_if_empty' => false,
'walker' => ''
);
?>

<h3>Restrict Author Post to a category</h3>

<table>
<tr>
<th><label for="access">Writing to:</label></th>

<td>
<?php wp_dropdown_categories($args); ?>
<br />
<span>Use to restrict an author posting to just one category.</span>
</td>
</tr>

</table>
<?php }

Trong code này tôi có sử dụng hàm wp_dropdown_categories để list một cái dropdown cho người quản trị lựa chọn quyền hạn của người dùng này vào category nào.

Tiếp theo ta cần hứng lấy giá trị khi bấm nút cập nhật người dùng:

add_action('personal_options_update', 'restrict_save_data');
add_action('edit_user_profile_update', 'restrict_save_data');

function restrict_save_data($user_id)
{
if (!current_user_can('administrator', $user_id))
return false;
update_user_meta($user_id, '_access', $_POST['allow']);
}

Vậy là tôi đã đặt thêm cho người dùng một meta có tên là “_access”, tôi kiểm tra bằng hàm current_user_can để “ăn chắc” rằng người dùng không nhìn thấy các giá trị này mà tự thay đổi.

Editor không thể nhìn thấy Dropdown box này mà thay đổi

Editor không thể nhìn thấy Dropdown box này mà thay đổi

Tiếp theo ta tạo hàm để kiểm tra xem người này có bị hạn chế bài đăng của mình trong category không, ta có như sau:

function is_restrict()
{
if (get_user_meta(get_current_user_id(), '_access', true) != '')
return true;
else
return false;
}

Vấn đề thứ hai: Bản thân anh Editor sẽ thấy gì và làm được gì ?

Trước tiên cần phải báo cho anh ta biết là anh ta đã được chỉ định vào một category và chỉ được đăng vào đó thôi, ta có hình:

Thông báo cho người Editor biết mình bị hạn chế

Thông báo cho người Editor biết mình bị hạn chế

Ta sẽ dùng code sau:

add_action('edit_form_after_title', 'restrict_warning');
function restrict_warning($post_data = false)
{
if (is_restrict()) {
$c    = get_user_meta(get_current_user_id(), '_access', true);
$data = get_category($c);
echo 'Bạn chỉ được đăng bài viết vào chuyên mục: <strong>' . $data->name . '</strong><br /><br />';
}
}

Vậy là anh ta đã biết, nhưng biết để làm gì nếu vẫn còn checkbox category bên phải editor ? Ta sẽ dấu nó đi như thế này:

Dấu category Checkbox đi nếu bị hạn chế

Dấu category Checkbox đi nếu bị hạn chế

Ta sẽ kiểm tra người dùng, nếu bị hạn chế thì dấu luôn cái category checkbox đi nhằm không cho anh ta chọn nữa, ta dùng code sau:

function restrict_remove_meta_boxes()
{
if (is_restrict())
remove_meta_box('categorydiv', 'post', 'normal');
}
add_action('admin_menu', 'restrict_remove_meta_boxes');

Ta dùng hàm is_restrict() đã được lập bên trên để kiểm tra, nếu anh ta đúng là bị giới hạn thì dùng hook remove_meta_box để dấu đi.

Nhưng anh ta là một người lập trình và có tính táy máy, chúng ta cần phải chắc chắn rằng anh ta đang không có truyền vào một biến cat_id nào, okey ta sẽ giải quyết bài toán bằng cách “hứng” các giá trị khi anh ta viết bài, tìm cat mà anh ta bị hạn chế và cho bài viết vào đó, để chắc chắn rằng anh ta không táy máy vào bất kỳ một category nào nữa, ta dùng code sau:

add_action('save_post', 'save_restrict_post');
function save_restrict_post($post_id)
{
if (!wp_is_post_revision($post_id) && is_restrict()) {
remove_action('save_post', 'save_restrict_post');
wp_set_post_categories($post_id, get_user_meta(get_current_user_id(), '_access', true));
add_action('save_post', 'save_restrict_post');
}
}

Ta dùng hàm wp_set_post_categories, như vậy dù anh ta cố tình hay vô ý cũng không thể nào đăng bài vào category khác được.

Tới đây các bạn đã hoàn thành công việc sếp giao phó, hãy cho nó vào một plugin và đóng gói lại, cài vào trong trang web của bạn. Mọi thứ sẽ hoàn hảo.

Sử dụng plugin

Nếu bạn không muốn làm theo tutorial này, các bạn có thể làm dễ dàng bằng cách sử dụng plugin Restrict Author Posting mà tôi đã viết từ bài viết này và sử dụng.

Phần IV: Tổng kết

Vậy là ta đã làm xong một việc là bắt anh editor hay ngủ gật chỉ được đăng vào category chỉ định, anh ta giờ đã không thể nào đăng được vào các category khác, nhầm lẫn hay cố tình cũng không thể rồi.

Qua bài viết này các bạn đã biết cách phân quyền cho người dùng bằng các hàm và các hook đã có sẵn trong CMS mà hoàn toàn không phải vất vả viết code chút nào đúng không ? Một bài toán thì luôn có các cách giải khác nhau để về cùng kết quả, tôi hi vọng với các kiến thức đơn giản tôi vừa trình bày các bạn sẽ có cách hay hơn nữa để phân quyền cho người dùng làm các công việc khác nhau trong một trang web.

Đây là tình huống có thật tôi đã lấy làm ví dụ, và cũng rất cảm ơn người bạn đó đã chia sẻ câu chuyện để tôi có hứng thú viết bài viết này.

Nếu bạn cần trợ giúp hoặc có vướng mắc gì hãy để lại lời nhắn cuối bài viết để chúng tôi trợ giúp nhé!

Có thể bạn quan tâm

Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng.