Obținerea post_id în funcția wp_ajax

25 iul. 2012, 15:21:01
Vizualizări: 22.6K
Voturi: 6

Am scris o funcție AJAX personalizată în care am atribuit un tip de postare ca fiind copil al unui alt tip de postare. Într-o funcție parcurg aceste postări copil și vreau să actualizez baza de date pentru a reflecta post_parent (postarea de care aparțin postările copil).

Problema este că nu pot prelua ID-ul acelei postări de nicăieri pentru a actualiza baza de date. Aveți sugestii?

Iată funcția jQuery:

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

    }
});

Și aici este callback-ul 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
Comentarii

Te rugăm să consulți [tag:wp-localize-script] pentru a vedea cum să transmiți corect date din PHP în javascript.

kaiser kaiser
25 iul. 2012 15:25:47
Toate răspunsurile la întrebare 2
5
24

Este o întrebare veche, dar aș dori să răspund pentru alți oameni.

În funcția ajax legată la wp_ajax, faceți asta.

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

Este mai performant să transmiți doar ID-ul din JavaScript, folosirea url_to_postid necesită interogarea bazei de date.

Milo Milo
5 feb. 2015 20:27:20

Așa este, dar dacă vrei să o faci doar pe partea de server, ca în cazul meu unde trebuie să validez ID-ul postării.

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

foarte bun răspunsul! legat de performanță... poate că e mai puțin performant, dar cu siguranță e mai sigur.

zlikotp zlikotp
21 mar. 2020 19:42:38

Referer-ul poate fi falsificat. Nu într-un browser, dar da, în limbaje de scripting. Ar trebui folosit un nonce combinat cu o verificare current_user_can, după care fie acest răspuns, fie cel al lui TheDeadMedic ar fi la fel de sigure. Și pentru punctele de acces ajax publice, ar trebui folosit is_post_publicly_viewable.

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

Acesta este unul dintre cele mai bune răspunsuri. Mi-ai economisit mult timp, omule!!!

Mobashir Mobashir
29 oct. 2023 11:15:48
0

Cârligul (hook) AJAX nu va returna un obiect $post către funcția ta de callback - cum naiba ar ști să facă asta!

Trebuie să trimiți datele tu însuți:

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

...și apoi să le preiei din $_POST în handler-ul tău:

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