Ottenere il post_id nella funzione wp_ajax

25 lug 2012, 15:21:01
Visualizzazioni: 22.6K
Voti: 6

Ho scritto una funzione AJAX personalizzata in cui ho assegnato un tipo di post come figlio di un altro tipo di post. In una funzione sto facendo un ciclo attraverso questi post figli e voglio aggiornare il database per riflettere il post_parent (il post a cui appartengono i post figli).

Il problema è che non riesco a recuperare l'ID di quel post da nessuna parte per aggiornare il database. Qualche suggerimento?

Ecco la funzione jQuery:

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

    }
});

Ed ecco la callback 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
Commenti

Dai un'occhiata a [tag:wp-localize-script] per vedere come passare correttamente i dati da PHP a javascript.

kaiser kaiser
25 lug 2012 15:25:47
Tutte le risposte alla domanda 2
5
24

È una domanda vecchia ma vorrei rispondere per altre persone

All'interno della funzione ajax agganciata a wp_ajax fai questo.

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

È più performante passare semplicemente l'ID da JavaScript, utilizzare url_to_postid richiede l'interrogazione del database.

Milo Milo
5 feb 2015 20:27:20

Esatto, ma se vuoi farlo solo lato server, come nel mio caso in cui devo validare l'ID del post.

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

risposta molto valida! riguardo alle performance... forse è meno performante, ma è decisamente più sicuro.

zlikotp zlikotp
21 mar 2020 19:42:38

Il referer può essere falsificato. Non in un browser, ma sì nei linguaggi di scripting. Dovrebbe essere utilizzato un nonce combinato con un controllo current_user_can dopo il quale sia questa risposta che quella di TheDeadMedic sarebbero ugualmente sicure. E per gli endpoint ajax pubblici, dovrebbe essere utilizzato is_post_publicly_viewable.

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

Questa è una delle migliori risposte. Mi hai fatto risparmiare un sacco di tempo amico!!!

Mobashir Mobashir
29 ott 2023 11:15:48
0

L'hook AJAX non passerà un oggetto $post alla tua callback - come potrebbe sapere di doverlo fare!

Devi inviare i dati tu stesso:

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

...e poi recuperarli da $_POST nel tuo handler:

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