Rumah >Tutorial CMS >WordTekan >Mengintegrasikan Captcha dengan Borang Komen WordPress
Saya tahu anda membenci komen spam seperti yang saya lakukan dan ingin tahu bagaimana untuk memerangi mereka. Salah satu cara menghalang bot dari mengemukakan komen spam adalah dengan mengintegrasikan captcha ke borang komen.
Dalam tutorial sebelumnya, kami belajar bagaimana mengintegrasikan Captchas ke borang log masuk dan pendaftaran WordPress.
Dalam fesyen yang sama, kami akan berjalan melalui cara mengintegrasikan CAPTCHA dengan sistem komen WordPress.
Terdapat banyak plugin CAPTCHA yang terdapat dalam direktori plugin WordPress seperti WP-Recaptcha dan Securimage-WP-Fixed.
Tujuan tutorial ini adalah untuk tidak membuat plugin Captcha yang lain tetapi:
Tunjukkan bagaimana API HTTP WordPress boleh digunakan dalam plugin.
bagaimana memasukkan medan borang tambahan ke borang komen WordPress.
Pertama, pergi ke Recaptcha, daftar nama domain anda dan ambil kunci API awam dan swasta anda.
Buat kelas dengan tiga sifat yang akan menyimpan kunci peribadi & awam Recaptcha serta mesej ralat CAPTCHA (ralat dihasilkan apabila borang CAPTCHA dibiarkan kosong dan pengguna gagal cabaran).
Kaedah Pembina Magic Kelas akan mengandungi dua pasang tindakan dan cangkuk penapis.
<span><span><?php </span></span><span> </span><span><span>/* </span></span><span><span>Plugin Name: Add reCAPTCHA to comment form </span></span><span><span>Plugin URI: https://www.sitepoint.com </span></span><span><span>Description: Add Google's reCAPTCHA to WordPress comment form </span></span><span><span>Version: 1.0 </span></span><span><span>Author: Agbonghama Collins </span></span><span><span>Author URI: http://w3guy.com </span></span><span><span>License: GPL2 </span></span><span><span>*/</span></span>
Kod Penjelasan: Pertama, kunci awam dan peribadi saya diselamatkan ke sifat kelas mereka.
<span>class Captcha_Comment_Form { </span> <span>/** <span>@type string private key|public key */</span> </span> <span>private $public_key, $private_key; </span> <span>/** <span>@type string captcha errors */</span> </span> <span>private static $captcha_error;</span>
kaedah captcha_display () yang akan mengeluarkan cabaran recaptcha ditambah ke borang komen oleh tindakan Comment_Form.
Tindakan WP_HEAD termasuk fungsi panggil balik delete_failed_captcha_comment () yang akan memadamkan sebarang komen yang dikemukakan yang gagal cabaran CAPTCHA.
preprocess_comment penapis memanggil kaedah validate_captcha_field () untuk memastikan medan CAPTCHA tidak dibiarkan kosong dan juga jawapannya.
penapis COMMENT_POST_REDIRECT CALL REDIRECT_FAIL_CAPTCHA_COMMENT () untuk menambah beberapa parameter pertanyaan ke url pengalihan komen.di sini adalah kod untuk captcha_display () yang akan mengeluarkan cabaran captcha.
Selain itu, periksa jika terdapat rentetan pertanyaan yang dilampirkan pada url halaman semasa dan paparkan mesej ralat yang sesuai bergantung pada nilai $ _get ['captcha'] yang ditetapkan oleh redirect_fail_captcha_comment ()
<span><span><?php </span></span><span> </span><span><span>/* </span></span><span><span>Plugin Name: Add reCAPTCHA to comment form </span></span><span><span>Plugin URI: https://www.sitepoint.com </span></span><span><span>Description: Add Google's reCAPTCHA to WordPress comment form </span></span><span><span>Version: 1.0 </span></span><span><span>Author: Agbonghama Collins </span></span><span><span>Author URI: http://w3guy.com </span></span><span><span>License: GPL2 </span></span><span><span>*/</span></span>
<span>class Captcha_Comment_Form { </span> <span>/** <span>@type string private key|public key */</span> </span> <span>private $public_key, $private_key; </span> <span>/** <span>@type string captcha errors */</span> </span> <span>private static $captcha_error;</span>kaedah validate_captcha_field () sebagai namanya menunjukkan untuk mengesahkan jawapan CAPTCHA dengan memastikan medan CAPTCHA tidak dibiarkan kosong dan jawapan yang dibekalkan adalah betul.
<span>/** class constructor */ </span> <span>public function __construct() { </span> <span>$this->public_key = '6Le6d-USAAAAAFuYXiezgJh6rDaQFPKFEi84yfMc'; </span> <span>$this->private_key = '6Le6d-USAAAAAKvV-30YdZbdl4DVmg_geKyUxF6b'; </span> <span>// adds the captcha to the WordPress form </span> <span>add_action( 'comment_form', array( $this, 'captcha_display' ) ); </span> <span>// delete comment that fail the captcha challenge </span> <span>add_action( 'wp_head', array( $this, 'delete_failed_captcha_comment' ) ); </span> <span>// authenticate the captcha answer </span> <span>add_filter( 'preprocess_comment', array( $this, 'validate_captcha_field' ) ); </span> <span>// redirect location for comment </span> <span>add_filter( 'comment_post_redirect', array( $this, 'redirect_fail_captcha_comment' ), 10, 2 ); </span> <span>}</span>Mari kita lihat lebih dekat pada validate_captcha_field (), khususnya pernyataan bersyarat lain, panggilan dibuat untuk recaptcha_response () untuk memeriksa sama ada jawapan CAPTCHA adalah betul.
di bawah adalah kod untuk recaptcha_response ().
/** Output the reCAPTCHA form field. */ public function captcha_display() { if ( isset( $_GET['captcha'] ) && $_GET['captcha'] == 'empty' ) { echo '<span><span><span><strong</span>></span>ERROR<span><span></strong</span>></span>: CAPTCHA should not be empty'; </span> } elseif ( isset( $_GET['captcha'] ) && $_GET['captcha'] == 'failed' ) { echo '<span><span><span><strong</span>></span>ERROR<span><span></strong</span>></span>: CAPTCHA response was incorrect'; </span> } echo <<<span><span><span><CAPTCHA_FORM</span> </span></span><span> <span><style type<span>='text/css'</span>></span><span><span><span>#submit</span> { </span></span></span><span><span> <span>display: none; </span></span></span><span><span> <span>}</span></span><span><span></style</span>></span> </span> <span><span><span><script</span> type<span>="text/javascript"</span> </span></span><span> <span>src<span>="http://www.google.com/recaptcha/api/challenge?k=<span><?= $this->public_key; ?></span>"</span>></span><span> </span></span><span><span> </span><span><span></script</span>></span> </span> <span><span><span><noscript</span>></span> </span> <span><span><span><iframe</span> src<span>="http://www.google.com/recaptcha/api/noscript?k=<span><?= $this->public_key; ?></span>"</span> </span></span><span> <span>height<span>="300"</span> width<span>="300"</span> frameborder<span>="0"</span>></span><span><span></iframe</span>></span> </span> <span><span><span><br</span>></span> </span> <span><span><span><textarea</span> name<span>="recaptcha_challenge_field"</span> rows<span>="3"</span> cols<span>="40"</span>></span> </span> <span><span><span></textarea</span>></span> </span> <span><span><span><input</span> type<span>="hidden"</span> name<span>="recaptcha_response_field"</span> </span></span><span> <span>value<span>="manual_challenge"</span>></span> </span> <span><span><span></noscript</span>></span> </span> <span><span><span><input</span> name<span>="submit"</span> type<span>="submit"</span> id<span>="submit-alt"</span> tabindex<span>="6"</span> value<span>="Post Comment"</span>/></span> </span>CAPTCHA_FORM; }izinkan saya menerangkan bagaimana recaptcha_response () berfungsi.
Permintaan pos dihantar ke titik akhir http://www.google.com/recaptcha/api/verify dengan parameter berikut.
wordpress http api parameter pos untuk berada dalam bentuk array maka kod di bawah.
<span>/** </span><span> * Add query string to the comment redirect location </span><span> * </span><span> * <span>@param $location string location to redirect to after comment </span></span><span> * <span>@param $comment object comment object </span></span><span> * </span><span> * <span>@return <span>string</span> </span></span><span> */ </span> <span>function redirect_fail_captcha_comment( $location, $comment ) { </span> <span>if ( ! empty( <span>self::</span>$captcha_error ) ) { </span> <span>$args = array( 'comment-id' => $comment->comment_ID ); </span> <span>if ( <span>self::</span>$captcha_error == 'captcha_empty' ) { </span> <span>$args['captcha'] = 'empty'; </span> <span>} elseif ( <span>self::</span>$captcha_error == 'challenge_failed' ) { </span> <span>$args['captcha'] = 'failed'; </span> <span>} </span> <span>$location = add_query_arg( $args, $location ); </span> <span>} </span> <span>return $location; </span> <span>}</span>recaptcha_post_request () adalah fungsi pembalut untuk API HTTP yang akan menerima parameter/badan pos, membuat permintaan kepada API Recaptcha dan kembali benar jika ujian CAPTCHA diluluskan dan sebaliknya.
Mana -mana komen yang dibuat oleh pengguna yang gagal cabaran captcha atau meninggalkan medan kosong Dapatkan dipadam oleh delete_failed_captcha_comment ()
<span>/** </span><span> * Verify the captcha answer </span><span> * </span><span> * <span>@param $commentdata object comment object </span></span><span> * </span><span> * <span>@return <span>object</span> </span></span><span> */ </span> <span>public function validate_captcha_field( $commentdata ) { </span> <span>// if captcha is left empty, set the self::$captcha_error property to indicate so. </span> <span>if ( empty( $_POST['recaptcha_response_field'] ) ) { </span> <span><span>self::</span>$captcha_error = 'captcha_empty'; </span> <span>} </span> <span>// if captcha verification fail, set self::$captcha_error to indicate so </span> <span>elseif ( $this->recaptcha_response() == 'false' ) { </span> <span><span>self::</span>$captcha_error = 'challenge_failed'; </span> <span>} </span> <span>return $commentdata; </span> <span>}</span>
Akhirnya, kami menutup kelas plugin.
<span>/** </span><span> * Get the reCAPTCHA API response. </span><span> * </span><span> * <span>@return <span>string</span> </span></span><span> */ </span> <span>public function recaptcha_response() { </span> <span>// reCAPTCHA challenge post data </span> <span>$challenge = isset( $_POST['recaptcha_challenge_field'] ) ? esc_attr( $_POST['recaptcha_challenge_field'] ) : ''; </span> <span>// reCAPTCHA response post data </span> <span>$response = isset( $_POST['recaptcha_response_field'] ) ? esc_attr( $_POST['recaptcha_response_field'] ) : ''; </span> <span>$remote_ip = $_SERVER["REMOTE_ADDR"]; </span> <span>$post_body = array( </span> <span>'privatekey' => $this->private_key, </span> <span>'remoteip' => $remote_ip, </span> <span>'challenge' => $challenge, </span> <span>'response' => $response </span> <span>); </span> <span>return $this->recaptcha_post_request( $post_body ); </span> <span>}</span>
Kami selesai mengodkan kelas plugin. Untuk meletakkan kelas berfungsi, kita perlu memberi instantiasi seperti itu:
<span>$post_body = array( </span> <span>'privatekey' => $this->private_key, </span> <span>'remoteip' => $remote_ip, </span> <span>'challenge' => $challenge, </span> <span>'response' => $response </span> <span>); </span> <span>return $this->recaptcha_post_request( $post_body );</span>
Pada pengaktifan plugin, captcha akan ditambah ke borang komen WordPress seperti yang ditunjukkan di bawah.
<span>/** </span><span> * Send HTTP POST request and return the response. </span><span> * </span><span> * <span>@param $post_body array HTTP POST body </span></span><span> * </span><span> * <span>@return <span>bool</span> </span></span><span> */ </span> <span>public function recaptcha_post_request( $post_body ) { </span> <span>$args = array( 'body' => $post_body ); </span> <span>// make a POST request to the Google reCaptcha Server </span> <span>$request = wp_remote_post( 'https://www.google.com/recaptcha/api/verify', $args ); </span> <span>// get the request response body </span> <span>$response_body = wp_remote_retrieve_body( $request ); </span> <span>/** </span><span> * explode the response body and use the request_status </span><span> * <span>@see https://developers.google.com/recaptcha/docs/verify </span></span><span> */ </span> <span>$answers = explode( "\n", $response_body ); </span> <span>$request_status = trim( $answers[0] ); </span> <span>return $request_status; </span> <span>}</span>
Pada akhir tutorial ini, anda harus dapat menambah bidang bentuk tambahan ke borang komen dan melaksanakan hampir apa -apa ciri yang anda ingin ada dalam sistem komen berkat penapis dan tindakan yang disebutkan.
Jika anda ingin menggunakan plugin di laman WordPress anda atau untuk mengkaji kod yang mendalam, muat turun plugin dari GitHub.sehingga saya datang lagi, pengekodan gembira!
Soalan Lazim (Soalan Lazim) Mengenai Mengintegrasikan Captcha dengan Borang Komen WordPress
Atas ialah kandungan terperinci Mengintegrasikan Captcha dengan Borang Komen WordPress. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!