Option 1
The simple way - return all the posts in JSON
format and loop through them in JavaScript
PHP:
function get_ajax_posts() {
// Query Arguments
$args = array(
'post_type' => array('products'),
'post_status' => array('publish'),
'posts_per_page' => 40,
'nopaging' => true,
'order' => 'DESC',
'orderby' => 'date',
'cat' => 1,
);
// The Query
$ajaxposts = get_posts( $args ); // changed to get_posts from wp_query, because `get_posts` returns an array
echo json_encode( $ajaxposts );
exit; // exit ajax call(or it will return useless information to the response)
}
// Fire AJAX action for both logged in and non-logged in users
add_action('wp_ajax_get_ajax_posts', 'get_ajax_posts');
add_action('wp_ajax_nopriv_get_ajax_posts', 'get_ajax_posts');
JavaScript:
$.ajax({
type: 'POST',
url: '<?php echo admin_url('admin-ajax.php');?>',
dataType: "json", // add data type
data: { action : 'get_ajax_posts' },
success: function( response ) {
$.each( response, function( key, value ) {
console.log( key, value ); // that's the posts data.
} );
}
});
Option 2
Get HTML content and print it to the screen.
PHP:
function get_ajax_posts() {
// Query Arguments
$args = array(
'post_type' => array('products'),
'post_status' => array('publish'),
'posts_per_page' => 40,
'nopaging' => true,
'order' => 'DESC',
'orderby' => 'date',
'cat' => 1,
);
// The Query
$ajaxposts = new WP_Query( $args );
$response = '';
// The Query
if ( $ajaxposts->have_posts() ) {
while ( $ajaxposts->have_posts() ) {
$ajaxposts->the_post();
$response .= get_template_part('products');
}
} else {
$response .= get_template_part('none');
}
echo $response;
exit; // leave ajax call
}
// Fire AJAX action for both logged in and non-logged in users
add_action('wp_ajax_get_ajax_posts', 'get_ajax_posts');
add_action('wp_ajax_nopriv_get_ajax_posts', 'get_ajax_posts');
JavaScript:
$.ajax({
type: 'POST',
url: '<?php echo admin_url('admin-ajax.php');?>',
dataType: "html", // add data type
data: { action : 'get_ajax_posts' },
success: function( response ) {
console.log( response );
$( '.posts-area' ).html( response );
}
});
In the second example, change the .posts-area
selector to the one you want to print in.
The console.log
is just that you will be able to see the returning information from the AJAX call in the console. You should remove it after you finished.
.done(
... and read what is indata
.wp_reset_postdata()
in AJAX callbacks, but you do have to dodie
in there.