/** * @param array $args * @param string $output_type * @return int|mixed */ public function find($args, $output_type = OBJECT) { $args = wp_parse_args($args, array('select' => '*', 'offset' => 0, 'limit' => 1, 'orderby' => 'id', 'order' => 'DESC', 'type' => '', 'email' => '', 'datetime_after' => '', 'datetime_before' => '', 'include_errors' => true)); $where = array(); $params = array(); // build general select from query $query = sprintf("SELECT %s FROM `%s`", $args['select'], $this->table_name); // add email to WHERE clause if ('' !== $args['email']) { $where[] = 'email LIKE %s'; $params[] = '%%' . $this->db->esc_like($args['email']) . '%%'; } // add type to WHERE clause if ('' !== $args['type']) { $where[] = 'type = %s'; $params[] = $args['type']; } // add datetime to WHERE clause if ('' !== $args['datetime_after']) { $where[] = 'datetime >= %s'; $params[] = $args['datetime_after']; } if ('' !== $args['datetime_before']) { $where[] = 'datetime <= %s'; $params[] = $args['datetime_before']; } // add where parameters if (count($where) > 0) { $query .= ' WHERE ' . implode(' AND ', $where); } // prepare parameters if (!empty($params)) { $query = $this->db->prepare($query, $params); } // return result count if ($args['select'] === 'COUNT(*)') { return (int) $this->db->get_var($query); } // return single row if ($args['limit'] === 1) { $query .= ' LIMIT 1'; return $this->db->get_row($query); } // perform rest of query $args['limit'] = absint($args['limit']); $args['offset'] = absint($args['offset']); $args['orderby'] = preg_replace("/[^a-zA-Z]/", "", $args['orderby']); $args['order'] = preg_replace("/[^a-zA-Z]/", "", $args['order']); // add ORDER BY, OFFSET and LIMIT to SQL $query .= sprintf(' ORDER BY `%s` %s LIMIT %d, %d', $args['orderby'], $args['order'], $args['offset'], $args['limit']); return $this->db->get_results($query, $output_type); }