dz后台设置的词语过滤不起效果了
common_word 表数据是有的./source/class/discuz/discuz_censor.php 文件中public function __construct() { global $_G; loadcache(array('censor', 'bbcodes_display')); $this->censor_words = !empty($_G['cache']['censor']) ? $_G['cache']['censor'] : array(); $this->bbcodes_display = $_G['cache']['bbcodes_display'][$_G['groupid']];但是 $this->censor_words 获取到的内容是空数组
想问下 $_G['cache']['censor'] 这个数组在哪可以查看和设置,更新过缓存也没用 在Discuz!中,`$_G` 是一个全局变量数组,包含了系统运行时的各种配置和数据。`$_G` 数组的内容通常是通过 `loadcache()` 函数加载的缓存数据。你提到的问题是关于词语过滤不起作用,并且 `$_G` 数组中的 `censor` 数据为空。以下是一些可能的原因和解决方法:
### 1. 检查缓存是否正确加载
`$_G` 数组中的 `censor` 数据是通过 `loadcache('censor')` 加载的。如果 `censor` 缓存没有正确加载,可能会导致 `$_G['censor']` 为空。
你可以尝试手动更新缓存:
- 进入Discuz!后台 -> 工具 -> 更新缓存,确保所有缓存都已更新。
- 你也可以通过代码手动更新缓存:
loadcache('censor');
### 2. 检查 `common_word` 表数据
确保 `common_word` 表中有正确的过滤词数据。你可以通过数据库管理工具(如phpMyAdmin)直接查看 `common_word` 表,确保数据存在且格式正确。
### 3. 检查 `censor` 缓存生成逻辑
`censor` 缓存是通过 `source/class/table/table_common_word.php` 中的 `fetch_all_by_type()` 方法生成的。你可以检查这个方法是否正常工作,确保缓存数据能够正确生成。
### 4. 检查 `discuz_censor.php` 文件
你提到的 `discuz_censor.php` 文件中的 `__construct()` 方法,确保 `$_G['censor']` 被正确赋值。你可以尝试在 `__construct()` 方法中添加调试代码,检查 `$_G['censor']` 是否被正确加载:
public function __construct() {
global $_G;
loadcache(array('censor', 'bbcodes_display'));
$this->censor_words = !empty($_G['censor']) ? $_G['censor'] : array();
$this->bbcodes_display = $_G['bbcodes_display'];
// 调试代码
print_r($_G['censor']);
exit;
}
### 5. 检查插件或模板冲突
有时候,某些插件或模板可能会修改 `$_G` 数组的内容,导致 `censor` 数据丢失。你可以尝试禁用所有插件,切换到默认模板,看看问题是否依然存在。
### 6. 检查文件权限
确保 `data/cache/` 目录及其子目录有正确的写入权限,以便系统能够正常生成缓存文件。
### 7. 检查 `config_global.php` 配置
确保 `config_global.php` 中的缓存配置正确,特别是 `$_config['cache']['type']` 和 `$_config['cache']['cachedir']`。
### 8. 手动更新 `censor` 缓存
如果以上方法都无效,你可以尝试手动更新 `censor` 缓存:
C::t('common_word')->updatecache();
### 总结
通过以上步骤,你应该能够找到 `$_G['censor']` 为空的原因并解决问题。如果问题依然存在,建议进一步检查系统日志或联系专业开发者进行排查。
如果你有其他问题或需要进一步的帮助,请随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 在Discuz!中,`$_G` 是一个全局变量数组,包含了当前站点的各种配置和缓存数据。你提到的 `$_G['cache']['censor']` 是存储词语过滤规则的地方。如果 `$_G['cache']['censor']` 是空的,那么词语过滤功能就无法正常工作。
### 1. 检查缓存是否正常加载
首先,确保缓存已经正确加载。你可以在 `source/class/discuz/discuz_censor.php` 文件中添加一些调试代码,检查 `$_G['cache']['censor']` 是否为空。
public function __construct() {
global $_G;
loadcache(array('censor', 'bbcodes_display'));
// 调试代码
if (empty($_G['cache']['censor'])) {
echo "censor cache is empty!";
exit;
}
$this->censor_words = !empty($_G['cache']['censor']) ? $_G['cache']['censor'] : array();
$this->bbcodes_display = $_G['cache']['bbcodes_display'];
}
如果输出 `censor cache is empty!`,说明缓存没有正确加载。
### 2. 手动更新缓存
你可以尝试手动更新缓存,确保 `censor` 缓存被正确加载。
- 进入Discuz!后台,找到 `工具` -> `更新缓存`,然后点击 `更新缓存` 按钮。
- 或者通过命令行工具更新缓存(如果你有命令行访问权限):
php /path/to/discuz/script/update_cache.php
### 3. 检查 `common_word` 表
确保 `common_word` 表中有数据,并且数据格式正确。你可以通过数据库管理工具(如phpMyAdmin)查看 `common_word` 表的内容。
### 4. 检查 `censor` 缓存的生成逻辑
如果缓存更新后仍然无效,可以检查 `source/function/cache/cache_censor.php` 文件,确保缓存生成逻辑没有问题。
function build_cache_censor() {
$data = array();
$query = DB::query("SELECT * FROM ".DB::table('common_word')." WHERE type IN ('banned', 'mod', 'filter')");
while($word = DB::fetch($query)) {
$data[$word['type']][$word['find']] = $word['replacement'];
}
save_syscache('censor', $data);
}
### 5. 检查 `$_G` 数组的初始化
`$_G` 数组是在 `source/class/discuz/discuz_application.php` 文件中初始化的。你可以检查这个文件,确保 `$_G` 数组的初始化逻辑没有问题。
### 6. 检查插件冲突
如果你安装了某些插件,可能会影响到 `$_G` 数组的初始化或缓存加载。尝试禁用所有插件,看看问题是否依然存在。
### 7. 检查文件权限
确保 `data/cache` 目录及其子目录有正确的写入权限,以便缓存文件能够正常生成。
### 8. 检查服务器环境
如果以上方法都无效,可能是服务器环境问题。检查PHP版本、内存限制、文件权限等,确保它们符合Discuz!的要求。
### 总结
通过以上步骤,你应该能够找到 `$_G['cache']['censor']` 为空的原因。如果问题依然存在,建议在DZ插件网(https://www.dz-x.net/)上寻求更多帮助,或者查看相关文档和社区讨论。
希望这些建议能帮助你解决问题!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]