web-dev-qa-db-ja.com

投稿を管理する方法

ユーザーが投稿したレベルに関係なく、すべての投稿を管理するプラグインを作成しています。投稿の内容とタイトルを単語のリストと照らし合わせてチェックし、投稿にあれば投稿者が投稿したかのように投稿をモデレーションキューに入れます。この部分はうまく動作しますが、本当に悪い言葉を含む投稿を自動的に削除したいと思います。これが私が現在持っている方法です:

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 );

これは通常の単語には有効ですが、投稿をゴミ箱にするには2つの本当に悪い単語が必要です。また、この方法を使用して、ユーザーが本当に悪い言葉で投稿を公開すると、ゴミ箱内の投稿を編集することは許可されていないというエラーページが表示されます。

これを修正してユーザーを投稿ページに戻し、自分の投稿が削除されたことを知らせるエラーメッセージを表示するにはどうすればよいでしょうか。

また、どのように私はそれが削除する前に2つの本当に悪い言葉を必要とするという事実を修正することができますか?

7
Thebpower

これは部分的な答えです。私のコメントで述べたように、現時点であなたのコードが2つの '本当に悪い言葉'を必要としている理由はよくわかりません。これも未検証の試みです。

私はあなたの最初の質問に対処します: ゴミ箱内の投稿の編集に関するエラーではなく、投稿ページに戻って適切なエラーメッセージを表示する方法

頭に浮かぶこれを行う方法は、 wp_redirect() をカスタムのクエリ文字列パラメータと共に使用することです。これを使用すると、エラーメッセージを admin_noticesアクション で検出して表示できます。

ただし、すぐにリダイレクトすることはできません。最初に作業を完了するにはwp_insert_post_dataフックが必要なためです。 source を見ると、wp_insert_post()関数の最後、save_postまたはwp_insert_postアクションでリダイレクトする可能性があります。また、この段階でリダイレクトが必要かどうかをチェックする方法も必要になります。おそらくpost_status'trash'であるかどうか、そしてそれがnew postであるかどうかをチェックすれば安全ですポストはゴミ箱に行きますか?).

これが潜在的なワークフローです。

// 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アクション 、特にnew_to_trashです。これは - ソースを見ることによって - あなたの状況でも呼ばれるべきです。

最後に、私がユーザーであれば、自動的に投稿を破棄するのではなく自分の投稿を編集する機会を得たいと思うかもしれませんが、これはあなたの側でのユーザーエクスペリエンスの決定です。

免責事項: これは必ずしもこれを行う最良の方法ではないかもしれませんが、それでもやはりある程度の方向性を示してくれることを願っています。

2
Tim Malone