taxonomy_select_nodes
- Versions
- 4.6
taxonomy_select_nodes($tids = array(), $operator = 'or', $depth = 0, $pager = TRUE)- 4.7 – 6
taxonomy_select_nodes($tids= array(),$operator= 'or',$depth= 0, $pager = TRUE, $order = 'n.sticky DESC, n.created DESC')- 7
taxonomy_select_nodes($tid, $pager = TRUE, $limit = FALSE, $order = array('t.sticky' => 'DESC', 't.created' => 'DESC'))
Finds all nodes that match selected taxonomy conditions.
Parameters
$tids An array of term IDs to match.
$operator How to interpret multiple IDs in the array. Can be "or" or "and".
$depth How many levels deep to traverse the taxonomy tree. Can be a nonnegative integer or "all".
$pager Whether the nodes are to be used with a pager (the case on most Drupal pages) or not (in an XML feed, for example).
$order The order clause for the query that retrieve the nodes.
Return value
A resource identifier pointing to the query results.
Code
modules/taxonomy.module, line 1092
<?php
function taxonomy_select_nodes($tids = array(), $operator = 'or', $depth = 0, $pager = TRUE, $order = 'n.sticky DESC, n.created DESC') {
if (count($tids) > 0) {
// For each term ID, generate an array of descendant term IDs to the right depth.
$descendant_tids = array();
if ($depth === 'all') {
$depth = NULL;
}
foreach ($tids as $index => $tid) {
$term = taxonomy_get_term($tid);
$tree = taxonomy_get_tree($term->vid, $tid, -1, $depth);
$descendant_tids[] = array_merge(array($tid), array_map('_taxonomy_get_tid_from_term', $tree));
}
if ($operator == 'or') {
$args = call_user_func_array('array_merge', $descendant_tids);
$placeholders = implode(',', array_fill(0, count($args), '%d'));
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $placeholders .') AND n.status = 1 AND n.moderate = 0 ORDER BY '. $order;
$sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $placeholders .') AND n.status = 1 AND n.moderate = 0';
}
else {
$args = array();
$joins = '';
$wheres = '';
foreach ($descendant_tids as $index => $tids) {
$joins .= ' INNER JOIN {term_node} tn'. $index .' ON n.nid = tn'. $index .'.nid';
$placeholders = implode(',', array_fill(0, count($tids), '%d'));
$wheres .= ' AND tn'. $index .'.tid IN ('. $placeholders .')';
$args = array_merge($args, $tids);
}
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n '. $joins .' WHERE n.status = 1 AND n.moderate = 0 '. $wheres .' ORDER BY '. $order;
$sql_count = 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n '. $joins .' WHERE n.status = 1 AND n.moderate = 0 ' . $wheres;
}
$sql = db_rewrite_sql($sql);
$sql_count = db_rewrite_sql($sql_count);
if ($pager) {
$result = pager_query($sql, variable_get('default_nodes_main', 10), 0, $sql_count, $args);
}
else {
$result = db_query_range($sql, $args, 0, variable_get('feed_default_items', 10));
}
}
return $result;
}
?>Login or register to post comments 