it-swarm-eu.dev

Jak moderovat příspěvky

Píšu plugin, který bude moderovat všechny příspěvky bez ohledu na to, na jaké úrovni je uživatel odeslán. Bude kontrolovat obsah a název příspěvku proti seznamu slov a pokud jsou nějaké v příspěvku, chci umístit příspěvek do fronty moderování, jako by byl odeslán přispěvatelem. Tato část funguje dobře, ale také chci, aby automaticky odstranila příspěvky s opravdu špatnými slovy. Toto je způsob, jakým ho aktuálně mám:

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

To funguje pro běžná slova, ale vyžaduje dva opravdu špatná slova nastavit příspěvek do koše. Také při použití této metody, když uživatel publikuje příspěvek se opravdu špatnými slovy, dostanou se na stránku s chybou, která jim říká, že nemají povoleno upravovat příspěvky v koši.

Jaký by to byl dobrý způsob, jak to opravit tak, aby poslal uživatele zpět na stránku příspěvků a zobrazí chybové hlášení, které je informuje, že jejich příspěvek byl smazán?

Také, jak mohu opravit skutečnost, že to vyžaduje dvě opravdu špatná slova před smazáním?

7
Thebpower

Toto je částečná odpověď, protože jak jsem zmínil ve svém komentáři, nejsem si jistý, proč váš kód v současné době vyžaduje dvě „opravdu špatná slova“. Je to také netestovaný pokus. _

Zabývám se vaší první otázkou: jak poslat uživatele zpět na stránku příspěvků a zobrazit vhodnou chybovou zprávu, spíše než chybu v úpravách příspěvků v koši .

Způsob, jak toho dosáhnout, je použití wp_redirect () s vlastním parametrem querystring, který pak můžete detekovat a zobrazit vaši chybovou zprávu pomocí akce admin_notices .

Nemůžeme však ihned přesměrovat, protože k dokončení práce nejprve potřebujeme háček wp_insert_post_data. Při pohledu do source , bychom mohli potenciálně přesměrovat na konci funkce wp_insert_post() v akcích save_post nebo wp_insert_post. V této fázi budeme také potřebovat zkontrolovat, zda je potřeba přesměrování - což můžeme pravděpodobně bezpečně ověřit kontrolou post_status'trash' a pokud je to nové post (protože když by jinak bylo nové post jít do koše?).

Zde je potenciální pracovní postup:

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

Nezkoušel jsem to, myslím, ale věřím, že to vám dává něco, co byste mohli začít!

Další možnosti, jak se podívat, mohou zahrnovat akce wp_transition_post_status , zejména new_to_trash, které by se při pohledu na zdroj měly také volat ve vaší situaci.

Nakonec, kdybych byl uživatel, chtěl bych raději upravit svůj příspěvek, než aby byl automaticky smazán, ale toto je rozhodnutí uživatele z vaší strany.

Zřeknutí se odpovědnosti: To nemusí být nutně nejlepší způsob, jak to udělat, ale doufám, že vám to dá nějaký směr, a možná, že jiní mohou zazvonit, pokud je lepší způsob.

2
Tim Malone