AnsPress_Reputation_Query()
Description #
User reputations loop Query wrapper for fetching reputations of a specific user by ID
Parameters #
- $argsarray | string (Required) arguments passed to class. @param string $user_id WordPress user_id, default is current user_id @param integer $number Numbers of rows to fetch from database, default is 20 @param integer $offset Rows to offset
Source #
File: includes/reputation.php
class AnsPress_Reputation_Query { /** * The loop iterator. * * @access public * @var int */ public $current = -1; /** * The number of rows returned by the paged query. * * @access public * @var int */ public $count; /** * Array of users located by the query. * * @access public * @var array */ public $reputations; /** * The reputation object currently being iterated on. * * @access public * @var object */ public $reputation; /** * A flag for whether the loop is currently being iterated. * * @access public * @var bool */ public $in_the_loop; /** * The total number of rows matching the query parameters. * * @access public * @var int */ public $total_count; /** * Items to show per page * * @access public * @var int */ public $per_page = 20; /** * Total pages count. * * @var int */ public $total_pages = 1; /** * Maximum numbers of pages. * * @var int */ public $max_num_pages = 0; /** * Currently paginated page. * * @var int */ public $paged; /** * Current offset. * * @var int */ public $offset; /** * Array of items without any points. * * @var array */ public $with_zero_points = array(); /** * Reputation events. * * @var array */ public $events; /** * Ids for prefetching. * * @var array */ public $ids = array( 'post' => array(), 'comment' => array(), 'question' => array(), 'answer' => array(), ); /** * Position. * * @var array */ public $pos = array(); /** * Arguments. * * @var array */ public $args = array(); /** * Initialize the class. * * @param array $args Arguments. */ public function __construct( $args = array() ) { $this->events = ap_get_reputation_events(); $this->get_events_with_zero_points(); $this->paged = isset( $args['paged'] ) ? (int) $args['paged'] : 1; $this->offset = $this->per_page * ( $this->paged - 1 ); $this->args = wp_parse_args( $args, array( 'user_id' => 0, 'number' => $this->per_page, 'offset' => $this->offset, 'order' => 'DESC', ) ); $this->per_page = $this->args['number']; $this->query(); } /** * Get events having zero points. */ public function get_events_with_zero_points() { foreach ( (array) $this->events as $slug => $args ) { if ( 0 === $args['points'] ) { $this->with_zero_points[] = $slug; } } } /** * Prepare and fetch reputations from database. */ private function query() { global $wpdb; $order = 'DESC' === $this->args['order'] ? 'DESC' : 'ASC'; $excluded = sanitize_comma_delimited( $this->with_zero_points, 'str' ); $not_in = ''; if ( ! empty( $excluded ) ) { $not_in = " AND rep_event NOT IN({$excluded})"; } $query = $wpdb->prepare( "SELECT SQL_CALC_FOUND_ROWS * FROM {$wpdb->ap_reputations} WHERE rep_user_id = %d{$not_in} ORDER BY rep_date {$order} LIMIT %d,%d", $this->args['user_id'], $this->offset, $this->per_page ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared $result = $wpdb->get_results( $query ); // phpcs:ignore WordPress.DB $this->total_count = $wpdb->get_var( apply_filters( 'ap_reputations_found_rows', 'SELECT FOUND_ROWS()', $this ) ); // phpcs:ignore WordPress.DB $this->reputations = $result; $this->total_pages = ceil( $this->total_count / $this->per_page ); $this->count = count( $result ); $this->prefetch(); } /** * Prefetch related items. */ public function prefetch() { foreach ( (array) $this->reputations as $key => $rep ) { $event = $this->events[ $rep->rep_event ]; if ( ! isset( $this->ids[ $event['parent'] ] ) ) { $this->ids[ $event['parent'] ] = array(); } $this->ids[ $event['parent'] ][] = $rep->rep_ref_id; $this->reputations[ $key ]->parent = $event['parent']; $this->pos[ $rep->rep_ref_id ] = $key; } $this->prefetch_posts(); $this->prefetch_comments(); } /** * Pre fetch post contents and append to object. */ public function prefetch_posts() { global $wpdb; $ids = array_merge( $this->ids['post'], $this->ids['answer'], $this->ids['question'] ); $ids = esc_sql( sanitize_comma_delimited( $ids ) ); if ( ! empty( $ids ) ) { $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} WHERE ID in ({$ids})" ); // phpcs:ignore WordPress.DB foreach ( (array) $posts as $_post ) { $this->reputations[ $this->pos[ $_post->ID ] ]->ref = $_post; } } } /** * Pre fetch comments and append data to object. */ public function prefetch_comments() { global $wpdb; if ( empty( $this->ids['comment'] ) ) { return; } $ids = esc_sql( sanitize_comma_delimited( $this->ids['comment'] ) ); $comments = $wpdb->get_results( "SELECT * FROM {$wpdb->comments} WHERE comment_ID in ({$ids})" ); // phpcs:ignore WordPress.DB foreach ( (array) $comments as $_comment ) { $this->reputations[ $this->pos[ $_comment->comment_ID ] ]->ref = $_comment; } } /** * Check if lopp has reputation. * * @return boolean */ public function have() { if ( $this->current + 1 < $this->count ) { return true; } elseif ( ( $this->current + 1 ) === $this->count ) { do_action( 'ap_reputations_loop_end' ); // Do some cleaning up after the loop. $this->rewind_reputation(); } $this->in_the_loop = false; return false; } /** * Rewind the reputations and reset index. */ public function rewind_reputation() { $this->current = -1; if ( $this->count > 0 ) { $this->reputation = $this->reputations[0]; } } /** * Check if there are reputations. * * @return bool */ public function has() { if ( $this->count ) { return true; } return false; } /** * Set up the next reputation and iterate index. * * @return object The next reputation to iterate over. */ public function next_reputation() { ++$this->current; $this->reputation = $this->reputations[ $this->current ]; return $this->reputation; } /** * Set up the current reputation inside the loop. */ public function the_reputation() { $this->in_the_loop = true; $this->reputation = $this->next_reputation(); // Loop has just started. if ( 0 === $this->current ) { /** * Fires if the current reputation is the first in the loop. */ do_action( 'ap_reputation_loop_start' ); } } /** * Return current reputation event. * * @return string */ public function get_event() { return $this->reputation->rep_event; } /** * Echo current reputation event. */ public function the_event() { echo wp_kses_post( $this->get_event() ); } /** * Return current reputation points. * * @return integer */ public function get_points() { return ap_get_reputation_event_points( $this->reputation->rep_event ); } /** * Echo current reputation points. * Alice of `get_points`. */ public function the_points() { echo esc_attr( $this->get_points() ); } /** * Return current reputation date date. * * @return string */ public function get_date() { return $this->reputation->rep_date; } /** * Echo current reputation date. */ public function the_date() { echo esc_attr( ap_human_time( $this->get_date(), false ) ); } /** * Return current reputation icon. * * @return string */ public function get_icon() { return ap_get_reputation_event_icon( $this->reputation->rep_event ); } /** * Echo current reputation icon. */ public function the_icon() { echo esc_attr( $this->get_icon() ); } /** * Return current reputation activity. * * @return string */ public function get_activity() { return ap_get_reputation_event_activity( $this->reputation->rep_event ); } /** * Echo current reputation activity. */ public function the_activity() { echo wp_kses_post( $this->get_activity() ); } /** * Out put reference content. */ public function the_ref_content() { if ( in_array( $this->reputation->parent, array( 'post', 'question', 'answer' ), true ) ) { echo '<a class="ap-reputation-ref" href="' . esc_url( ap_get_short_link( array( 'ap_p' => $this->reputation->rep_ref_id ) ) ) . '">'; if ( ! empty( $this->reputation->ref->post_title ) ) { echo '<strong>' . esc_html( $this->reputation->ref->post_title ) . '</strong>'; } if ( ! empty( $this->reputation->ref->post_content ) ) { echo '<p>' . esc_html( ap_truncate_chars( wp_strip_all_tags( $this->reputation->ref->post_content ), 200 ) ) . '</p>'; } echo '</a>'; } elseif ( 'comment' === $this->reputation->parent ) { echo '<a class="ap-reputation-ref" href="' . esc_url( ap_get_short_link( array( 'ap_c' => $this->reputation->rep_ref_id ) ) ) . '">'; if ( ! empty( $this->reputation->ref->comment_content ) ) { echo '<p>' . esc_html( ap_truncate_chars( wp_strip_all_tags( $this->reputation->ref->comment_content ), 200 ) ) . '</p>'; } echo '</a>'; } } }
Expand full source code Collapse full source code View on GitHub: includes/reputation.php:507
Add your comment