Cách thêm Guest Author cho WordPress (P2)

cách thêm guest author cho wordpress 2

Kết thúc phần 1 ở bài hướng dẫn trước, chúng ta đã tạo được tính năng cho phép người dùng tự đăng ký tài khoản với vai trò là Guest Author, và họ có thể tự đăng bài viết lên web từ frontend.

Tuy nhiên, nếu dừng ở bước này thì khi Guest Author nhấn nút Submit bài viết từ trang Publish Post thì bài viết sẽ tự động được đăng lên web, tức ở trạng thái “Published” (Đã đăng) ngay lập tức.

Bài viết sẽ ở trạng thái Đã đăng

Bài viết sẽ ở trạng thái Đã đăng

Làm như vậy thì chúng ta rất khó kiểm soát và đảm bảo chất lượng nội dung các bài đăng. Vì vậy, bước tiếp theo, mình sẽ tiếp tục dùng Meta Box để tạo các tính năng kiểm duyệt và quản lý bài viết (yêu cầu số 3 và 4).

Thay đổi trạng thái mặc định của các bài viết từ Guest Author

Các bài viết từ Guest Author sẽ cần phải kiểm duyệt trước khi đăng. Vì vậy, khi bài viết được submit lên hệ thống, sẽ cần phải được chuyển về trạng thái chờ duyệt trước đã. Để làm được như vậy thì bạn chỉ cần thao tác khá đơn giản như sau:

Truy cập vào giao diện chỉnh sửa trang Publish Post đã tạo ở phần 1, thêm tham số post_status=“Pending” vào đoạn shortcode ở ô nội dung:

Thêm tham số vào shortcode

Thêm tham số vào shortcode

Bạn lưu trang lại, và thử đăng bài một lần nữa nhé. Bạn sẽ thấy bài viết được chuyển về chế độ Chờ duyệt (Pending).

Trạng thái “Pending” của bài viết sau khi Guest Author đăng bài

Trạng thái “Pending” của bài viết sau khi Guest Author đăng bài

Tạo chức năng quản lý bài viết cho Guest Author

Mình sẽ tạo danh sách các bài viết của Guest Author vào ngay trang My Account. Mình sử dụng thư viện Bootstrap để tạo giao diện Navs giúp chia ra hai tab là: Account, và Your Post.

Giao diện mẫu với thư viện Bootstrap

Giao diện mẫu với thư viện Bootstrap

Tab Account chính là trang My Account lúc trước có kèm các trường thông tin về tài khoản mà mình đã tạo lúc đầu. Bây giờ, mình sẽ tạo tab Your Post.

Mình tiếp tục sử dụng thư viện Bootstrap để tạo Table cho danh sách các bài viết.

Danh sách bài viết của Guest Author

Danh sách bài viết của Guest Author

Từ đây, mình sẽ cần dùng code và các function có sẵn để thao tác tiếp các bước:

  1. Lấy thông tin user hiện tại
  2. Lấy ra tất cả các bài viết thuộc user hiện tại
  3. Trỏ title của các bài viết ở trạng thái “pending” đến link chỉnh sửa bài đó

Bước 1: Lấy thông tin user hiện tại

Để lấy thông tin user, chúng ta thêm hàm wp_get_current_user() vào file page-account.php như sau:

<?php
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
$user_email = $current_user->user_email;
?>

Trong đó:

$current_user: thông tin user hiện tại dưới dạng một Object
$user_id: lấy ID của user
$user_email: lấy email của user

Bạn cũng có thể thêm các biến khác vào để lấy thêm các thông tin khác của user, tùy theo nhu cầu của bạn.

Bước 2: Lấy danh sách các bài đăng từ người dùng hiện tại

Tương tự như ở bước 1, mình thêm hàm sau vào file page-account.php:

$args_post_by_author = array(
'author'         => $user_id,
'posts_per_page' => -1,
'post_status'    => array('publish', 'pending')
);
$posts_author = get_posts($args_post_by_author);

Trong đó:

  • $arg_post_by_author: mảng chứa tất cả các tham số ràng buộc cho việc trích xuất thông tin
  • $post_author: danh sách các bài viết được trích xuất bởi mảng trên

Ở đây, mình ràng buộc 3 tham số như dưới đây để trích xuất thông tin bài viết:

  • author: dùng $user_id để lấy ID của người dùng đã đăng bài
  • post_per_page: số lượng bài viết hiển thị tối đa trên một trang. Nếu bạn muốn hiển thị tất cả bài viết cùng trên 1 trang, thì đặt giá trị là -1 giống mình
  • post_status: Là tình trạng của bài viết. Mình dùng một mảng chứa 2 thành phần là “publish” và “pending” để thể hiện tình trạng của bài viết

Đến đây là bạn đã hoàn thành khoảng 70% việc tạo tính năng quản lý bài viết cho Guest Author rồi đó. Lúc này, bạn sẽ thấy cả tài khoản admin và Guest Author đều xem được danh sách các bài viết mà họ đã đăng tải.

Tab “Your Post” của user là admin

Tab “Your Post” của user là admin

Đây là toàn bộ đoạn code của mình cho các bước trên đây, bạn có thể tham khảo nhé:

Bước 3: Đặt link chỉnh sửa bài viết lên danh sách quản lý bài viết

Lúc này, tuy các Guest Author đều có thể xem danh sách các bài viết và tình trạng của chúng, nhưng lại chưa thể chỉnh sửa bài được. Vì vậy, chúng ta sẽ tiếp tục thao tác tiếp để dẫn link từ từng bài viết đến trang chỉnh sửa của chính bài viết đó.

Với sự hỗ trợ của MB Frontend Submission, bạn chỉ cần thêm đoạn code ?rwmb_frontend_field_post_id=123 (trong đó id=123 tức là sửa bài viết có ID là 123) vào URL của trang Publish Post là có thể chỉnh sửa được bài viết bất kì.

Ví dụ như link của mình là: http://localhost/metabox/publish-post/?rwmb_frontend_field_post_id=316

Giao diện trang chỉnh sửa bài đã được đăng

Giao diện trang chỉnh sửa bài đã được đăng

Nhưng nếu chỉ làm đơn giản như vậy thôi, thì ai cũng có thể sửa bất kỳ bài viết nào, kể cả là bài do người khác đăng, hoặc các bài đã được đăng rồi. Nhưng vậy sẽ rất nguy hiểm và bạn không thể kiểm soát nội dung được.

Vì vậy, chúng ta sẽ cần yêu cầu user đăng nhập khi vào link chỉnh sửa bài (cái này mình đã làm ở phần 1 rồi), và đặt điều kiện để được phép truy cập link trên, sau đó mới cho link hiển thị ra giao diện quản lý danh sách bài viết.

3.1. Kiểm tra thông tin bài viết và so sánh điều kiện

Chúng ta sẽ dùng hàm $_GET[‘param’] để lấy các thông số của bài viết. Ta gán $post_id cho giá trị tham số đó:

$post_id = $_GET['rwmb_frontend_field_post_id'];

Trích xuất tác giả và trạng thái của bài viết bằng post_id:

$author_id = get_post_field ('post_author', $post_id);
$post_status = get_post_field ('post_status', $post_id);

Lấy ID của user hiện tại:

$current_user = wp_get_current_user();
$user_id = $current_user->ID;

Khi đã có tất cả các giá trị trên, chúng ta sẽ kiểm tra xem các thông tin sau có khớp với nhau không:

  • $author_id = $user_id;
  • $post_status = pending;

Cả hai điều kiện trên đều cần phải đúng thì Guest Author mới được quyền truy cập vào đường dẫn chỉnh sửa bài viết. Để làm được việc đó thì ta dùng lệnh IF ELSE để kiểm tra vào cho hiển thị.

if ($_GET['rwmb_frontend_field_post_id']) {
    echo ‘Yes’;
} else {
    echo ‘No’;
}

Kết quả là nếu bài viết không phải của tác giả đó, hoặc là bài viết đã được admin duyệt thì Guest Author sẽ không thể chỉnh sửa được như sau:

Guest Author không thể chỉnh sửa bài viết khi không đáp ứng được 1 trong 2 yêu cầu ở trên

Guest Author không thể chỉnh sửa bài viết khi không đáp ứng được 1 trong 2 yêu cầu ở trên

Bạn mở file publish-post.php trong thư mục theme và đưa đoạn code dưới đây vào. Lưu ý là bạn có thể tùy chỉnh đoạn code này cho phù hợp với website của bạn nhé.

3.2. Hiển thị đường dẫn trang chỉnh sửa bài viết ra giao diện

Quay trở lại file page-account.php, bạn thêm một cột vào bảng danh sách của các bài viết để hiển thị đường dẫn đến trang chỉnh sửa bài viết chưa được đăng.

<a href="<?php echo get_page_link(268).'?rwmb_frontend_field_post_id='.$post_author->ID; ?>" title="<?php echo $post_author->post_title; ?>">Edit</a>

Bạn lưu ý là 268 là ID của trang Publish Post của mình. Bạn cần tìm ID trang đăng bài của bạn và thay thế vào chỗ này nhé.

Lúc này, trang My Account của mình sẽ có danh sách quản lý bài viết với đầy đủ thông tin như sau:

Trang My Account với toàn bộ danh sách các bài viết của Guest Author

Trang My Account với toàn bộ danh sách các bài viết của Guest Author

Toàn bộ source code của file page-account.php của mình như sau:

Lời cuối

Đến đây là bạn đã hoàn thiện đầy đủ các chức năng để giúp người dùng có thể tự đăng ký tài khoản Guest Author, đăng bài, quản lý và chỉnh sửa bài viết ngoài frontend rồi. Với sự hỗ trợ của Meta Box và các extension Meta Box Builder, MB Frontend SubmissionMB User Profile thì các thao tác khá là dễ dàng.

Hy vọng với hướng dẫn này, bạn có thể thao tác thành công và nhận được thêm nhiều nội dung hữu ích cho trang web của bạn hơn.

 

Gửi phản hồi