Да, есть чистые способы сделать это, но я не могу дать очень конкретный совет, фактически не увидев вашу структуру данных. Я бы начал с самого начала и просто var_dump()
на каждом шагу.
Например, сначала выберите термин, соответствующий указанному вами идентификатору термина:
$term = taxonomy_term_load($tid);
var_dump($term);
Посмотрите на var_dump()
, чтобы узнать, как получить доступ к полю справочных терминов. Я предполагаю, что это будет примерно так:
foreach (field_get_items('taxonomy_term', $term, 'YOUR_TERM_REFERENCE_FIELD') as $referenced_term) {
var_dump($referenced_term);
}
Тогда посмотри, что тебе там дано. Затем, после этого, сделайте то же самое, чтобы получить все упомянутые узлы.
Весь процесс в основном будет включать в себя циклическое прохождение каждого уровня, загрузку ссылок, циклическое прохождение по ним, загрузку ссылок и так далее, пока у вас не появятся нужные вам узлы. Таким образом, вы можете получить что-то вроде следующего, предполагая, что ваше поле ссылки на термин называется field_term_reference
, а поле ссылки на ваш узел - field_node_reference
:
$nodes = array();
$term = taxonomy_term_load($tid);
foreach (field_get_items('taxonomy_term', $term, 'field_term_reference') as $referenced_tid) {
$referenced_term = taxonomy_term_load($referenced_tid['tid']);
foreach (field_get_items('taxonomy_term', $referenced_term, 'field_node_reference') as $referenced_nid) {
$nodes[] = node_load($referenced_nid['nid']);
}
}
return $nodes;
Кроме того, после того, как вы наконец сможете получить свои узлы, вы можете вернуться к своему коду и объединить некоторые циклы foreach
в функции D7, которые загружают несколько объектов, например taxonomy_term_load_multiple()
и node_load_multiple()
. Это уменьшит количество обращений к базе данных и сделает работу более производительной.
Если вам нужен более конкретный ответ, не стесняйтесь размещать более подробную информацию о ваших данных, и я обновлю свой ответ.