Obtener el post_id en la función wp_ajax

25 jul 2012, 15:21:01
Vistas: 22.6K
Votos: 6

Escribí una función AJAX personalizada en la que he asignado un tipo de post como hijo de otro tipo de post. En una función estoy recorriendo esos posts hijos, y quiero actualizar la base de datos para reflejar el post_parent (el post al que pertenecen los posts hijos).

El problema es que no puedo obtener el ID de ese post desde ningún lugar para actualizar la base de datos. ¿Alguna sugerencia?

Aquí está la función jQuery:

$.ajax({
    url: ajaxurl,
    type: 'POST',
    async: true,
    cache: false,
    dataType: 'json',
    data: {
        action: 'new_item_save',
        item_order: $('#img-sortable').sortable('toArray').toString()
    }
});

Y aquí está el callback en PHP:

function save_new_img_order( $post ) {
    global $wpdb;
    $pid = $post->ID;

    $order   = explode( ',', $_POST[ 'item_order' ] );
    $counter = 0;
    foreach ( $order as $item_id ) {
        $wpdb->update( $wpdb->posts, array( 'menu_order'  => $counter,
                                            'post_parent' => $pid,
        ), array( 'ID' => $item_id ) );
        $counter ++;
    }
    die( 1 );
}

add_action( 'wp_ajax_new_item_save', 'save_new_img_order' );
1
Comentarios

Por favor revisa el [tag:wp-localize-script] para ver cómo pasar correctamente datos de PHP a javascript.

kaiser kaiser
25 jul 2012 15:25:47
Todas las respuestas a la pregunta 2
5
24

Es una pregunta antigua pero me gustaría responder para otras personas.

Dentro de la función ajax enganchada a wp_ajax, haz esto:

$url     = wp_get_referer();
$post_id = url_to_postid( $url );
5 feb 2015 20:22:24
Comentarios

Es más eficiente simplemente pasar el ID desde JavaScript, usar url_to_postid requiere consultar la base de datos.

Milo Milo
5 feb 2015 20:27:20

Así es, pero si quieres hacerlo solo del lado del servidor, como en mi caso donde tengo que validar el ID de la publicación.

Mohammad Sayed Mohammad Sayed
5 feb 2015 20:30:33

¡Muy buena respuesta! En cuanto al rendimiento... tal vez sea menos eficiente, pero definitivamente es más seguro.

zlikotp zlikotp
21 mar 2020 19:42:38

El referer puede ser falsificado. No en un navegador, pero sí en lenguajes de scripting. Se debe usar un nonce combinado con una verificación current_user_can, después de lo cual tanto esta respuesta como la de TheDeadMedic serían igual de seguras. Y para endpoints AJAX públicos, se debe usar is_post_publicly_viewable.

wp-overwatch.com wp-overwatch.com
25 feb 2022 00:53:30

¡Esta es una de las mejores respuestas! ¡Me ahorraste mucho tiempo, hermano!!!

Mobashir Mobashir
29 oct 2023 11:15:48
0

El hook de AJAX no devolverá un objeto $post a tu callback - ¡de ninguna manera sabría cómo hacerlo!

Necesitas enviar los datos tú mismo:

data:{
    action: 'new_item_save',
    post_id: POST_ID_EITHER_PARSED_FROM_DOM_OR_PHP_ECHOED,
    item_order: $('#img-sortable').sortable('toArray').toString()
}

...y luego capturarlos desde $_POST en tu manejador:

function save_new_img_order() {
    $post_id = $_POST['post_id'];
    ...
}
25 jul 2012 15:54:00