Simpele anti-spam vraag zonder plugin
Als je alleen het standaard commentform van wordpress gebruikt dan kan je nogal wat spam binnen krijgen. De fijnste manier voor een goedwillende gebruiker om dit tegen te gaan is een simpele vraag. Dit is een stuk gebruiksvriendelijker dan de standaard captcha waarbij je een krom geschreven niet bestaand woord moet ontcijferen.
Hier zijn enkele plugins voor te vinden en die voldoen prima. Alleen ik vond ze zo omslachtig, zo moeilijk kon het niet zijn dacht ik. Dus met wat speur-, knip en plak- en denkwerk was het in 33 regels code voor elkaar.
1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 28 29 3031 32 33 34 <?php add_filter( 'comment_form_defaults', 'add_arspam_to_comment_fields'); function add_arspam_to_comment_fields($default) { $commenter = wp_get_current_commenter(); $default['fields']['url'] .= ' ' . //een nieuw veld toevoegen na het url veld '<label for="arspam">Antispam; Wat is de kleur van de "plaats reactie" knop?</label> <span class="required">*</span> <input id="arspam" type="text" maxlength="10" name="arspam" size="30" /> '; return $default; } if ( isset($_POST['arspam']) ) { add_filter( 'preprocess_comment', 'verify_comment_meta_data' ); function verify_comment_meta_data($commentdata) { $antwoord = $_POST['arspam']; switch($antwoord){ case "": wp_die( __('Error: Vul de antispam vraag in aub'), '', 'back_link=true' ); break; case "rood": //de case "Rood": //goede case "red": //antwoorden case "Red": //zoveel of weinig als je wil return $commentdata; break; default : wp_die( __('Error: U heeft het verkeerde antwoord op antispam vraag gegeven'), '', 'back_link=true' ); } } } ?>
Eerst wordt met de functie add_arspam_to_comment_fields een nieuw invulveld toegevoegd na het veld op je webadres in te vullen ('url'). Gebruik je een aangepaste comment_form($args) dan al ik je daar zometeen een oplossing voor geven, eerst even de rest van bovenstaande code afhandelen.
Nu we het invulveld hebben moeten we nog vertellen wat er mee moet gebeuren. Als eerst word op regel 15 gekeken of het invulveld er inderdaad is. Als je namelijk ingelogd bent als gebruiker dan zullen de invulvelden niet weergegeven worden en kan er dus ook niks getest worden. Dat is ook niet nodig omdat het in die gevallen om een bekende website beheerder/gebruiker gaat.
Vervolgens wordt er getest wat er ingevuld is. Als er niks is ingevuld case
""
:
dan wordt wp_die gestart. wp-die is de functie die er voor zorgt dat er verder niks meer wordt uitgevoerd behalve het weergeven van een foutmelding die als argument opgegeven kan worden.
Is het antwoord wel goed (regel23) dan wordt de ingevulde informatie op het formulier verder verwerkt via return
$commentdata
;
, elk ander antwoord geeft wederom een wp_die omdat dit logischerwijs een verkeerd antwoord moet zijn.
En dat was alles, zo simpel kan het zijn! 🙂
Bovenstaande code is ook als plugin te downloaden voor de liefhebber. Je moet dan zelf in de source code de vraag en antwoord aanpassen naar je wens. Wil je de errorpagina nog wat vormgeven kijk dan eens hier.
Zoals belooft hier nog de versie voor als je gebruikt maakt van aangepast velden door middel van comment_form($args). Je moet dan je comments.php aanpassen om de argumenten op te geven. Hier is een voorbeeld uit mijn eigen comments.php
1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 28 29 3031 32 33 34 35 $commenter = wp_get_current_commenter(); $req = get_option( 'require_name_email' ); $aria_req = ( $req ? " aria-required='true'" : '' ); $args = array( 'fields' => apply_filters( 'comment_form_default_fields', array( 'author' => '<div id="comment-persoon-detail"><p class="comment-form-author">' . '<a title="' . ( $req ? 'Dit is een verplicht veld' : 'Uw naam' ) . '"><label for="author">Naam ' . ( $req ? '<span class="required">*</span>' : '' ) . '</label></a><input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>', 'email' => '<p class="comment-form-email"><a title="' . ( $req ? 'Dit is een verplicht veld, ' : '' ) . 'Het e-mailadres wordt niet gepubliceerd"><label for="email">Email ' . ( $req ? '<span class="required">*</span>' : '' ) . '</label></a><input id="email" name="email" type="text" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>', 'url' => '<p class="comment-form-url"><a title="Het website-adres wordt niet gepubliceerd"><label for="url">Website</label></a>' . '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>', 'arspam' => '<p class="comment-form-arspam">' . '<label for="arspam">'. __('Antispam; Wat is de kleur van de "plaats reactie" knop?') . ' <span class="required">*</span></label> <input id="arspam" name="arspam" maxlength="10" size="30" type="text" /></p></div>' ) ), ); comment_form($args);
Op regel 26 kan je zien dat ik 'arspam' toegevoegd heb aan de array met de opmaak voor het invoerveld. Je hier ook een plaatje/pictogram kunnen toevoegen en als antispam vraag stellen wat er op het plaatje staat.
Ik hoop dat ik jullie hiermee geholpen heb. Succes!!
Ok tes