Obtener entradas con ajax
Quiero obtener entradas con ajax mediante una función de clic.
jQuery
$(".get-posts").click(function(){
$.ajax({
type: 'POST',
url: '<?php echo admin_url('admin-ajax.php');?>',
data: { action : 'get_ajax_posts' },
success: function(response){
// Aquí manejaremos la respuesta
}
});
});
PHP
function get_ajax_posts() {
// Argumentos de la consulta
$args = array(
'post_type' => array('products'),
'post_status' => array('publish'),
'posts_per_page' => 40,
'nopaging' => true,
'order' => 'DESC',
'orderby' => 'date',
'cat' => 1,
);
// La Consulta
$ajaxposts = new WP_Query( $args );
// El Bucle
if ( $ajaxposts->have_posts() ) {
while ( $ajaxposts->have_posts() ) {
$ajaxposts->the_post();
get_template_part('products');
}
} else {
get_template_part('none');
}
/* Restaurar los datos originales del Post */
wp_reset_postdata();
}
add_action('wp_ajax_get_ajax_posts', 'get_ajax_posts');
add_action('wp_ajax_nopriv_get_ajax_posts', 'get_ajax_posts');
Estoy bloqueado aquí.

Opción 1
La forma simple - retornar todas las publicaciones en formato JSON
y recorrerlas en JavaScript
PHP:
function get_ajax_posts() {
// Argumentos de la consulta
$args = array(
'post_type' => array('products'),
'post_status' => array('publish'),
'posts_per_page' => 40,
'nopaging' => true,
'order' => 'DESC',
'orderby' => 'date',
'cat' => 1,
);
// La consulta
$ajaxposts = get_posts( $args ); // cambiado a get_posts desde wp_query, porque `get_posts` retorna un array
echo json_encode( $ajaxposts );
exit; // salir de la llamada AJAX (o retornará información inútil en la respuesta)
}
// Disparar acción AJAX para usuarios logueados y no logueados
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", // agregar tipo de dato
data: { action : 'get_ajax_posts' },
success: function( response ) {
$.each( response, function( key, value ) {
console.log( key, value ); // esos son los datos de las publicaciones.
} );
}
});
Opción 2
Obtener contenido HTML e imprimirlo en pantalla.
PHP:
function get_ajax_posts() {
// Argumentos de la consulta
$args = array(
'post_type' => array('products'),
'post_status' => array('publish'),
'posts_per_page' => 40,
'nopaging' => true,
'order' => 'DESC',
'orderby' => 'date',
'cat' => 1,
);
// La consulta
$ajaxposts = new WP_Query( $args );
$response = '';
// La consulta
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; // salir de la llamada AJAX
}
// Disparar acción AJAX para usuarios logueados y no logueados
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", // agregar tipo de dato
data: { action : 'get_ajax_posts' },
success: function( response ) {
console.log( response );
$( '.posts-area' ).html( response );
}
});
En el segundo ejemplo, cambia el selector .posts-area
por el que desees para imprimir.
El console.log
es solo para que puedas ver la información retornada desde la llamada AJAX en la consola. Deberías eliminarlo una vez que hayas terminado.

Además, en caso de que no quieras mezclar los lenguajes PHP y Javascript en los mismos archivos (lo cual no deberías hacer), puedes pasar URLs para solicitudes AJAX mediante wp_localize_script (https://codex.wordpress.org/Function_Reference/wp_localize_script)

en la opción 1 hay un new
erróneo en la línea $ajaxposts = new get_posts( $args );
debería decir $ajaxposts = get_posts( $args );
