first commit without licensingg
This commit is contained in:
315
inc/load-more.php
Normal file
315
inc/load-more.php
Normal file
@@ -0,0 +1,315 @@
|
||||
<?php
|
||||
/**
|
||||
* Load More Posts via AJAX.
|
||||
*
|
||||
* @package Revision
|
||||
*/
|
||||
|
||||
/**
|
||||
* Processing data query for load more
|
||||
*
|
||||
* @param string $method Processing method $wp_query.
|
||||
* @param array $data Data array.
|
||||
*/
|
||||
function csco_load_more_query_data( $method = 'get', $data = array() ) {
|
||||
global $wp_query;
|
||||
|
||||
$output = array();
|
||||
|
||||
$vars = array(
|
||||
'in_the_loop',
|
||||
'is_single',
|
||||
'is_page',
|
||||
'is_archive',
|
||||
'is_author',
|
||||
'is_category',
|
||||
'is_tag',
|
||||
'is_tax',
|
||||
'is_home',
|
||||
'is_singular',
|
||||
'is_post_query',
|
||||
);
|
||||
|
||||
if ( 'get' === $method ) {
|
||||
$output = $data;
|
||||
}
|
||||
|
||||
foreach ( $vars as $variable ) {
|
||||
if ( ! isset( $wp_query->$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 ) {
|
||||
/**
|
||||
* The ajax_query_args hook.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
$output = apply_filters( 'ajax_query_args', $output );
|
||||
}
|
||||
|
||||
return wp_json_encode( $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get load more args.
|
||||
*
|
||||
* @param array $data The data.
|
||||
* @param array $options The options.
|
||||
*/
|
||||
function csco_get_load_more_args( $data, $options = false ) {
|
||||
// Ajax Type.
|
||||
$ajax_type = version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ? 'ajax_restapi' : 'ajax';
|
||||
|
||||
/**
|
||||
* The ajax_load_more_method hook.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
$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, '/csco/v1/more-posts' ) ),
|
||||
'posts_per_page' => get_query_var( 'posts_per_page' ), // phpcs:ignore.
|
||||
'query_data' => csco_load_more_query_data( 'get', $data ),
|
||||
'options' => wp_json_encode( $options ),
|
||||
'infinite_load' => $data['infinite_load'] ? 'true' : 'false',
|
||||
'translation' => array(
|
||||
'load_more' => esc_html__( 'Load More', 'revision' ),
|
||||
'loading' => esc_html__( 'Loading ...', 'revision' ),
|
||||
),
|
||||
'current_lang' => csco_get_current_language(),
|
||||
'current_locale' => get_locale(),
|
||||
);
|
||||
|
||||
return $args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Localize the main theme scripts.
|
||||
*/
|
||||
function csco_load_more_js() {
|
||||
global $wp_query;
|
||||
|
||||
$paged = get_query_var( 'paged' );
|
||||
|
||||
if ( $wp_query->max_num_pages <= 1 || $paged > 1 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$pagination_type = get_theme_mod( csco_get_archive_option( 'pagination_type' ), 'standard' );
|
||||
|
||||
if ( 'load-more' === $pagination_type || 'infinite' === $pagination_type ) {
|
||||
|
||||
// Pagination type.
|
||||
$wp_query->infinite = 'infinite' === $pagination_type ? true : false;
|
||||
|
||||
$query_vars = $wp_query->query_vars;
|
||||
|
||||
if ( is_home() && ( ! isset( $query_vars['post_type'] ) || ! $query_vars['post_type'] ) ) {
|
||||
$query_vars['post_type'] = 'post';
|
||||
}
|
||||
|
||||
// Theme data.
|
||||
$data = array(
|
||||
'first_post_count' => $wp_query->post_count,
|
||||
'infinite_load' => $wp_query->infinite,
|
||||
'query_vars' => $query_vars,
|
||||
);
|
||||
|
||||
$args = csco_get_load_more_args( $data, csco_get_archive_options() );
|
||||
|
||||
wp_localize_script( 'csco-scripts', 'csco_ajax_pagination', $args );
|
||||
}
|
||||
}
|
||||
add_action( 'wp_enqueue_scripts', 'csco_load_more_js', 100 );
|
||||
|
||||
/**
|
||||
* Get More Posts
|
||||
*/
|
||||
function csco_load_more_posts() {
|
||||
|
||||
$posts_end = false;
|
||||
|
||||
// Response default.
|
||||
$response = array(
|
||||
'page' => 2,
|
||||
'posts_per_page' => 10,
|
||||
);
|
||||
|
||||
if ( wp_doing_ajax() ) {
|
||||
check_ajax_referer();
|
||||
}
|
||||
|
||||
csco_set_ajax_lang();
|
||||
csco_set_ajax_locale();
|
||||
|
||||
// Set response values of ajax query.
|
||||
if ( isset( $_POST['page'] ) && sanitize_key( $_POST['page'] ) ) {
|
||||
$response['page'] = sanitize_key( $_POST['page'] );
|
||||
}
|
||||
if ( isset( $_POST['posts_per_page'] ) && sanitize_key( $_POST['posts_per_page'] ) ) {
|
||||
$response['posts_per_page'] = sanitize_key( $_POST['posts_per_page'] ); // phpcs:ignore.
|
||||
}
|
||||
if ( isset( $_POST['query_data'] ) && sanitize_text_field( $_POST['query_data'] ) ) {
|
||||
$response['query_data'] = sanitize_text_field( $_POST['query_data'] );
|
||||
}
|
||||
if ( isset( $_POST['options'] ) && sanitize_text_field( $_POST['options'] ) ) {
|
||||
$response['options'] = json_decode( stripslashes( sanitize_text_field( $_POST['options'] ) ), true );
|
||||
}
|
||||
|
||||
// Init Data.
|
||||
$query_data = json_decode( stripslashes( $response['query_data'] ), true );
|
||||
|
||||
// Set Query Vars.
|
||||
$query_vars = array_merge(
|
||||
(array) $query_data['query_vars'],
|
||||
array(
|
||||
'is_post_query' => true,
|
||||
'paged' => (int) $response['page'],
|
||||
'posts_per_page' => (int) $response['posts_per_page'],
|
||||
)
|
||||
);
|
||||
|
||||
// Suppress filtering for wp authors.
|
||||
if ( $query_data['is_author'] && $query_vars['author'] ) {
|
||||
$query_vars['suppress_filters'] = true;
|
||||
}
|
||||
|
||||
// Output only publish entries.
|
||||
$query_vars['post_status'] = 'publish';
|
||||
|
||||
// Get Posts.
|
||||
$the_query = new WP_Query( $query_vars );
|
||||
|
||||
$global_name = 'wp_query';
|
||||
|
||||
$GLOBALS[ $global_name ] = $the_query;
|
||||
|
||||
csco_load_more_query_data( 'init', $query_data );
|
||||
|
||||
if ( $the_query->have_posts() ) {
|
||||
|
||||
// Set query vars, so that we can get them across all templates.
|
||||
set_query_var( 'csco_query', $query_data );
|
||||
|
||||
// Get total number of posts.
|
||||
$total = $the_query->post_count;
|
||||
|
||||
// Get options.
|
||||
$options = $response['options'];
|
||||
|
||||
ob_start();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
set_query_var( 'options', $options );
|
||||
|
||||
if ( isset( $options['layout'] ) && 'full' === $options['layout'] ) {
|
||||
|
||||
get_template_part( 'template-parts/archive/content-full' );
|
||||
|
||||
} elseif ( 'overlay' === $options['layout'] ) {
|
||||
|
||||
get_template_part( 'template-parts/archive/entry-overlay' );
|
||||
|
||||
} else {
|
||||
|
||||
get_template_part( 'template-parts/archive/entry' );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$content = ob_get_clean();
|
||||
|
||||
}
|
||||
|
||||
wp_reset_postdata();
|
||||
|
||||
if ( ! $content ) {
|
||||
$posts_end = true;
|
||||
}
|
||||
|
||||
// Return Result.
|
||||
$result = array(
|
||||
'posts_end' => $posts_end,
|
||||
'content' => $content,
|
||||
);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX Load More
|
||||
*/
|
||||
function csco_ajax_load_more() {
|
||||
|
||||
// Check Nonce.
|
||||
check_ajax_referer();
|
||||
|
||||
// Get Posts.
|
||||
$data = csco_load_more_posts();
|
||||
|
||||
// Return Result.
|
||||
wp_send_json_success( $data );
|
||||
}
|
||||
add_action( 'wp_ajax_csco_ajax_load_more', 'csco_ajax_load_more' );
|
||||
add_action( 'wp_ajax_nopriv_csco_ajax_load_more', 'csco_ajax_load_more' );
|
||||
|
||||
/**
|
||||
* More Posts API Response
|
||||
*
|
||||
* @param array $request REST API Request.
|
||||
*/
|
||||
function csco_more_posts_restapi( $request ) {
|
||||
|
||||
// Get Data.
|
||||
$data = array(
|
||||
'success' => true,
|
||||
'data' => csco_load_more_posts(),
|
||||
);
|
||||
|
||||
// Return Result.
|
||||
return rest_ensure_response( $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* Register REST More Posts Routes
|
||||
*/
|
||||
function csco_register_more_posts_route() {
|
||||
|
||||
register_rest_route(
|
||||
'csco/v1',
|
||||
'/more-posts',
|
||||
array(
|
||||
'methods' => WP_REST_Server::CREATABLE,
|
||||
'callback' => 'csco_more_posts_restapi',
|
||||
'permission_callback' => function () {
|
||||
return true;
|
||||
},
|
||||
)
|
||||
);
|
||||
}
|
||||
add_action( 'rest_api_init', 'csco_register_more_posts_route' );
|
||||
Reference in New Issue
Block a user