it-swarm.com.de

Beiträge moderieren

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 in dem Beitrag einige Wörter befinden, möchte ich den Beitrag in die Moderationswarteschlange stellen, als ob er von einem Mitwirkenden veröffentlicht worden wäre. Dieser Teil funktioniert gut, aber ich möchte auch, dass Posts mit wirklich schlechten Worten automatisch gelöscht werden. So habe ich es aktuell:

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 verschieben. Wenn ein Benutzer mit dieser Methode einen Beitrag mit wirklich schlechten Worten veröffentlicht, wird er auf eine Fehlerseite verwiesen, auf der ihm mitgeteilt wird, dass er keine Beiträge im Papierkorb bearbeiten darf.

Was wäre eine gute Möglichkeit, um dieses Problem zu beheben, indem Benutzer zurück zur Posts-Seite geschickt werden und eine Fehlermeldung angezeigt wird, die sie darüber informiert, dass ihr Post gelöscht wurde?

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

7
Thebpower

Dies ist eine unvollständige Antwort, da ich, wie in meinem Kommentar erwähnt, 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 sende ich einen Benutzer zurück zur Posts-Seite und zeige eine geeignete Fehlermeldung an, anstatt einen Fehler beim Bearbeiten von Posts 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 anzeigen können.

Wir können jedoch nicht sofort umleiten, da wir den Hook wp_insert_post_data benötigen, um seine Arbeit zuerst abzuschließen. Wenn Sie in source nachsehen, können Sie möglicherweise am Ende der Funktion wp_insert_post() in die Aktionen save_post oder wp_insert_post umleiten. Wir werden auch eine Möglichkeit benötigen, zu diesem Zeitpunkt zu prüfen, ob eine Umleitung erforderlich ist - was wir wahrscheinlich sicher tun können, indem wir prüfen, ob der post_status ein 'trash' ist und ob es sich um einen neu Post handelt (denn wann sonst wäre ein neuer Post in den Papierkorb?).

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 noch nicht getestet, aber ich vertraue darauf, dass Sie damit etwas anfangen können!

Zu den weiteren Optionen, die Sie prüfen sollten, gehören die Aktionen wp_transition_post_status , insbesondere new_to_trash, die - bei Betrachtung der Quelle - auch in Ihrer Situation aufgerufen werden sollten.

Wenn ich ein Benutzer war, möchte ich möglicherweise die Möglichkeit haben, meinen Beitrag zu bearbeiten, anstatt ihn automatisch löschen zu lassen. Dies ist jedoch eine Entscheidung der Benutzererfahrung von Ihrer Seite.

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

2
Tim Malone