¿Cómo obtener el contenido de una entrada usando ajax?
Estoy trabajando en un plugin. Tengo un tipo de entrada personalizada team
. La entrada personalizada tiene cuatro posts de diferentes categorías. Utilicé este código para enviar el ID de cada entrada usando ajax.
$(document).ready(function () {
$(".post_thumbnail").click(function () {
var id_post = $(this).attr('post_id');
$.ajax({
type: 'POST',
url: "<?php echo plugin_dir_url(__FILE__).'post-content.php';?>",
data: {
'post_id': id_post
}, success: function (result) {
alert(result);
},
error: function () {
alert("error");
}
});
});
});
Estoy enviando el ID exitosamente y también lo estoy recibiendo. Para obtener el ID mi código es:
if(isset($_POST['post_id'])) {
echo $id=$_POST['post_id'];
}
pero no puedo mostrar el contenido de cada entrada. ¿Cómo puedo mostrar el contenido de cada entrada? Lo he intentado lo mejor posible pero fallé. Cualquier ayuda será muy apreciada.
Primero, deberías siempre usar los métodos AJAX de WordPress, no una función personalizada para eso. Consulta AJAX en Plugins en el Codex.
Con esa práctica en mente, puedes configurar tu solicitud así. Cambia la URL de AJAX a
<?php echo admin_url('admin-ajax.php'); ?>
y añade la clave 'action':
con el valor del nombre de la función específica de WordPress que deseas que se ejecute en el siguiente paso, cuando el servidor reciba tus datos.
$(".post_thumbnail").click(function () {
var id_post = $(this).attr('post_id');
$.ajax({
type: 'POST',
url: '<?php echo admin_url('admin-ajax.php'); ?>',
data: {
'post_id': id_post,
'action': 'f711_get_post_content' //este es el nombre del método AJAX llamado en WordPress
}, success: function (result) {
alert(result);
},
error: function () {
alert("error");
}
});
});
Ahora necesitamos decirle a WordPress qué hacer cuando alguien llame a f711_get_post_content
.
Registra la Acción en el AJAX de WordPress. Esto se hace en las funciones de tu Plugin. La primera parte ('wp_ajax_') es para decirle a WordPress que esta es una acción AJAX, y la parte después de eso es el nombre de la acción ('f711_get_post_content'). El segundo argumento es la función que WordPress ejecuta cuando se llama a esta acción.
add_action( 'wp_ajax_f711_get_post_content', 'f711_get_post_content_callback' );
// Si deseas que los usuarios no registrados también puedan usar esta función, regístrala nuevamente con esta función:
add_action( 'wp_ajax_nopriv_f711_get_post_content', 'f711_get_post_content_callback' );
Después de eso, creas tu función de callback. Recuerda SIEMPRE terminar (die()) tus funciones AJAX. Si tu función devuelve JSON, lo cual recomendaría, puedes finalizar tu función usando wp_send_json( $array );
, que tiene incorporado die()
.
function f711_get_post_content_callback() {
// recupera post_id y sanitízalo para mejorar la seguridad
$post_id = intval($_POST['post_id'] );
// Verifica si la entrada era un entero válido
if ( $post_id == 0 ) {
echo "Entrada inválida";
die();
}
// obtén el post
$thispost = get_post( $post_id );
// verifica si el post existe
if ( !is_object( $thispost ) ) {
echo 'No hay ningún post con el ID ' . $post_id;
die();
}
echo $thispost->post_content; //Quizás quieras usar echo wpautop( $thispost->post_content );
die();
}
Esta sería la versión recomendada con JSON. Te permite pasar múltiples variables de vuelta al cliente.
function f711_get_post_content_callback() {
// recupera post_id y sanitízalo para mejorar la seguridad
$post_id = intval($_POST['post_id'] );
// Verifica si la entrada era un entero válido
if ( $post_id == 0 ) {
$response['error'] = 'true';
$response['result'] = 'Entrada inválida';
} else {
// obtén el post
$thispost = get_post( $post_id );
// verifica si el post existe
if ( !is_object( $thispost ) ) {
$response['error'] = 'true';
$response['result'] = 'No hay ningún post con el ID ' . $post_id;
} else {
$response['error'] = 'false';
$response['result'] = wpautop( $thispost->post_content );
}
}
wp_send_json( $response );
}

Para todos los que encuentran esta respuesta: echen un vistazo a la API REST de WordPress que es mucho más fácil de usar. No necesitas todo el código PHP mencionado en esta respuesta.
