PostType::POST_TYPE, 'post_status' => 'publish', 'posts_per_page' => (int) $args['limit'], 'ignore_sticky_posts' => true, 'no_found_rows' => true, ); // Ordering. switch ( $args['orderby'] ) { case 'title': $query_args['orderby'] = 'title'; break; case 'order': // Include posts with and without the order meta; treat missing as 0. $query_args['orderby'] = 'meta_value_num'; $query_args['meta_key'] = Meta::META_ORDER; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key $query_args['meta_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query 'relation' => 'OR', array( 'key' => Meta::META_ORDER, 'compare' => 'EXISTS', ), array( 'key' => Meta::META_ORDER, 'compare' => 'NOT EXISTS', ), ); break; case 'date': default: $query_args['orderby'] = 'date'; break; } $query_args['order'] = ( 'DESC' === $args['order'] ) ? 'DESC' : 'ASC'; // Explicit post IDs win over taxonomy filters. if ( ! empty( $args['ids'] ) ) { $query_args['post__in'] = array_map( 'absint', $args['ids'] ); $query_args['orderby'] = 'post__in'; } else { $tax_query = $this->build_tax_query( $args ); if ( ! empty( $tax_query ) ) { $query_args['tax_query'] = $tax_query; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query } } /** * Filter the WP_Query arguments used to fetch FAQs. * * @param array $query_args WP_Query args. * @param array $args Normalized render args. */ $query_args = apply_filters( 'accordion_faq_query_args', $query_args, $args ); return new \WP_Query( $query_args ); } /** * Build the tax_query from term IDs and/or category slugs. * * @param array $args Normalized render args. * @return array */ private function build_tax_query( array $args ) { $clauses = array(); if ( ! empty( $args['term'] ) ) { $clauses[] = array( 'taxonomy' => Taxonomy::TAXONOMY, 'field' => 'term_id', 'terms' => array_map( 'absint', (array) $args['term'] ), ); } if ( ! empty( $args['category'] ) ) { $clauses[] = array( 'taxonomy' => Taxonomy::TAXONOMY, 'field' => 'slug', 'terms' => (array) $args['category'], ); } if ( count( $clauses ) > 1 ) { $clauses['relation'] = 'OR'; } return $clauses; } }