常见字段名是ishidden、hidden、status或is_show;判断时需用isset()和==0而非!$row['ishidden'];查询应集中加where条件;前端需同步显隐标识并清除缓存。

PHP中判断栏目是否显示的常见字段名
大多数CMS(如dedecms、帝国、自研系统)会用一个整型字段标记栏目可见性,常见字段名是 ishidden、hidden、status 或 is_show。注意:不是所有系统都叫 is_display 或 visible,得先查数据库表结构。
典型判断逻辑是:
-
ishidden = 0表示显示(默认值) -
ishidden = 1表示隐藏(不参与前台导航、列表、面包屑)
别直接写 if ($row['ishidden']) —— 这会把 0 当 false、1 当 true,但有些系统反着来(比如 is_show = 1 才显示),必须结合文档或字段注释确认语义。
在模板中安全判断栏目显隐的写法
在PHP模板(如 dedecms 的 list_article.htm)里,不能只靠变量输出,要包裹逻辑判断。常见错误是直接 echo 字段值,却不校验是否该显示。
立即学习“PHP免费学习笔记(深入)”;
推荐写法(以 ishidden 字段为例):
<?php if (isset($row['ishidden']) && $row['ishidden'] == 0): ?>
<a href="<code><?php echo $row['typeurl']; ?></code>"><?php echo $row['typename']; ?></a>
<?php endif; ?>关键点:
- 必须用
isset()防止未定义索引警告 - 用
== 0而非!$row['ishidden'],避免null或字符串'0'导致误判 - 如果字段是字符串类型(如
'true'/'false'),需用=== 'true'或filter_var($val, FILTER_VALIDATE_BOOLEAN)
后台PHP逻辑中统一获取“可显示栏目”的查询条件
在控制器或模型里查栏目列表时,显隐判断不该散落在各处,应集中到 SQL 或 Query Builder 中。
例如使用 PDO 查询可见栏目:
$stmt = $pdo->prepare("SELECT * FROM `#@__arctype` WHERE `reid` = ? AND `ishidden` = 0 ORDER BY `sortrank`");
$stmt->execute([$parent_id]);或者在 ThinkPHP 中:
Db::name('arctype')->where('reid', $pid)->where('ishidden', 0)->select();注意:ishidden 字段通常不加索引,若栏目量大(>1000),建议对它加普通索引提升查询速度;同时确认该字段是否允许为 NULL——若允许,WHERE ishidden = 0 会漏掉 NULL 行,此时应写成 WHERE COALESCE(ishidden, 0) = 0 或明确排除 IS NULL。
前端“可视”反馈常被忽略的兼容场景
所谓【可视】,不只是 PHP 输出与否,还包括 JS 动态加载栏目时的同步判断。比如点击切换频道,AJAX 返回的 JSON 数据里若没带 ishidden 字段,前端就无法做显隐控制。
所以后端 API 必须确保返回数据包含显隐标识,并且命名一致:
- 不要有的接口传
show,有的传display - 不要在 JSON 里省略该字段(哪怕值是
false),否则 JSdata.show === undefined和data.show === false处理逻辑不同 - 如果前端用 Vue/React 渲染导航,建议在 PHP 层就过滤掉隐藏项,而不是传全量再用 JS
v-if过滤——减少无意义数据传输和渲染负担
最易被忽略的是缓存场景:栏目显隐变更后,模板缓存、Redis 缓存、CDN 缓存可能仍返回旧状态,务必在更新 ishidden 同时清除对应缓存键(如 cache_menu_{$pid})。











