¿Cómo obtener el contenido de una entrada usando ajax?

4 feb 2016, 12:33:49
Vistas: 45K
Votos: 12

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.

4
Comentarios

Posible duplicado de Usar the_content fuera del bucle

Stephen Harris Stephen Harris
4 feb 2016 13:06:31

@StephenHarris Creo que esto es más que eso - publiqué una respuesta sobre el uso correcto de AJAX en plugins. La parte de obtener el contenido no es tan importante como la implementación en WordPress mismo.

fischi fischi
4 feb 2016 13:19:44

@fischi No noté que habían creado un endpoint personalizado y había interpretado que la pregunta significaba que habían implementado con éxito la parte de ajax (usando la solución que publicaste) y simplemente necesitaban recuperar el contenido de una publicación desde un ID.

Stephen Harris Stephen Harris
4 feb 2016 13:54:02

Deberías echar un vistazo a la API REST de WordPress. Puedes obtener fácilmente el contenido sin todo el código php que aparece en la respuesta de abajo.

maysi maysi
10 ene 2019 13:34:05
Todas las respuestas a la pregunta 1
2
17

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 );

}
4 feb 2016 13:18:20
Comentarios

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.

maysi maysi
10 ene 2019 13:36:11

Hola, usé admin-ajax.php pero debido a la seguridad del firewall estoy obteniendo un error 403 ya que está llamando a wp-admin en el frontend.

David Coder David Coder
3 mar 2021 07:32:58