AnsPress_Query()
Description #
Base class for query.
Source #
File: includes/class-query.php
abstract class AnsPress_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 items located by the query. * * @access public * @var array */ public $objects; /** * The object currently being iterated on. * * @access public * @var object */ public $object; /** * 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 numbers of pages based on query. * * @var int */ public $total_pages = 1; /** * Current page. * * @var int */ public $paged = 1; /** * Database query offset. * * @var int */ public $offset; /** * Arguments. * * @var array */ public $args; /** * Ids to be prefetched. * * @var array */ public $ids = array( 'post' => array(), 'comment' => array(), 'question' => array(), 'answer' => array(), 'user' => array(), ); /** * This needs documentation. * * @todo Require doc. * @var array */ public $pos = array( 'post' => array(), 'comment' => array(), 'question' => array(), 'answer' => array(), 'user' => array(), ); /** * Initialize the class. * * @param array $args Arguments. */ public function __construct( $args = array() ) { $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' => get_current_user_id(), 'number' => $this->per_page, 'offset' => $this->offset, 'order' => 'DESC', ) ); $this->per_page = $this->args['number']; $this->query(); } /** * Count total numbers of rows found. * * @param string $key MD5 hashed key. */ public function total_count( $key ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found global $wpdb; $this->total_count = $wpdb->get_var( apply_filters( 'ap_found_rows', 'SELECT FOUND_ROWS()', $this ) ); // phpcs:ignore WordPress.DB } /** * Fetch results from database. */ public function query() { $this->total_pages = ceil( $this->total_count / $this->per_page ); $this->count = count( $this->objects ); } /** * Check if loop has objects. * * @return boolean */ public function have() { if ( $this->current + 1 < $this->count ) { return true; } elseif ( $this->current + 1 === $this->count ) { do_action( 'ap_loop_end' ); // Do some cleaning up after the loop. $this->rewind(); } $this->in_the_loop = false; return false; } /** * Rewind the object and reset index. */ public function rewind() { $this->current = -1; if ( $this->count > 0 ) { $this->object = $this->objects[0]; } } /** * Check if there are objects. * * @return bool */ public function has() { if ( $this->count ) { return true; } return false; } /** * Set up the next object and iterate index. * * @return object The next object to iterate over. */ public function next() { ++$this->current; $this->object = $this->objects[ $this->current ]; return $this->object; } /** * Set up the current object inside the loop. */ public function the_object() { $this->in_the_loop = true; $this->object = $this->next(); // Loop has just started. if ( 0 === $this->current ) { /** * Fires if the current object is the first in the loop. */ do_action( 'ap_loop_start' ); } } /** * Add pre fetch ids. * * @param string $type ids type. * @param integer $id id. * @param false|integer $key Object key. */ public function add_prefetch_id( $type, $id, $key = false ) { if ( empty( $id ) ) { return; } if ( ! isset( $this->ids[ $type ] ) ) { $this->ids[ $type ] = array(); } if ( ! in_array( $id, $this->ids[ $type ], true ) ) { $this->ids[ $type ][] = (int) $id; } if ( false !== $key ) { $this->add_pos( $type, $id, $key ); } } /** * Add position of reference in objects. * * @param string $type ids type. * @param integer $ref_id Reference ID. * @param mixed $key Object key. */ public function add_pos( $type, $ref_id, $key ) { if ( ! isset( $this->pos[ $type ] ) ) { $this->pos[ $type ] = array(); } if ( ! isset( $this->pos[ $type ][ $ref_id ] ) ) { $this->pos[ $type ][ $ref_id ] = $key; return; } $prev_val = $this->pos[ $type ][ $ref_id ]; if ( ! is_array( $prev_val ) ) { $this->pos[ $type ][ $ref_id ] = array( $prev_val, $key ); return; } if ( is_array( $prev_val ) ) { $this->pos[ $type ][ $ref_id ][] = $key; } } /** * Add reference data to obejcts. * * @param string $type ids type. * @param integer $ref_id Reference ID. * @param mixed $data Reference data. */ public function append_ref_data( $type, $ref_id, $data ) { if ( isset( $this->pos[ $type ] ) && ( 0 == $this->pos[ $type ][ $ref_id ] || ! empty( $this->pos[ $type ][ $ref_id ] ) ) // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual ) { $pos = $this->pos[ $type ][ $ref_id ]; if ( is_array( $pos ) ) { foreach ( (array) $pos as $key ) { $this->objects[ $key ]->ref = $data; } } else { $this->objects[ $pos ]->ref = $data; } } } /** * Include a template file. * * @param string $template Path to template file without .php extension. */ public function template( $template ) { include ap_get_theme_location( $template . '.php' ); } /** * Check if loop has more pages. * * @return boolean * @since 4.1.2 */ public function have_pages() { return $this->total_pages > $this->paged; } }
Expand full source code Collapse full source code View on GitHub: includes/class-query.php:20
Add your comment