插件
SimpleAntiSpam
- 简单数学题反垃圾评论插件 (手动调用版)
插件代码
您需要创建一个新的插件。请按照以下步骤操作。
第1步:创建插件目录和文件
在您的Typecho安装目录中,找到usr/plugins
文件夹。
在此文件夹内创建一个新的文件夹,命名为SimpleAntiSpam
。
在SimpleAntiSpam
文件夹内,创建一个名为Plugin.php
的文件。
第2步:将以下代码复制到Plugin.php
文件中
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
/**
* 简单数学题反垃圾评论插件 (手动调用版)
*
* @package SimpleAntiSpam
* @author Gemini
* @version 2.0.0
* @link https://google.com
*/
class SimpleAntiSpam_Plugin implements Typecho_Plugin_Interface
{
/**
* 激活插件方法
*/
public static function activate()
{
// 【重要修改】移除了自动添加表单的钩子,只保留后台验证的钩子
Typecho_Plugin::factory('Widget_Feedback')->comment = array('SimpleAntiSpam_Plugin', 'validateCaptcha');
return _t('插件已激活,请务必参照说明,在主题的 comments.php 文件中手动添加代码。');
}
/**
* 禁用插件方法
*/
public static function deactivate()
{
return _t('插件已禁用。');
}
/**
* 插件配置面板 (空)
*/
public static function config(Typecho_Widget_Helper_Form $form){}
/**
* 个人配置面板 (空)
*/
public static function personalConfig(Typecho_Widget_Helper_Form $form){}
/**
* 渲染并输出验证码HTML (此函数现在需要手动调用)
*/
public static function renderCaptcha()
{
if (Typecho_Widget::widget('Widget_User')->hasLogin()) {
return;
}
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
$num1 = rand(1, 9);
$num2 = rand(1, 9);
$_SESSION['simple_anti_spam_answer'] = $num1 + $num2;
$html = '
<p class="comment-form-captcha">
<label for="captcha_code" class="required">真人验证</label>
<input type="text" name="captcha_code" id="captcha_code" class="text" size="15" value="" required />
<span class="captcha-question">'. $num1 .' + '. $num2 .' = ?</span>
<style>.captcha-question{margin-left:10px;font-weight:bold;color:#333;}.comment-form-captcha input{width:60px;vertical-align:middle;}</style>
</p>
';
echo $html;
}
/**
* 验证用户提交的答案 (此函数保持不变)
*/
public static function validateCaptcha($comment)
{
if (Typecho_Widget::widget('Widget_User')->hasLogin()) {
return $comment;
}
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
$correctAnswer = isset($_SESSION['simple_anti_spam_answer']) ? $_SESSION['simple_anti_spam_answer'] : null;
$userAnswer = isset($_POST['captcha_code']) ? $_POST['captcha_code'] : null;
if ($correctAnswer === null || $userAnswer != $correctAnswer) {
if (isset($_SESSION['simple_anti_spam_answer'])) {
unset($_SESSION['simple_anti_spam_answer']);
}
throw new Typecho_Widget_Exception(_t('验证问题回答错误,请返回重试。'));
}
unset($_SESSION['simple_anti_spam_answer']);
return $comment;
}
}
第3步:手动在主题文件中添加代码
这是最关键的一步,它将保证验证码输入框能正确显示。
找到文件:进入您当前正在使用的主题文件夹,路径通常是usr/themes/你的主题名/,
然后找到comments.php
文件。
编辑文件:打开comments.php
文件。
找到位置:在文件中找到类似<button type="submit"
或<input type="submit"
的代码,这通常是评论的“提交”按钮。
添加代码:在“提交”按钮的 上一行,添加以下这行PHP代码:
<?php SimpleAntiSpam_Plugin::renderCaptcha(); ?>
示例:
如果您原来的代码是这样的:
...
<p>
<button type="submit" class="submit"><?php _e('提交评论'); ?></button>
</p>
...
请把它修改成这样:
...
<?php SimpleAntiSpam_Plugin::renderCaptcha(); ?>
<p>
<button type="submit" class="submit"><?php _e('提交评论'); ?></button>
</p>
...
保存文件。
第4步:最后测试
现在,回到您博客的文章页面,刷新一下,您应该就能在“提交评论”按钮的上方看到“真人验证”的算术题了。