Classe $wpdb per aggiornare meta_value utilizzando Ajax

19 set 2011, 04:43:56
Visualizzazioni: 1.96K
Voti: 1

Sto cercando di creare un modo per cambiare l'ordine dei post utilizzando un meta_key / meta_value che viene aggiornato usando jQuery ui-sortable.

Sto già utilizzando menu_order nello stesso modo ma ho bisogno di creare un modo per visualizzare in anteprima il nuovo ordine prima di salvare i nuovi valori di menu_order.

La mia funzione Ajax che non funziona:

function wnd_preview_item_order() {
    global $wpdb;
    $order = explode(',', $_POST['order']);
    $counter = 0;
    foreach ($order as $item_id) {
        $wpdb->update($wpdb->postmeta, array( 'meta_key' => '_wnd_pre_order', 'meta_value' => $counter ), array( 'ID' => $item_id) );
        $counter++;
    }
    die(1);
}
add_action('wp_ajax_item_sort', 'wnd_preview_item_order');
add_action('wp_ajax_nopriv_item_sort', 'wnd_preview_item_order');

Riesco ad aggiornare il menu_order senza problemi usando una funzione Ajax simile ma sono bloccato nel cambiare il valore di meta_key.

Sortable js:

Aggiornamento: Ho apportato alcune modifiche al js per salvare l'ordine al click.

    jQuery(document).ready(function($) {
        $( "#<?php echo $catID; ?>-sortable" ).sortable({
        cursor:'move',
        items:'.lineitem',
        placeholder:'sortable-placeholder',
        tolerance: 'pointer',
        forcePlaceholderSize: true,
        helper: 'clone',
        opacity: 0.65
    });
    $("#<?php echo $catID; ?>-save-order").bind( "click", function() {
       $.post( ajaxurl, { action:'item_sort', order: $( "#<?php echo $catID; ?>-sortable" ).sortable('toArray').toString() },
       function() {
       $("#<?php echo $catID; ?>-ajax-response").html('<div class="message updated fade"><p>Ordine Post Aggiornato</p></div>');
       $("#<?php echo $catID; ?>-ajax-response div").delay(3000).hide("slow");
    });
       });

});

La mia Query per visualizzare i post usando l'orderby meta_value:

$exclude =  $GLOBALS['current_id'];
            if ($count >= 4 ) : $ppp = 4; else : $ppp = 7; endif;
            $args = array(
            'cat' => $category->term_id,
            'meta_key'  => '_wnd_pre_order',
            'orderby'    => 'meta_value_num',
            'order'      => 'ASC',
            'post__not_in' => array($exclude),
            'posts_per_page' => $ppp
        );
        $cat_query = new WP_Query( $args );

Aggiornamento:

Questa è la funzione Ajax per cambiare il menu_order che invece funziona:

function wnd_save_item_order() {
     global $wpdb;
    $order = explode(',', $_POST['order']);
    $counter = 0;
    foreach ($order as $item_id) {
        $wpdb->update($wpdb->posts, array( 'menu_order' => $counter ), array( 'ID' => $item_id) );
        $counter++;
    }
    die(1);
}
Chris_O
Chris_O
20.6K
Commenti

Perché non aggiorni semplicemente la colonna menu_order nella tabella wp_posts? Questo potrebbe farti risparmiare un bel po' di lavoro dato che puoi semplicemente usare orderby menu_order.

Brian Fegter Brian Fegter
19 set 2011 04:56:50

Qual è l'errore (il valore di e)? Solo per tua informazione, stai richiedendo una risposta json, ma la funzione wnd_preview_item_order non sta inviando alcun dato codificato in json.

onetrickpony onetrickpony
19 set 2011 05:10:33

@BrianFegter Sto usando menu_order ma il mio cliente vuole la possibilità di visualizzare l'anteprima della pagina con il nuovo ordine prima di salvare.

Chris_O Chris_O
19 set 2011 05:56:01

@OneTrickPony Stava segnalando successo.

Chris_O Chris_O
19 set 2011 06:01:45

Solo una nota: Non usare die(1), perché a volte impedisce di restituire correttamente un 0 o un -1. Usa semplicemente exit;, che è anche leggermente più veloce.

kaiser kaiser
4 ott 2012 12:22:00

Grazie per il suggerimento. Quindi admin-ajax.php restituirà lo 0 o il -1?

Chris_O Chris_O
4 ott 2012 21:12:45

La domanda è ancora rilevante o può essere chiusa?

Rarst Rarst
8 ott 2012 23:09:23

@Chris_O Sì, afaik lo farà. Potresti per favore spostare la tua soluzione in una risposta?

kaiser kaiser
9 ott 2012 17:56:32
Mostra i restanti 3 commenti