重力表单中的关键字检查

时间:2017-05-20 作者:bushrang

在Gravity表单中,我想包括一个小型的关键字检查器,用于检查用户消息中的“垃圾邮件”单词,并停止向管理员发送条目。为此,隐藏字段会更改其值。我的函数中包含此代码。迄今为止的php

function strpos_arr($haystack, $needle) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $what) {
    if(($pos = stripos($haystack, $what))!==false) return $pos;
}
return false;
}

/*
* Our bad words validation function
*/


add_action(\'gform_pre_submission_1\', \'keywords_check\'); 

function keywords_check($validation_result){
$form = $validation_result["form"];


$stop_words = array(
    \'outsource\', 
    \'Madam\', // this covers all variations of \'Sir/Madam\' \'Sir /Madam\' \'Sir/ Madam\' \'Sir / Madam\' etc
    \'SEO\',
    \'long term relationship\',
);

$stop_id = array();

foreach($_POST as $id => $post)
{
    if(strpos_arr($post, $stop_words))
    {
        /*
         * We have a match so store the post ID so we can count it
         */ 
         $stop_id[] = $id;
    }
}

if(sizeof($stop_id) > 0)
{
    $validation_result[\'is_valid\'] = false;


    $_POST[\'input_55\'] = "No";

}

}
这段代码开头的部分似乎有问题,尤其是

foreach($needle as $what) {
    if(($pos = stripos($haystack, $what))!==false) return $pos;
}
发送表单后,我收到以下警告

Warning: stripos() expects parameter 1 to be string, array given on line 109
在问这个问题之前,我已经有几个小时的php noob测试和错误测试了。有人能帮我解决这个问题吗?

3 个回复
SO网友:Frank P. Walentynowicz

问题出在功能上strpos_arr. 如果你的坏话$pos = 0 比输出总是false. 更换管路:

if(($pos = stripos($haystack, $what))!==false) return $pos;
使用:

if(($pos = stripos($haystack, $what))!==false) return true;
您的keywords_check 将其用作重力表单字段验证过滤器可以大大简化函数:

function keywords_check( $result, $value, $form, $field ) {
    $stop_words = array(
        \'outsource\', 
        \'Madam\', // this covers all variations of \'Sir/Madam\' \'Sir /Madam\' \'Sir/ Madam\' \'Sir / Madam\' etc
        \'SEO\',
        \'long term relationship\',
    );

    if ( strpos_arr( $value, $stop_words ) ) {
        $result[\'is_valid\'] = false;
        $result[\'message\'] = \'Illegal words entered\';
    }
    return $result;
}
add_filter( \'gform_field_validation_2_4\', \'keywords_check\', 10, 4 );
注意本例中“hook”名称中的两个数字。2-表单id,4-字段id。调整这些数字以匹配您的表单。

SO网友:Dave from Gravity Wiz

我有一个插件,也可以通过默认的WordPress评论黑名单功能来处理这个问题:https://gravitywiz.com/documentation/gravity-forms-comment-blacklist/

SO网友:Anthony D

我建议对弗兰克·P·瓦伦蒂诺维奇的答案进行补充。这样您就不需要不断编辑functions.php 当您要添加/删除到$stop_words 大堆

您可以通过利用内置Wordpress Comment Blacklist 特色

保存在wp黑名单中的所有内容都存储在数据库中的wp\\U选项表中blacklist_keys. https://codex.wordpress.org/Option_Reference

在您的keywords_check 函数您可以获取这些键并将其存储在变量中:

$blacklisted = get_option(\'blacklist_keys\');
现在,将它们转换为适当的数组:

$stop_words = preg_split("/[\\s,]+/", $blacklisted);
所有停止词将从WP黑名单中删除。您可以按照Frank的回答中的详细说明继续函数的其余部分。即使是非开发人员也可以从Wordpress仪表板上帮助过滤垃圾邮件。

这里是全部:

function strpos_arr($haystack, $needle) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $what) {
        if(($pos = stripos($haystack, $what))!==false) return true;
    }
    return false;
}
add_action(\'gform_pre_submission_1\', \'keywords_check\');

function keywords_check( $result, $value, $form, $field ) {
    $blacklisted = get_option(\'blacklist_keys\');
    $stop_words = preg_split("/[\\s,]+/", $blacklisted);

    if ( strpos_arr( $value, $stop_words ) ) {
        $result[\'is_valid\'] = false;
        $result[\'message\'] = \'Illegal words entered\';
    }
    return $result;
}
add_filter( \'gform_field_validation_2_4\', \'keywords_check\', 10, 4 );
如果您不需要像下面的答案详细信息那样测试特定的表单字段,我有一个解决方案,可以针对所有表单字段测试WP注释黑名单。

GitHub链接如下:https://github.com/adaprile/Gravity-Forms-WP-Comment-Blacklist

我希望这对某人有帮助!

结束

相关推荐

联系人表单函数应该在函数.php中还是在插件文件中?

我现在的函数中有一个函数。在前端显示联系人表单的php文件,还检查用户数据并发送电子邮件,所以问题是,我应该把它放在原处(functions.php)吗??或者将其包含在插件中。我必须说,到目前为止,所提到的表单是附加到主题功能的,例如,它使用用户在自定义屏幕上选择的颜色,但我想知道在这种情况下是否属于“插件领域”,非常感谢!