wpdb = $wpdb; $this->table = $this->resolve_table(); } /** * Resolve table name in child class. * * @return string */ abstract protected function resolve_table(); /** * Find a single row by ID. * * @param int $id Record ID. * @return object|null */ public function find( $id ) { return $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM {$this->table} WHERE id = %d", absint( $id ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * Delete a record. * * @param int $id Record ID. * @return bool */ public function delete( $id ) { $result = $this->wpdb->delete( $this->table, array( 'id' => absint( $id ) ), array( '%d' ) ); return false !== $result; } /** * Current local datetime. * * @return string */ protected function now() { return current_time( 'mysql' ); } /** * Restrict sortable columns. * * @param string $orderby Requested column. * @param array $allowed Allowed columns. * @param string $default Default column. * @return string */ protected function sanitize_orderby( $orderby, $allowed, $default ) { return in_array( $orderby, $allowed, true ) ? $orderby : $default; } /** * Restrict sort direction. * * @param string $order Requested order. * @return string */ protected function sanitize_order( $order ) { return 'ASC' === strtoupper( (string) $order ) ? 'ASC' : 'DESC'; } }