Clasa $wpdb actualizând meta_value folosind Ajax

19 sept. 2011, 04:43:56
Vizualizări: 1.96K
Voturi: 1

Încerc să creez o metodă de a schimba ordinea postărilor folosind o meta_key / meta_value care este actualizată folosind jQuery ui-sortable.

Deja folosesc menu_order în același mod, dar trebuie să creez o metodă de a previzualiza noua ordine înainte de a salva noile valori pentru menu_order.

Funcția mea Ajax care nu funcționează:

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

Pot actualiza menu_order fără probleme folosind o funcție Ajax similară, dar nu reușesc să schimb valoarea meta_key.

Sortable js:

Actualizare: Am făcut unele ajustări în js pentru a salva ordinea la 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>Post Order Updated</p></div>');
            $("#<?php echo $catID; ?>-ajax-response div").delay(3000).hide("slow");
        });
    });
});

Interogarea mea pentru afișarea postărilor folosind orderby după 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 );

Actualizare:

Aceasta este funcția Ajax pentru schimbarea menu_order care funcționează:

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

De ce nu actualizați pur și simplu coloana menu_order din tabelul wp_posts? Acest lucru v-ar putea economisi mult efort, deoarece puteți folosi orderby menu_order.

Brian Fegter Brian Fegter
19 sept. 2011 04:56:50

Care este eroarea (valoarea lui e)? Doar ca să știți, solicitați un răspuns json, dar funcția wnd_preview_item_order nu trimite nicio dată codificată json.

onetrickpony onetrickpony
19 sept. 2011 05:10:33

@BrianFegter Folosesc menu_order, dar clientul meu dorește să poată previzualiza pagina cu noua ordine înainte de salvare.

Chris_O Chris_O
19 sept. 2011 05:56:01

@OneTrickPony A alertat succesul.

Chris_O Chris_O
19 sept. 2011 06:01:45

Doar o notă: Nu folosi die(1), deoarece uneori împiedică returnarea corectă a unei valori 0 sau -1. Folosește simplu exit;, care este și puțin mai rapid.

kaiser kaiser
4 oct. 2012 12:22:00

Mulțumesc pentru pont. Deci admin-ajax.php va returna 0 sau -1?

Chris_O Chris_O
4 oct. 2012 21:12:45

Întrebarea este încă relevantă sau poate fi închisă?

Rarst Rarst
8 oct. 2012 23:09:23

@Chris_O Da, după câte știu eu va funcționa. Poți, te rog, să muți soluția ta într-un răspuns?

kaiser kaiser
9 oct. 2012 17:56:32
Arată celelalte 3 comentarii