Question_Query()
Description #
QA Query class
Source #
File: includes/qaquery.php
class Question_Query extends WP_Query { /** * Count SQL query. * * @var string */ public $count_request; /** * Initialize class. * * @param array|string $args Query args. * @since unknown * @since 4.1.5 Include future questions if user have privilege. */ public function __construct( $args = array() ) { if ( is_front_page() ) { $paged = ap_sanitize_unslash( 'ap_paged', 'g', 1 ); } else { $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; } if ( isset( $args['post_parent'] ) ) { $post_parent = $args['post_parent']; } else { $post_parent = ( get_query_var( 'parent' ) ) ? get_query_var( 'parent' ) : false; } if ( ! isset( $args['ap_order_by'] ) ) { $args['ap_order_by'] = ap_get_current_list_filters( 'order_by', 'active' ); } $defaults = array( 'showposts' => ap_opt( 'question_per_page' ), 'paged' => $paged, 'ap_query' => true, 'ap_order_by' => 'active', 'ap_question_query' => true, 'post_status' => array( 'publish' ), 'ap_current_user_ignore' => false, ); $this->args = wp_parse_args( $args, $defaults ); $this->args['ap_order_by'] = sanitize_title( $this->args['ap_order_by'] ); /** * This was suggested by https://github.com/nash-ye. */ if ( ! $this->args['ap_current_user_ignore'] ) { // Check if user can read private post. if ( ap_user_can_view_private_post() ) { $this->args['post_status'][] = 'private_post'; } // Check if user can read moderate posts. if ( ap_user_can_view_moderate_post() ) { $this->args['post_status'][] = 'moderate'; } // Check if user can read moderate posts. if ( ap_user_can_view_future_post() ) { $this->args['post_status'][] = 'future'; } // Show trash posts to super admin. if ( is_super_admin() ) { $this->args['post_status'][] = 'trash'; } } // Post status to ignore if passed via args. if ( isset( $this->args['post_status__not_in'] ) ) { $post_status__not_in = $this->args['post_status__not_in']; // Update the post_status args. $this->args['post_status'] = array_diff( $this->args['post_status'], $post_status__not_in ); } // Updated post_status args to have the unique array. $this->args['post_status'] = array_unique( $this->args['post_status'] ); // Show only the unpublished post of author. if ( isset( $args['ap_show_unpublished'] ) && true === $this->args['ap_show_unpublished'] ) { $this->args['ap_current_user_ignore'] = true; $this->args['author'] = get_current_user_id(); $this->args['post_status'] = array( 'moderate', 'pending', 'draft', 'trash' ); } if ( $post_parent ) { $this->args['post_parent'] = $post_parent; } if ( '' !== get_query_var( 'ap_s' ) ) { $this->args['s'] = ap_sanitize_unslash( 'ap_s', 'query_var' ); } $this->args['post_type'] = 'question'; parent::__construct( $this->args ); } /** * Get posts. */ public function get_questions() { return parent::get_posts(); } /** * Update loop index to next post. */ public function next_question() { return parent::next_post(); } /** * Undo the pointer to next. */ public function reset_next() { --$this->current_post; $this->post = $this->posts[ $this->current_post ]; return $this->post; } /** * Set current question in loop. */ public function the_question() { global $post; $this->in_the_loop = true; if ( -1 === $this->current_post ) { do_action_ref_array( 'ap_query_loop_start', array( &$this ) ); } $post = $this->next_question(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited setup_postdata( $post ); anspress()->current_question = $post; } /** * Check if loop have questions. * * @return boolean */ public function have_questions() { return parent::have_posts(); } /** * Rewind questions in loop. */ public function rewind_questions() { parent::rewind_posts(); } /** * Check if main question query. * * @return boolean */ public function is_main_query() { return anspress()->questions === $this; } /** * Reset current question in loop. */ public function reset_questions_data() { parent::reset_postdata(); if ( ! empty( $this->post ) ) { anspress()->current_question = $this->post; } } /** * Utility method to get all the ids in this request * * @return array of question ids */ public function get_ids() { if ( $this->ap_ids ) { return; } $this->ap_ids = array( 'post_ids' => array(), 'attach_ids' => array(), 'user_ids' => array(), ); foreach ( (array) $this->posts as $_post ) { $this->ap_ids['post_ids'][] = $_post->ID; $this->ap_ids['attach_ids'] = array_merge( explode( ',', $_post->attach ), $this->ap_ids['attach_ids'] ); if ( ! empty( $_post->post_author ) ) { $this->ap_ids['user_ids'][] = $_post->post_author; } // Add activities user_id to array. if ( ! empty( $_post->activities ) && ! empty( $_post->activities['user_id'] ) ) { $this->ap_ids['user_ids'][] = $_post->activities['user_id']; } } // Unique ids only. foreach ( (array) $this->ap_ids as $k => $ids ) { $this->ap_ids[ $k ] = array_unique( $ids ); } } /** * Pre fetch current users vote on all answers * * @since 3.1.0 * @since 4.1.2 Prefetch post activities. */ public function pre_fetch() { $this->get_ids(); ap_prefetch_recent_activities( $this->ap_ids['post_ids'] ); ap_user_votes_pre_fetch( $this->ap_ids['post_ids'] ); ap_post_attach_pre_fetch( $this->ap_ids['attach_ids'] ); // Pre fetch users. if ( ! empty( $this->ap_ids['user_ids'] ) ) { ap_post_author_pre_fetch( $this->ap_ids['user_ids'] ); } do_action( 'ap_pre_fetch_question_data', $this->ap_ids ); } }
Expand full source code Collapse full source code View on GitHub: includes/qaquery.php:22
Add your comment