├── README.md
├── your_template.php
├── js
└── script.js
└── functions.php
/README.md:
--------------------------------------------------------------------------------
1 | wp-load-more-ajax
2 | =================
3 |
4 | Tutorial on how to implement simple Load More posts functionality via AJAX.
5 |
6 | Hope you will find this useful.
7 |
--------------------------------------------------------------------------------
/your_template.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Load more
12 |
--------------------------------------------------------------------------------
/js/script.js:
--------------------------------------------------------------------------------
1 | (function($){
2 |
3 | //javasctipt
4 | //load more click function: improved to prevent double click and fire funciton only after content has been loaded (good for slow internet connection)
5 | $('.load_more:not(.loading)').live('click',function(e){
6 | e.preventDefault();
7 | var $load_more_btn = $(this);
8 | var post_type = 'post'; // this is optional and can be set from anywhere, stored in mockup etc...
9 | var offset = $('#posts_list .single-article').length;
10 | var nonce = $load_more_btn.attr('data-nonce');
11 | $.ajax({
12 | type : "post",
13 | context: this,
14 | dataType : "json",
15 | url : headJS.ajaxurl,
16 | data : {action: "load_more", offset:offset, nonce:nonce, post_type:post_type, posts_per_page:headJS.posts_per_page},
17 | beforeSend: function(data) {
18 | // here u can do some loading animation...
19 | $load_more_btn.addClass('loading').html('Loading...');// good for styling and also to prevent ajax calls before content is loaded by adding loading class
20 | },
21 | success: function(response) {
22 | if (response['have_posts'] == 1){//if have posts:
23 | $load_more_btn.removeClass('loading').html('Load More');
24 | var $newElems = $(response['html'].replace(/(\r\n|\n|\r)/gm, ''));// here removing extra breaklines and spaces
25 | $('#posts_list').append($newElems);
26 | } else {
27 | //end of posts (no posts found)
28 | $load_more_btn.removeClass('loading').addClass('end_of_posts').html('End of posts'); // change buttom styles if no more posts
29 | }
30 | }
31 | });
32 | });
33 |
34 | });
35 |
--------------------------------------------------------------------------------
/functions.php:
--------------------------------------------------------------------------------
1 | admin_url( 'admin-ajax.php' ), 'templateurl' => get_template_directory_uri(), 'posts_per_page' => get_option('posts_per_page') ) );
8 |
9 | }
10 | add_action( 'wp_enqueue_scripts', 'dt_add_main_js', 90);
11 |
12 |
13 | add_action( "wp_ajax_load_more", "load_more_func" ); // when logged in
14 | add_action( "wp_ajax_nopriv_load_more", "load_more_func" );//when logged out
15 | //function return new posts based on offset and posts per page value
16 | function load_more_func() {
17 | //verifying nonce here
18 | if ( !wp_verify_nonce( $_REQUEST['nonce'], "load_posts" ) ) {
19 | exit("No naughty business please");
20 | }
21 | $offset = isset($_REQUEST['offset'])?intval($_REQUEST['offset']):0;
22 | $posts_per_page = isset($_REQUEST['posts_per_page'])?intval($_REQUEST['posts_per_page']):10;
23 | //optional, if post type is not defined use regular post type
24 | $post_type = isset($_REQUEST['post_type'])?$_REQUEST['post_type']:'post';
25 |
26 |
27 | ob_start(); // buffer output instead of echoing it
28 | $args = array(
29 | 'post_type'=>$post_type,
30 | 'offset' => $offset,
31 | 'posts_per_page' => $posts_per_page,
32 | 'orderby' => 'date',
33 | 'order' => 'DESC'
34 | );
35 | $posts_query = new WP_Query( $args );
36 |
37 |
38 | if ($posts_query->have_posts()) {
39 | //if we have posts:
40 | $result['have_posts'] = true; //set result array item "have_posts" to true
41 |
42 | while ( $posts_query->have_posts() ) : $posts_query->the_post(); ?>
43 |
44 |
45 |
46 |
47 |
48 |
64 |
--------------------------------------------------------------------------------