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