Làm thế nào để kiểm duyệt bài viết


7

Tôi đang viết một plugin sẽ kiểm duyệt tất cả các bài đăng bất kể người dùng đã đăng chúng ở cấp độ nào. Nó sẽ kiểm tra nội dung bài đăng và tiêu đề đối với một danh sách các từ và nếu có trong bài đăng, tôi muốn đặt bài đăng trong hàng kiểm duyệt như thể nó được đăng bởi một người đóng góp. Phần này hoạt động tốt, nhưng tôi cũng muốn nó tự động xóa bài viết với những từ thực sự xấu. Đây là cách tôi hiện có nó:

function filter_handler( $data , $postarr ) {
    // Get vars from data
    $content = $data['post_content'];
    $title = $data['post_title'];
    // Array of words that will hold a post for aproval
    $badWords = array(
        "link=", "content-type", "bcc:", "cc:", "document.cookie", 
            "onclick", "onload", "javascript"
    );
    $reallyBadWords = array(
        "query", "pluginTesting"
    );
    // If bad words exist in post, set post_status to pending
    foreach ( $badWords as $word ) {
        if ( 
            strpos( strtolower( $content ), strtolower( $word ) ) || 
            strpos( strtolower( $title ), strtolower( $word ) ) 
        ) {
            $data['post_status'] = "pending";
        }
    }
    // If really bad words exist, delete post
    foreach ( $reallyBadWords as $word ) {
        if ( 
            strpos( strtolower( $content ), strtolower( $word ) ) || 
            strpos( strtolower( $title ), strtolower( $word ) ) 
        ) {
            $data['post_status'] = 'trash';
        }
    }
    return $data;
}
add_filter( 'wp_insert_post_data', 'filter_handler', '99', 2 );

Điều này hoạt động cho các từ thông thường nhưng đòi hỏi hai từ thực sự xấu để đặt một bài đăng vào thùng rác. Cũng sử dụng phương pháp này, khi người dùng xuất bản một bài viết với những từ thực sự xấu, họ sẽ được chuyển đến một trang lỗi cho họ biết họ không được phép chỉnh sửa bài đăng trong thùng rác.

Điều gì sẽ là một cách tốt để khắc phục điều này để nó đưa người dùng quay lại trang bài đăng và hiển thị thông báo lỗi thông báo cho họ rằng bài đăng của họ đã bị xóa?

Ngoài ra, làm thế nào tôi có thể sửa chữa thực tế rằng nó đòi hỏi hai từ thực sự xấu trước khi xóa?


Điều này có vẻ đơn giản và thông minh. Làm tốt lắm! Tôi không hiểu tại sao nó đòi hỏi hai "từ thực sự xấu" trước khi xóa - với một cái nhìn nhanh về mã, nó phải là một. Bạn có biết tại sao nó cần hai từ không?
Tim Malone

Câu trả lời:


2

Đây là một câu trả lời một phần, vì như tôi đã đề cập trong bình luận của mình, tôi không chắc tại sao mã của bạn lại yêu cầu hai "từ thực sự xấu" vào lúc này. Đó cũng là một nỗ lực chưa được kiểm tra.

Tôi sẽ giải quyết câu hỏi đầu tiên của bạn: làm thế nào để đưa người dùng trở lại trang bài đăng và hiển thị thông báo lỗi phù hợp, thay vì lỗi về chỉnh sửa bài đăng trong thùng rác .

Một cách để làm điều này xuất hiện trong tâm trí là sử dụng wp_redirect () với tham số chuỗi truy vấn tùy chỉnh, sau đó bạn có thể phát hiện và hiển thị thông báo lỗi của mình bằng hành động admin_notices .

Tuy nhiên, chúng tôi không thể chuyển hướng ngay lập tức, bởi vì chúng tôi cần wp_insert_post_datamóc nối để hoàn thành công việc trước tiên. Nhìn vào nguồn , chúng ta có thể có khả năng chuyển hướng ở cuối wp_insert_post()hàm, trong save_posthoặc wp_insert_posthành động. Chúng ta cũng sẽ cần một cách để kiểm tra ở giai đoạn này nếu cần chuyển hướng - điều mà chúng ta có thể làm một cách an toàn bằng cách kiểm tra nếu đó post_status'trash'và nếu đó là một bài đăng mới (bởi vì khi nào thì một bài đăng mới sẽ vào thùng rác?) .

Đây là một quy trình công việc tiềm năng:

// if this is a new post but it's in the trash, redirect with a custom error

add_action( 'wp_insert_post', 'wpse_215752_redirect_from_trash', 10, 3 );

function wpse_215752_redirect_from_trash( $post_ID, $post, $update ) {
  if( !$update && 'trash' === $post->post_status ) {
    wp_redirect( admin_url( 'edit.php?custom_error=badwords' ) );
    die();
  }        
}

// if our custom error is set in the querystring, make sure we show it

if( isset( $_GET['custom_error'] ) && 'badwords' === $_GET['custom_error']) {
  add_action( 'admin_notices', 'wpse_215752_badwords_error' );
}

function wpse_215752_badwords_error() {
    $class = 'notice notice-error';
    $message = __( 'Sorry, that post cannot be made.', 'your-text-domain' );
    printf( '<div class="%1$s"><p>%2$s</p></div>', $class, $message ); 
}

Tôi đã không kiểm tra điều này, nhớ bạn, nhưng tôi tin rằng điều này mang lại cho bạn một cái gì đó để bắt đầu!

Các tùy chọn khác để xem xét có thể bao gồm các wp_transition_post_statushành động , đặc biệt new_to_trash, bằng cách nhìn vào nguồn - cũng nên được gọi trong tình huống của bạn.

Cuối cùng, nếu tôi là người dùng, tôi có thể muốn có cơ hội chỉnh sửa bài đăng của mình thay vì tự động chuyển rác, nhưng đây là quyết định trải nghiệm người dùng từ phía bạn.

Tuyên bố miễn trừ trách nhiệm: Đây có thể không nhất thiết là cách tốt nhất để làm điều này, nhưng tôi hy vọng nó sẽ mang lại cho bạn một số hướng dù sao và có lẽ những người khác có thể hô vang nếu có cách tốt hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.