$variable ) ) { continue; } if ( 'get' === $method ) { $output[ $variable ] = $wp_query->$variable; } if ( ! isset( $data[ $variable ] ) ) { continue; } if ( 'init' === $method ) { $wp_query->$variable = $data[ $variable ]; } } if ( 'get' === $method ) { $output = apply_filters( 'ajax_query_args', $output ); } return wp_json_encode( $output ); } /** * Get load more args. * * @param array $data The data. * @param array $attributes The attributes. * @param array $options The options. */ function sight_portfolio_get_load_more_args( $data, $attributes = false, $options = false ) { // Ajax Type. $ajax_type = version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ? 'ajax_restapi' : 'ajax'; $ajax_type = apply_filters( 'ajax_load_more_method', $ajax_type ); $args = array( 'type' => $ajax_type, 'nonce' => wp_create_nonce(), 'url' => admin_url( 'admin-ajax.php' ), 'rest_url' => esc_url( get_rest_url( null, '/sight/v1/portfolio-more-posts' ) ), 'posts_per_page' => get_query_var( 'posts_per_page' ), 'query_data' => sight_portfolio_load_more_query_data( 'get', $data ), 'attributes' => wp_json_encode( $attributes ), 'options' => wp_json_encode( $options ), 'max_num_pages' => $data['max_num_pages'], 'pagination_type' => $data['pagination_type'], 'translation' => array( 'load_more' => esc_html__( 'Load more', 'sight' ), 'loading' => esc_html__( 'Loading', 'sight' ), ), ); return $args; } /** * Fires after the query variable object is created, but before the actual query is run. * * @param object $wp_query WP Query. */ function sight_portfolio_pre_get_posts( &$wp_query ) { if ( isset( $wp_query->query['is_sight_query'] ) ) { $offset = (int) $wp_query->get( 'offset' ); $paged = (int) $wp_query->get( 'paged' ); $posts_per_page = (int) $wp_query->get( 'posts_per_page' ); if ( $wp_query->is_paged ) { $page_offset = $offset + ( ( $paged - 1 ) * $posts_per_page ); $wp_query->set( 'offset', $page_offset ); } else { $wp_query->set( 'offset', $offset ); } } } add_action( 'pre_get_posts', 'sight_portfolio_pre_get_posts', 1 ); /** * Filters the number of found posts for the query. * * @param int $found_posts The number of posts found. * @param object $wp_query WP Query. */ function sight_portfolio_found_posts( $found_posts, $wp_query ) { if ( isset( $wp_query->query['is_sight_query'] ) ) { $offset = isset( $wp_query->query['offset'] ) ? $wp_query->query['offset'] : 0; $found_posts = (int) $found_posts - (int) $offset; } return $found_posts; } add_filter( 'found_posts', 'sight_portfolio_found_posts', 1, 2 ); /** * Get More Posts */ function sight_portfolio_load_more_posts() { $posts_end = false; // Response default. $response = array( 'page' => 2, 'posts_per_page' => 10, 'query_data' => array(), ); if ( wp_doing_ajax() ) { check_ajax_referer(); } // Set response values of ajax query. if ( isset( $_POST['page'] ) && $_POST['page'] ) { // Input var ok. $response['page'] = sanitize_key( $_POST['page'] ); // Input var ok; sanitization ok. } if ( isset( $_POST['posts_per_page'] ) && $_POST['posts_per_page'] ) { // Input var ok. $response['posts_per_page'] = sanitize_key( $_POST['posts_per_page'] ); // Input var ok; sanitization ok. } if ( isset( $_POST['query_data'] ) && $_POST['query_data'] ) { // Input var ok. $response['query_data'] = map_deep( json_decode( stripslashes( $_POST['query_data'] ), true ), 'sanitize_text_field' ); // Input var ok; sanitization ok. } if ( isset( $_POST['attributes'] ) && $_POST['attributes'] ) { // Input var ok. $response['attributes'] = map_deep( json_decode( stripslashes( $_POST['attributes'] ), true ), 'sanitize_text_field' ); // Input var ok; sanitization ok. } if ( isset( $_POST['options'] ) && $_POST['options'] ) { // Input var ok. $response['options'] = map_deep( json_decode( stripslashes( $_POST['options'] ), true ), 'sanitize_text_field' ); // Input var ok; sanitization ok. } // Set Query Vars. $query_vars = array_merge( (array) $response['query_data']['query_vars'], array( 'is_sight_query' => true, 'paged' => (int) $response['page'], 'posts_per_page' => (int) $response['posts_per_page'], ) ); // Supportfolio filtering for wp authors. if ( $response['query_data']['is_author'] && $query_vars['author'] ) { $query_vars['supportfolio_filters'] = true; } $attributes = $response['attributes']; $options = $response['options']; // Get Posts. ob_start(); if ( isset( $_POST['terms'] ) && $_POST['terms'] ) { // Input var ok. $terms = array_map( 'sanitize_text_field', $_POST['terms'] ); // Input var ok; sanitization ok. if ( $terms ) { $query_vars['tax_query'] = array(); $query_vars['tax_query'][] = array( 'taxonomy' => 'sight-categories', 'field' => 'slug', 'terms' => $terms, ); $query_vars['tax_query']['relation'] = 'AND'; } } $the_query = new WP_Query( $query_vars ); $global_name = 'wp_query'; $GLOBALS[ $global_name ] = $the_query; sight_portfolio_load_more_query_data( 'init', $response['query_data'] ); if ( $the_query->have_posts() ) : // Set query vars, so that we can get them across all templates. set_query_var( 'sight_query', $response['query_data'] ); // Get total number of posts. $total = $the_query->post_count; while ( $the_query->have_posts() ) : $the_query->the_post(); // Start counting posts. $current = $the_query->current_post + 1 + $query_vars['posts_per_page'] * $query_vars['paged'] - $query_vars['posts_per_page']; // Check End of posts. if ( $the_query->found_posts - $current <= 0 ) { $posts_end = true; } $portfolio_entry = new Sight_Entry( $attributes, $options ); // Init portfolio entry. $portfolio_entry->init(); // Get item project. require apply_filters( 'sight_portfolio_item_path', SIGHT_PATH . 'render/handler/portfolio-entry.php', $attributes, $options, $portfolio_entry ); endwhile; endif; wp_reset_postdata(); $content = ob_get_clean(); if ( ! $content ) { $posts_end = true; } // Return Result. $result = array( 'posts_end' => $posts_end, 'content' => $content, ); return $result; } /** * AJAX Load More */ function sight_portfolio_ajax_load_more() { // Check Nonce. check_ajax_referer(); // Get Posts. $data = sight_portfolio_load_more_posts(); // Return Result. wp_send_json_success( $data ); } add_action( 'wp_ajax_sight_portfolio_ajax_load_more', 'sight_portfolio_ajax_load_more' ); add_action( 'wp_ajax_nopriv_sight_portfolio_ajax_load_more', 'sight_portfolio_ajax_load_more' ); /** * More Posts API Response * * @param array $request REST API Request. */ function sight_portfolio_more_posts_restapi( $request ) { // Get Data. $data = array( 'success' => true, 'data' => sight_portfolio_load_more_posts(), ); // Return Result. return rest_ensure_response( $data ); } /** * Register REST More Posts Routes */ function sight_portfolio_register_more_posts_route() { register_rest_route( 'sight/v1', '/portfolio-more-posts', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => 'sight_portfolio_more_posts_restapi', 'permission_callback' => function() { return true; }, ) ); } add_action( 'rest_api_init', 'sight_portfolio_register_more_posts_route' );