Php 如何获取Drupal 7自定义节点的特定字段中包含的值?

Php 如何获取Drupal 7自定义节点的特定字段中包含的值?,php,api,drupal,field,drupal-7,Php,Api,Drupal,Field,Drupal 7,获取存储在定制Drupal节点中特定字段中的值的“正确”方法是什么?我创建了一个自定义模块,带有一个自定义节点和一个自定义URL字段。以下工作: $result = db_query("SELECT nid FROM {node} WHERE title = :title AND type = :type", array( ':title' => $title, ':type' => 'custom', ))->fetchField(); $node = node_lo

获取存储在定制Drupal节点中特定字段中的值的“正确”方法是什么?我创建了一个自定义模块,带有一个自定义节点和一个自定义URL字段。以下工作:

$result = db_query("SELECT nid FROM {node} WHERE title = :title AND type = :type", array(
  ':title' => $title,
  ':type' => 'custom',
))->fetchField();
$node = node_load($result);
$url = $node->url['und']['0']['value'];
…但是有没有更好的方法,可以使用新的字段API函数?

node\u load()
然后将字段作为属性访问是正确的方法,尽管为了避免对区域设置进行硬编码,我会稍微做些改变:

$lang = LANGUAGE_NONE;
$node = node_load($nid);
$url = $node->url[$lang][0]['value'];
您用来获取nid的方法是一种特别笨拙的推导方法;我将专注于重构它并使用它,而不是:


您可能希望这样做,特别是因为title不是唯一的属性,并且字段出现在节点以外的实体上。在这种情况下,您需要删除
entityCondition()

不确定讨论EntityFieldQuery的原因,但可以。:)实际上,您需要使用该函数

if ($nodes = node_load_multiple(array(), array('type' => 'custom', 'title' => $title)) {
  $node = reset($nodes);
  if ($items = field_get_items('node', $node, 'url')) {
    $url = $items[0]['value'];
    // Do whatever
  }
}
属性条件('field\u order\u no','value','search key','=')


字段\顺序\编号是自定义字段的slug&搜索键是要匹配的值

感谢您的反馈!你知道一种更好的获取nid的方法吗?如果只提供节点的标题,那么@Matt我会使用
EntityFieldQuery
和实体API,尤其是考虑到字段可以出现在节点以外的东西上。我已经用一种可能的重构方法更新了我的答案。
EntityFieldQuery
正在讨论中,因为您在代码中使用的
node\u load\u multiple()
的条件参数有利于
EntityFieldQuery
。要做与作为节点上的属性访问字段完全相同的事情还有很长的路要走。确实,该参数已被弃用,但仍在使用。它可能不会在Drupal8上使用,但我认为在Drupal7上使用它是安全的。
if ($nodes = node_load_multiple(array(), array('type' => 'custom', 'title' => $title)) {
  $node = reset($nodes);
  if ($items = field_get_items('node', $node, 'url')) {
    $url = $items[0]['value'];
    // Do whatever
  }
}