Drupal entity metadata wrapper无bundle属性且Title属性不存在报错排查
解决Drupal Entity Metadata Wrapper提示“Title属性不存在”的问题
我之前在Drupal 7项目里碰到过几乎一模一样的问题,结合你提到的“无bundle属性”的线索,大概率是下面几个原因导致的,咱们一步步排查:
1. 传入的节点无效或缺失核心属性
首先要确认你传入的$nid对应的节点是真实存在且完整的:
- 如果
$nid是数字ID,先手动加载节点检查:$node = node_load($nid);,如果返回FALSE,说明节点不存在,wrapper自然找不到任何属性。 - 如果
$nid是节点对象,检查它是否缺失type(bundle)属性——Entity Metadata Wrapper依赖bundle信息来加载对应内容类型的字段元数据,要是$node->type为空,wrapper根本不知道该识别哪些字段,包括默认的title。
你可以先加一段验证代码:
// 统一处理ID或对象的情况 $node = is_numeric($nid) ? node_load($nid) : $nid; // 验证节点有效性 if (!$node || empty($node->type) || !isset($node->title)) { drupal_set_message(t('无效的节点数据,请检查节点ID或对象完整性'), 'error'); return; } // 再创建wrapper $wrapper = entity_metadata_wrapper('node', $node);
2. Entity模块元数据缓存过期
7.x-1.8版本的Entity模块缓存机制偶尔会出问题,尤其是当你修改过内容类型字段、新增/删除bundle之后,元数据缓存没有及时更新,导致wrapper识别不到默认的title字段。
解决办法很简单:
- 后台手动清空所有缓存(配置 > 性能 > 清空所有缓存);
- 或者用Drush命令:
drush cc all; - 极端情况下可以手动刷新entity元数据缓存:
entity_info_cache_clear();
3. 内容类型意外移除了Title字段
虽然Drupal 7默认所有节点类型都自带title字段,但不排除通过自定义代码(比如hook_node_info())或者第三方模块刻意隐藏/移除了该字段的情况。
你可以用代码检查对应内容类型的title字段是否存在:
$title_instance = field_info_instance('node', 'title', $node->type); if (!$title_instance) { drupal_set_message(t('当前内容类型未启用Title字段'), 'error'); }
4. Entity模块版本bug
7.x-1.8确实存在一些已知的小bug,比如在特定场景下无法正确识别核心默认字段。如果以上步骤都排查无果,可以尝试升级Entity模块到7.x-1.9或更高的稳定版本(升级前记得备份站点和数据库)。
另外,你也可以用getPropertyInfo()方法查看wrapper能识别的所有属性,确认title是否在列表里:
$wrapper = entity_metadata_wrapper('node', $node); // 如果安装了Devel模块,用dpm打印属性列表 dpm($wrapper->getPropertyInfo());
内容的提问来源于stack exchange,提问作者PimD1988
相关产品推荐
相关产品推荐

