Wie man Beiträge moderiert

7

Ich schreibe ein Plugin, das alle Beiträge moderiert, unabhängig davon, auf welcher Ebene der Benutzer sie gepostet hat. Der Inhalt und der Titel des Beitrags werden anhand einer Liste von Wörtern überprüft. Wenn sich Beiträge im Beitrag befinden, möchte ich den Beitrag in die Moderationswarteschlange stellen, als ob er von einem Mitwirkenden gepostet worden wäre. Dieser Teil funktioniert gut, aber ich möchte auch, dass Beiträge mit wirklich schlechten Worten automatisch gelöscht werden. So habe ich es derzeit:

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

Dies funktioniert für die regulären Wörter, erfordert jedoch zwei wirklich schlechte Wörter, um einen Beitrag in den Papierkorb zu setzen. Wenn ein Benutzer mit dieser Methode einen Beitrag mit wirklich schlechten Wörtern veröffentlicht, wird er auf eine Fehlerseite weitergeleitet, auf der er darüber informiert wird, dass er keine Beiträge im Papierkorb bearbeiten darf.

Was wäre ein guter Weg, um dies zu beheben, damit Benutzer zurück zur Beitragsseite geschickt werden und eine Fehlermeldung angezeigt wird, die sie darüber informiert, dass ihr Beitrag gelöscht wurde?

Wie kann ich außerdem die Tatsache beheben, dass vor dem Löschen zwei wirklich schlechte Wörter erforderlich sind?

Thebpower
quelle
Dies scheint täuschend einfach und klug. Gute Arbeit! Ich verstehe jedoch nicht, warum vor dem Löschen zwei "wirklich schlechte Wörter" erforderlich sind - mit einem kurzen Blick auf den Code sollte es eines sein. Wissen Sie, warum zwei Wörter erforderlich sind?
Tim Malone

Antworten:

2

Dies ist eine teilweise Antwort, da ich, wie ich in meinem Kommentar erwähnt habe, nicht sicher bin, warum Ihr Code im Moment zwei "wirklich schlechte Wörter" erfordert. Es ist auch ein ungetesteter Versuch.

Ich werde mich mit Ihrer ersten Frage befassen: Wie kann ich einen Benutzer zurück zur Beitragsseite schicken und eine geeignete Fehlermeldung anzeigen, anstatt einen Fehler beim Bearbeiten von Beiträgen im Papierkorb .

Eine Möglichkeit, dies zu tun, ist die Verwendung von wp_redirect () mit einem benutzerdefinierten Querystring-Parameter, den Sie dann mit der Aktion admin_notices erkennen und Ihre Fehlermeldung anzeigen können .

Wir können jedoch nicht sofort umleiten, da wir den wp_insert_post_dataHook benötigen , um seine Arbeit zuerst abzuschließen. Wenn wir in die Quelle schauen , können wir möglicherweise am Ende der wp_insert_post()Funktion in die save_postoder wp_insert_postAktionen umleiten . Wir brauchen auch eine Art und Weise zu diesem Zeitpunkt zu überprüfen , ob eine Umleitung notwendig ist - was können wir wahrscheinlich durch Überprüfen sicher tun , wenn das post_statusist , 'trash'und wenn es eine ist neue Post (denn wenn sonst würde ein neuer Beitrag in den Papierkorb gehen?) .

Hier ist ein möglicher Workflow:

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

Ich habe das wohlgemerkt nicht getestet, aber ich vertraue darauf, dass Sie damit etwas anfangen können!

Andere Optionen, die Sie sich ansehen sollten, könnten insbesondere die wp_transition_post_statusAktionen sein , new_to_trashdie - wenn Sie sich die Quelle ansehen - auch in Ihrer Situation aufgerufen werden sollten.

Wenn ich ein Benutzer wäre, möchte ich möglicherweise die Möglichkeit haben, meinen Beitrag zu bearbeiten, anstatt ihn automatisch in den Papierkorb zu werfen. Dies ist jedoch eine Entscheidung zur Benutzererfahrung von Ihrer Seite.

Haftungsausschluss: Dies ist möglicherweise nicht unbedingt der beste Weg, dies zu tun, aber ich hoffe, es gibt Ihnen dennoch eine Richtung, und vielleicht können andere mitmachen, wenn es einen besseren Weg gibt.

Tim Malone
quelle