function alter_clauses($clauses, $q, $main_id_column) { global $wpdb; $clauses['fields'] .= ", {$wpdb->p2p}.*"; $clauses['join'] .= " INNER JOIN {$wpdb->p2p}"; // Handle main query if ($q['p2p_type']) { $clauses['where'] .= $wpdb->prepare(" AND {$wpdb->p2p}.p2p_type = %s", $q['p2p_type']); } if ('any' == $q['items']) { $search = false; } else { $search = implode(',', array_map('absint', (array) $q['items'])); } $fields = array('p2p_from', 'p2p_to'); switch ($q['direction']) { case 'from': $fields = array_reverse($fields); // fallthrough // fallthrough case 'to': list($from, $to) = $fields; $clauses['where'] .= " AND {$main_id_column} = {$wpdb->p2p}.{$from}"; if ($search) { $clauses['where'] .= " AND {$wpdb->p2p}.{$to} IN ({$search})"; } break; default: if ($search) { $clauses['where'] .= " AND (\n\t\t\t\t\t({$main_id_column} = {$wpdb->p2p}.p2p_to AND {$wpdb->p2p}.p2p_from IN ({$search})) OR\n\t\t\t\t\t({$main_id_column} = {$wpdb->p2p}.p2p_from AND {$wpdb->p2p}.p2p_to IN ({$search}))\n\t\t\t\t)"; } else { $clauses['where'] .= " AND ({$main_id_column} = {$wpdb->p2p}.p2p_to OR {$main_id_column} = {$wpdb->p2p}.p2p_from)"; } } // Handle custom fields if (!empty($q['meta'])) { $meta_clauses = _p2p_meta_sql_helper($q['meta']); foreach ($meta_clauses as $key => $value) { $clauses[$key] .= $value; } } // Handle ordering if ($q['orderby']) { $clauses['join'] .= $wpdb->prepare("\n\t\t\t\tLEFT JOIN {$wpdb->p2pmeta} AS p2pm_order ON (\n\t\t\t\t\t{$wpdb->p2p}.p2p_id = p2pm_order.p2p_id AND p2pm_order.meta_key = %s\n\t\t\t\t)\n\t\t\t", $q['orderby']); $order = 'DESC' == strtoupper($q['order']) ? 'DESC' : 'ASC'; $field = 'meta_value'; if ($q['order_num']) { $field .= '+0'; } $clauses['orderby'] = "p2pm_order.{$field} {$order}"; } return $clauses; }
/** * For low-level query modifications */ public function alter_clauses(&$clauses, $main_id_column) { global $wpdb; $clauses['fields'] .= ", {$wpdb->p2p}.*"; $clauses['join'] .= " INNER JOIN {$wpdb->p2p}"; $where_parts = array(); foreach ($this->ctypes as $directed) { if (null === $directed) { // used by migration script continue; } $part = $wpdb->prepare("{$wpdb->p2p}.p2p_type = %s", $directed->name); $fields = array('p2p_from', 'p2p_to'); switch ($directed->get_direction()) { case 'from': $fields = array_reverse($fields); // fallthrough // fallthrough case 'to': list($from, $to) = $fields; $search = $this->do_other_query($directed, 'current'); $part .= " AND {$main_id_column} = {$wpdb->p2p}.{$from}"; $part .= " AND {$wpdb->p2p}.{$to} IN ({$search})"; break; default: $part .= sprintf(" AND (\n\t\t\t\t\t({$main_id_column} = {$wpdb->p2p}.p2p_to AND {$wpdb->p2p}.p2p_from IN (%s)) OR\n\t\t\t\t\t({$main_id_column} = {$wpdb->p2p}.p2p_from AND {$wpdb->p2p}.p2p_to IN (%s))\n\t\t\t\t)", $this->do_other_query($directed, 'current'), $this->do_other_query($directed, 'opposite')); } $where_parts[] = '(' . $part . ')'; } if (1 == count($where_parts)) { $clauses['where'] .= " AND " . $where_parts[0]; } elseif (!empty($where_parts)) { $clauses['where'] .= " AND (" . implode(' OR ', $where_parts) . ")"; } // Handle custom fields if (!empty($this->meta)) { $meta_clauses = _p2p_meta_sql_helper($this->meta); foreach ($meta_clauses as $key => $value) { $clauses[$key] .= $value; } } // Handle ordering if ($this->orderby) { $clauses['join'] .= $wpdb->prepare("\n\t\t\t\tLEFT JOIN {$wpdb->p2pmeta} AS p2pm_order ON (\n\t\t\t\t\t{$wpdb->p2p}.p2p_id = p2pm_order.p2p_id AND p2pm_order.meta_key = %s\n\t\t\t\t)\n\t\t\t", $this->orderby); $order = 'DESC' == strtoupper($this->order) ? 'DESC' : 'ASC'; $field = 'meta_value'; if ($this->order_num) { $field .= '+0'; } $clauses['orderby'] = "p2pm_order.{$field} {$order}, " . str_replace('ORDER BY ', '', $clauses['orderby']); } return $clauses; }