Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 24 | class Give_DB_Logs extends Give_DB { |
||
| 25 | |||
| 26 | /** |
||
| 27 | * Give_DB_Logs constructor. |
||
| 28 | * |
||
| 29 | * Set up the Give DB Donor class. |
||
| 30 | * |
||
| 31 | * @since 2.0 |
||
| 32 | * @access public |
||
| 33 | */ |
||
| 34 | public function __construct() { |
||
| 46 | |||
| 47 | /** |
||
| 48 | * Get columns and formats |
||
| 49 | * |
||
| 50 | * @since 2.0 |
||
| 51 | * @access public |
||
| 52 | * |
||
| 53 | * @return array Columns and formats. |
||
| 54 | */ |
||
| 55 | public function get_columns() { |
||
| 66 | |||
| 67 | /** |
||
| 68 | * Get default column values |
||
| 69 | * |
||
| 70 | * @since 2.0 |
||
| 71 | * @access public |
||
| 72 | * |
||
| 73 | * @return array Default column values. |
||
| 74 | */ |
||
| 75 | public function get_column_defaults() { |
||
| 89 | |||
| 90 | /** |
||
| 91 | * Add a log |
||
| 92 | * |
||
| 93 | * @since 2.0 |
||
| 94 | * @access public |
||
| 95 | * |
||
| 96 | * @param array $data |
||
| 97 | * |
||
| 98 | * @return bool|int |
||
| 99 | */ |
||
| 100 | public function add( $data = array() ) { |
||
| 137 | |||
| 138 | |||
| 139 | /** |
||
| 140 | * Retrieves a single log from the database |
||
| 141 | * |
||
| 142 | * @since 2.0 |
||
| 143 | * @access public |
||
| 144 | * |
||
| 145 | * @param int $log_id |
||
| 146 | * @param string $by |
||
| 147 | * |
||
| 148 | * @return bool|null|array |
||
| 149 | */ |
||
| 150 | public function get_log_by( $log_id = 0, $by = 'id' ) { |
||
| 180 | |||
| 181 | /** |
||
| 182 | * Retrieve logs from the database. |
||
| 183 | * |
||
| 184 | * @since 2.0 |
||
| 185 | * @access public |
||
| 186 | * |
||
| 187 | * @param array $args |
||
| 188 | * |
||
| 189 | * @return mixed |
||
| 190 | */ |
||
| 191 | public function get_logs( $args = array() ) { |
||
| 203 | |||
| 204 | |||
| 205 | /** |
||
| 206 | * Count the total number of logs in the database |
||
| 207 | * |
||
| 208 | * @since 2.0 |
||
| 209 | * @access public |
||
| 210 | * |
||
| 211 | * @param array $args |
||
| 212 | * |
||
| 213 | * @return int |
||
| 214 | */ |
||
| 215 | public function count( $args = array() ) { |
||
| 231 | |||
| 232 | /** |
||
| 233 | * Create the table |
||
| 234 | * |
||
| 235 | * @since 2.0 |
||
| 236 | * @access public |
||
| 237 | * |
||
| 238 | * @return void |
||
| 239 | */ |
||
| 240 | public function create_table() { |
||
| 260 | |||
| 261 | |||
| 262 | /** |
||
| 263 | * Get sql query from quaried array. |
||
| 264 | * |
||
| 265 | * @since 2.0 |
||
| 266 | * @access public |
||
| 267 | * |
||
| 268 | * @param array $args |
||
| 269 | * |
||
| 270 | * @return string |
||
| 271 | */ |
||
| 272 | public function get_sql( $args = array() ) { |
||
| 273 | /* @var WPDB $wpdb */ |
||
| 274 | global $wpdb; |
||
| 275 | |||
| 276 | $defaults = array( |
||
| 277 | 'number' => 20, |
||
| 278 | 'offset' => 0, |
||
| 279 | 'paged' => 0, |
||
| 280 | 'orderby' => 'date', |
||
| 281 | 'order' => 'DESC', |
||
| 282 | 'fields' => 'all', |
||
| 283 | 'count' => false, |
||
| 284 | ); |
||
| 285 | |||
| 286 | $args = wp_parse_args( $args, $defaults ); |
||
| 287 | |||
| 288 | // validate params. |
||
| 289 | $this->validate_params( $args ); |
||
| 290 | |||
| 291 | if ( $args['number'] < 1 ) { |
||
| 292 | $args['number'] = 999999999999; |
||
| 293 | } |
||
| 294 | |||
| 295 | // Where clause for primary table. |
||
| 296 | $where = ''; |
||
| 297 | |||
| 298 | // Get sql query for meta. |
||
| 299 | if ( ! empty( $args['meta_query'] ) ) { |
||
| 300 | $meta_query_object = new WP_Meta_Query( $args['meta_query'] ); |
||
| 301 | $meta_query = $meta_query_object->get_sql( 'log', $this->table_name, 'id' ); |
||
| 302 | $where = implode( '', $meta_query ); |
||
| 303 | } |
||
| 304 | |||
| 305 | $where .= ' WHERE 1=1 '; |
||
| 306 | |||
| 307 | // Set offset. |
||
| 308 | if ( empty( $args['offset'] ) && ( 0 < $args['paged'] ) ) { |
||
| 309 | $args['offset'] = $args['number'] * ( $args['paged'] - 1 ); |
||
| 310 | } |
||
| 311 | |||
| 312 | // Set fields. |
||
| 313 | $fields = "{$this->table_name}.*"; |
||
| 314 | if ( is_string( $args['fields'] ) && ( 'all' !== $args['fields'] ) ) { |
||
| 315 | $fields = "{$this->table_name}.{$args['fields']}"; |
||
| 316 | } |
||
| 317 | |||
| 318 | // Set count. |
||
| 319 | if ( $args['count'] ) { |
||
| 320 | $fields = "COUNT({$fields})"; |
||
| 321 | } |
||
| 322 | |||
| 323 | // Specific logs. |
||
| 324 | View Code Duplication | if ( ! empty( $args['ID'] ) ) { |
|
| 325 | |||
| 326 | if ( ! is_array( $args['ID'] ) ) { |
||
| 327 | $args['ID'] = explode( ',', $args['ID'] ); |
||
| 328 | } |
||
| 329 | $log_ids = implode( ',', array_map( 'intval', $args['ID'] ) ); |
||
| 330 | |||
| 331 | $where .= " AND {$this->table_name}.ID IN( {$log_ids} ) "; |
||
| 332 | } |
||
| 333 | |||
| 334 | // Logs created for a specific date or in a date range |
||
| 335 | if ( ! empty( $args['date_query'] ) ) { |
||
| 336 | $date_query_object = new WP_Date_Query( $args['date_query'], "{$this->table_name}.log_date" ); |
||
| 337 | $where .= $date_query_object->get_sql(); |
||
| 338 | } |
||
| 339 | |||
| 340 | // Logs create for specific parent. |
||
| 341 | View Code Duplication | if ( ! empty( $args['log_parent'] ) ) { |
|
| 342 | if ( ! is_array( $args['log_parent'] ) ) { |
||
| 343 | $args['log_parent'] = explode( ',', $args['log_parent'] ); |
||
| 344 | } |
||
| 345 | $parent_ids = implode( ',', array_map( 'intval', $args['log_parent'] ) ); |
||
| 346 | |||
| 347 | $where .= " AND {$this->table_name}.log_parent IN( {$parent_ids} ) "; |
||
| 348 | } |
||
| 349 | |||
| 350 | // Logs create for specific type. |
||
| 351 | // is_array check is for backward compatibility. |
||
| 352 | View Code Duplication | if ( ! empty( $args['log_type'] ) && ! is_array( $args['log_type'] ) ) { |
|
| 353 | if ( ! is_array( $args['log_type'] ) ) { |
||
| 354 | $args['log_type'] = explode( ',', $args['log_type'] ); |
||
| 355 | } |
||
| 356 | |||
| 357 | $log_types = implode( '\',\'', array_map( 'trim', $args['log_type'] ) ); |
||
| 358 | |||
| 359 | $where .= " AND {$this->table_name}.log_type IN( '{$log_types}' ) "; |
||
| 360 | } |
||
| 361 | |||
| 362 | $args['orderby'] = ! array_key_exists( $args['orderby'], $this->get_columns() ) ? 'log_date' : $args['orderby']; |
||
| 363 | |||
| 364 | $args['orderby'] = esc_sql( $args['orderby'] ); |
||
| 365 | $args['order'] = esc_sql( $args['order'] ); |
||
| 366 | |||
| 367 | return $wpdb->prepare( |
||
| 368 | "SELECT {$fields} FROM {$this->table_name} {$where} ORDER BY {$this->table_name}.{$args['orderby']} {$args['order']} LIMIT %d,%d;", |
||
| 369 | absint( $args['offset'] ), |
||
| 370 | absint( $args['number'] ) |
||
| 371 | ); |
||
| 372 | } |
||
| 373 | |||
| 374 | |||
| 375 | /** |
||
| 376 | * Validate query params. |
||
| 377 | * |
||
| 378 | * @since 2.0 |
||
| 379 | * @access private |
||
| 380 | * |
||
| 381 | * @param $args |
||
| 382 | * |
||
| 383 | * @return mixed |
||
| 384 | */ |
||
| 385 | private function validate_params( &$args ) { |
||
| 394 | } |
||
| 395 |