How to moderate posts

时间:2016-01-26 作者:Thebpower

我正在编写一个插件,该插件将调节所有帖子,无论用户发布的帖子级别如何。它将对照单词列表检查帖子内容和标题,如果帖子中有任何单词,我想将帖子放在审核队列中,就像它是由贡献者发布的一样。这部分很好用,但我也希望它能自动删除带有非常糟糕的单词的帖子。这就是我目前拥有它的方式:

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 );
这适用于常规单词,但需要两个非常糟糕的单词才能将帖子设置为垃圾。同样使用这种方法,当用户发布一篇包含非常糟糕的文字的帖子时,他们会被引导到一个错误页面,告诉他们不允许在垃圾箱中编辑帖子。

有什么好的方法可以修复此问题,以便将用户发送回帖子页面并显示错误消息,通知他们他们的帖子已被删除?

还有,我怎样才能纠正在删除之前需要两个非常糟糕的词这一事实?

1 个回复
最合适的回答,由SO网友:Tim Malone 整理而成

这是一个部分的答案,因为正如我在评论中提到的,我不知道为什么您的代码现在需要两个“非常糟糕的词”。这也是一次未经测试的尝试

我来回答你的第一个问题:how to send a user back to the posts page and display a suitable error message, rather than an error about editing posts in the trash.

要做到这一点,我想到的一种方法是wp_redirect() 使用自定义querystring参数,然后可以使用检测并显示错误消息admin_notices action.

然而,我们不能立即重定向,因为我们需要wp_insert_post_data 钩子先完成它的工作。查看source, 我们可能会在wp_insert_post() 函数,在save_postwp_insert_post 行动。在这一阶段,我们还需要一种方法来检查是否需要重定向,我们可以通过检查post_status\'trash\' 如果是一个新帖子(因为什么时候新帖子会被丢弃?)。

以下是一个潜在的工作流:

// 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 ); 
}
提醒你,我还没有测试过这个,但我相信这会给你一些开始的东西!

其他的选择可能包括wp_transition_post_status actions, 尤其new_to_trash, 通过查看来源,在您的情况下也应该调用它。

最后,如果我是一个用户,我可能希望有机会编辑我的帖子,而不是让它自动被丢弃,但这是您的用户体验决定。

Disclaimer: 这可能不一定是最好的方法,但我希望它能给你一些方向,如果有更好的方法,也许其他人可以插话。

相关推荐

如何修改WP_INCLUDE/BLOCKS/LATEST_posts.php

我是WordPress开发的初学者,希望得到一些帮助。我在一个简单的WordPress网站上工作。基本上,用户希望在主页上显示最新的帖子。我使用了最新帖子块,并将其设置为显示整个帖子内容,现在用户不希望帖子标题链接到单个帖子页面(因为帖子的内容显示在主页上)。如何安全地修改模板文件,使其像h2标记一样使用,而不是在主题中使用的href标记。我知道您可以创建子主题并修改wp_content 文件,但我不确定如何处理中的文件wp_include. 我读到一些关于修改functions.php 但我不确定,如果