web-dev-qa-db-fra.com

Comment modérer les messages

Je suis en train d’écrire un plugin qui modérera tous les messages, quel que soit leur niveau de publication. Il vérifiera le contenu et le titre de l'article par rapport à une liste de mots. S'il y en a, je souhaite mettre l'article dans la file d'attente de modération comme s'il avait été posté par un contributeur. Cette partie fonctionne bien, mais je veux aussi qu'elle supprime automatiquement les messages contenant de très mauvais mots. Voici comment je l'ai actuellement:

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

Cela fonctionne pour les mots ordinaires, mais nécessite deux mots vraiment mauvais pour définir un message à la corbeille. En utilisant également cette méthode, lorsqu'un utilisateur publie une publication avec de très mauvais mots, il est redirigé vers une page d'erreur lui indiquant qu'il n'est pas autorisé à modifier des publications dans la corbeille.

Quel serait un bon moyen de résoudre ce problème afin de renvoyer les utilisateurs à la page des messages et d'afficher un message d'erreur les informant que leur message a été supprimé?

Aussi, comment puis-je résoudre le fait qu'il nécessite deux mots vraiment mauvais avant la suppression?

7
Thebpower

_ {C'est une réponse partielle, parce que, comme je l'ai mentionné dans mon commentaire, je ne suis pas sûr de savoir pourquoi votre code nécessite deux "mots vraiment mauvais" pour le moment. C'est aussi une tentative non testée.

Je traiterai de votre première question: comment renvoyer un utilisateur sur la page des publications et afficher un message d'erreur approprié, plutôt qu'une erreur concernant la modification de publications dans la corbeille .

Une façon de le faire qui me vient à l’esprit est d’utiliser wp_redirect () avec un paramètre de chaîne de requête personnalisé, que vous pouvez ensuite détecter et afficher votre message d’erreur avec l’action admin_notices .

Cependant, nous ne pouvons pas rediriger immédiatement, car nous avons besoin du hook wp_insert_post_data pour terminer son travail en premier. En regardant dans source , nous pourrions potentiellement rediriger à la fin de la fonction wp_insert_post(), dans les actions save_post ou wp_insert_post. Nous aurons également besoin d’un moyen de vérifier à ce stade si une redirection est nécessaire - ce que nous pouvons probablement faire en toute sécurité en vérifiant si le post_status est 'trash' et s’il s’agit d’un nouveau post (car à quel moment une nouvelle poste va à la corbeille?).

Voici un flux de travail potentiel:

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

Je n'ai pas testé cela, mais je suis convaincu que cela vous donne de quoi commencer!

Les autres options à examiner peuvent inclure les actions wp_transition_post_status , en particulier new_to_trash, qui - en consultant la source - devraient également être appelées dans votre cas.

Enfin, si j'étais un utilisateur, je souhaiterais peut-être avoir la possibilité de modifier mon message plutôt que de le supprimer automatiquement, mais il s'agit d'une décision prise par les utilisateurs en matière d'expérience utilisateur.

Disclaimer: Ce n'est peut-être pas forcément la meilleure façon de le faire, mais j'espère que cela vous donnera néanmoins une orientation, et peut-être que d'autres pourront en dire plus s'il y a une meilleure façon.

2
Tim Malone