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;
 }
Example #2
0
 /**
  * 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;
 }