tax_cat_not_in = $settings[ $tax_control_key ]; } break; case 'post_tag': if ( 'IN' === $operator ) { $tax_tag_in = $settings[ $tax_control_key ]; } elseif ( 'NOT IN' === $operator ) { $tax_tag_not_in = $settings[ $tax_control_key ]; } break; } } } } if ( '' !== $filter && '*' !== $filter ) { // Taxonomy Filter. $taxonomy = PP_Posts_Helper::get_post_taxonomies( $post_type ); $tax_cat_in = ''; $tax_cat_not_in = ''; $tax_tag_in = ''; $tax_tag_not_in = ''; if ( ! empty( $taxonomy ) && ! is_wp_error( $taxonomy ) ) { foreach ( $taxonomy as $index => $tax ) { $tax_control_key = $index . '_' . $post_type; if ( 'yes' === $old_code ) { if ( 'post' === $post_type ) { if ( 'post_tag' === $index ) { $tax_control_key = 'tags'; } elseif ( 'category' === $index ) { $tax_control_key = 'categories'; } } } if ( ! empty( $settings[ $tax_control_key ] ) ) { $operator = $settings[ $index . '_' . $post_type . '_filter_type' ]; $query_args['tax_query'][] = array( 'taxonomy' => $index, 'field' => 'term_id', 'terms' => $settings[ $tax_control_key ], 'operator' => $operator, ); switch ( $index ) { case 'category': if ( 'IN' === $operator ) { $tax_cat_in = $settings[ $tax_control_key ]; } elseif ( 'NOT IN' === $operator ) { $tax_cat_not_in = $settings[ $tax_control_key ]; } break; case 'post_tag': if ( 'IN' === $operator ) { $tax_tag_in = $settings[ $tax_control_key ]; } elseif ( 'NOT IN' === $operator ) { $tax_tag_not_in = $settings[ $tax_control_key ]; } break; } } } } $query_args['tax_query'][ $tax_count ]['taxonomy'] = $taxonomy_filter; $query_args['tax_query'][ $tax_count ]['field'] = 'slug'; $query_args['tax_query'][ $tax_count ]['terms'] = $filter; $query_args['tax_query'][ $tax_count ]['operator'] = 'IN'; /* if ( ! empty( $tax_cat_in ) ) { $query_args['category__in'] = $tax_cat_in; } if ( ! empty( $tax_cat_not_in ) ) { $query_args['category__not_in'] = $tax_cat_not_in; } if ( ! empty( $tax_tag_in ) ) { $query_args['tag__in'] = $tax_tag_in; } if ( ! empty( $tax_tag_not_in ) ) { $query_args['tag__not_in'] = $tax_tag_not_in; } */ } if ( '' !== $search ) { $query_args['s'] = $search; } } if ( 'anytime' !== $settings['select_date'] ) { $select_date = $settings['select_date']; if ( ! empty( $select_date ) ) { $date_query = array(); if ( 'today' === $select_date ) { $date_query['after'] = '-1 day'; } elseif ( 'week' === $select_date ) { $date_query['after'] = '-1 week'; } elseif ( 'month' === $select_date ) { $date_query['after'] = '-1 month'; } elseif ( 'quarter' === $select_date ) { $date_query['after'] = '-3 month'; } elseif ( 'year' === $select_date ) { $date_query['after'] = '-1 year'; } elseif ( 'exact' === $select_date ) { $after_date = $settings['date_after']; if ( ! empty( $after_date ) ) { $date_query['after'] = $after_date; } $before_date = $settings['date_before']; if ( ! empty( $before_date ) ) { $date_query['before'] = $before_date; } $date_query['inclusive'] = true; } $query_args['date_query'] = $date_query; } } // Sticky Posts Filter. if ( 'yes' === $settings['sticky_posts'] && 'yes' === $settings['all_sticky_posts'] ) { $post__in = get_option( 'sticky_posts' ); $query_args['ignore_sticky_posts'] = 1; $query_args['post__in'] = $post__in; } // Exclude current post. if ( 'yes' === $settings['exclude_current'] ) { $query_args['post__not_in'] = array( get_the_ID() ); } return apply_filters( "ppe_{$widget_type}_query_args", $query_args, $settings ); } /** * pre_get_posts_query_filter * * @param mixed $wp_query */ public function pre_get_posts_query_filter( $wp_query ) { $settings = $this->get_settings_for_display(); $query_id = $settings['query_id']; /** * Query args. * * It allows developers to alter individual posts widget queries. * * The dynamic portion of the hook name '$query_id', refers to the Query ID. * * @since 1.4.11.3 * * @param \WP_Query $wp_query */ do_action_deprecated( "pp_query_{$query_id}", [ $wp_query ], '2.3.7', "powerpack/query/{$query_id}" ); do_action( "powerpack/query/{$query_id}", $wp_query ); } public function query_posts( $filter = '', $taxonomy = '', $search = '', $all_posts = '', $paged_args = '', $widget_type = 'posts', $old_code = '', $posts_count_var = '', $posts_count = '' ) { $settings = $this->get_settings_for_display(); $query_id = $settings['query_id']; if ( ! empty( $query_id ) ) { add_action( 'pre_get_posts', array( $this, 'pre_get_posts_query_filter' ) ); } $query_args = $this->query_posts_args( $filter, $taxonomy, $search, '', 'yes', $widget_type, $old_code, $posts_count_var, $posts_count ); $post_type = $settings['post_type']; $offset_control = $settings['offset']; if ( 'related' !== $post_type && 0 < $offset_control ) { add_action( 'pre_get_posts', [ $this, 'fix_query_offset' ], 1 ); add_filter( 'found_posts', [ $this, 'fix_query_found_posts' ], 1, 2 ); } $this->query = new \WP_Query( $query_args ); remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_query_filter' ) ); remove_action( 'pre_get_posts', [ $this, 'fix_query_offset' ], 1 ); remove_filter( 'found_posts', [ $this, 'fix_query_found_posts' ], 1 ); } public function query_filters_posts( $filter = '', $taxonomy = '', $search = '' ) { $settings = $this->get_settings(); $query_id = $settings['query_id']; if ( ! empty( $query_id ) ) { add_action( 'pre_get_posts', array( $this, 'pre_get_posts_query_filter' ) ); } $query_filter_args = $this->query_posts_args( $filter, $taxonomy, $search, 'yes', 'yes' ); $this->query_filters = new \WP_Query( $query_filter_args ); remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_query_filter' ) ); } /** * Render current query. * * @since 1.7.0 * @access protected */ public function get_query() { return $this->query; } /** * Render current query. * * @since 1.7.0 * @access protected */ public function get_query_filters() { return $this->query_filters; } /** * Returns the paged number for the query. * * @since 1.7.0 * @return int */ public function get_paged() { $settings = $this->get_settings_for_display(); global $wp_the_query, $paged; if ( isset( $settings['_skin'] ) ) { $skin_id = $settings['_skin']; $pagination_ajax = $settings[ $skin_id . '_pagination_ajax' ]; $pagination_type = $settings[ $skin_id . '_pagination_type' ]; } else { $pagination_ajax = ''; $pagination_type = ''; } if ( 'yes' === $pagination_ajax || 'load_more' === $pagination_type || 'infinite' === $pagination_type ) { if ( isset( $_POST['nonce'] ) && wp_verify_nonce( $_POST['nonce'], 'pp-posts-widget-nonce' ) ) { if ( isset( $_POST['page_number'] ) && '' !== $_POST['page_number'] ) { return $_POST['page_number']; } } // Check the 'paged' query var. $paged_qv = $wp_the_query->get( 'paged' ); if ( is_numeric( $paged_qv ) ) { return $paged_qv; } // Check the 'page' query var. $page_qv = $wp_the_query->get( 'page' ); if ( is_numeric( $page_qv ) ) { return $page_qv; } // Check the $paged global? if ( is_numeric( $paged ) ) { return $paged; } return 0; } else { return max( 1, get_query_var( 'paged' ), get_query_var( 'page' ) ); } } public function get_posts_nav_link( $page_limit = null ) { if ( ! $page_limit ) { $page_limit = $this->query->max_num_pages; } $return = array(); $paged = $this->get_paged(); $link_template = '%s'; $disabled_template = '%s'; if ( $paged > 1 ) { $next_page = intval( $paged ) - 1; if ( $next_page < 1 ) { $next_page = 1; } $return['prev'] = sprintf( $link_template, 'prev', $this->get_wp_link_page( $next_page ), $this->get_settings( 'pagination_prev_label' ) ); } else { $return['prev'] = sprintf( $disabled_template, 'prev', $this->get_settings( 'pagination_prev_label' ) ); } $next_page = intval( $paged ) + 1; if ( $next_page <= $page_limit ) { $return['next'] = sprintf( $link_template, 'next', $this->get_wp_link_page( $next_page ), $this->get_settings( 'pagination_next_label' ) ); } else { $return['next'] = sprintf( $disabled_template, 'next', $this->get_settings( 'pagination_next_label' ) ); } return $return; } private function get_wp_link_page( $i ) { if ( ! is_singular() || is_front_page() ) { return get_pagenum_link( $i ); } // Based on wp-includes/post-template.php:957 `_wp_link_page`. global $wp_rewrite; $post = get_post(); $query_args = array(); $url = get_permalink(); if ( $i > 1 ) { if ( '' === get_option( 'permalink_structure' ) || in_array( $post->post_status, array( 'draft', 'pending' ), true ) ) { $url = add_query_arg( 'page', $i, $url ); } elseif ( get_option( 'show_on_front' ) === 'page' && (int) get_option( 'page_on_front' ) === $post->ID ) { $url = trailingslashit( $url ) . user_trailingslashit( "$wp_rewrite->pagination_base/" . $i, 'single_paged' ); } else { $url = trailingslashit( $url ) . user_trailingslashit( $i, 'single_paged' ); } } if ( is_preview() ) { if ( ( 'draft' !== $post->post_status ) && isset( $_GET['preview_id'], $_GET['preview_nonce'] ) ) { //phpcs:ignore $query_args['preview_id'] = wp_unslash( $_GET['preview_id'] ); //phpcs:ignore $query_args['preview_nonce'] = wp_unslash( $_GET['preview_nonce'] ); //phpcs:ignore } $url = get_preview_post_link( $post, $query_args, $url ); } return $url; } /** * @param \WP_Query $query * * @since 2.3.6 */ public function fix_query_offset( &$query ) { $settings = $this->get_settings_for_display(); $offset = $settings['offset']; if ( $offset && $query->is_paged ) { $query->query_vars['offset'] = $offset + ( ( $query->query_vars['paged'] - 1 ) * $query->query_vars['posts_per_page'] ); } else { $query->query_vars['offset'] = $offset; } } /** * @param int $found_posts * @param \WP_Query $query * * @since 2.3.6 * * @return int */ public function fix_query_found_posts( $found_posts, $query ) { $settings = $this->get_settings_for_display(); $offset = $settings['offset']; if ( $offset ) { $found_posts -= $offset; } return $found_posts; } }