Clase $wpdb para actualizar meta_value usando Ajax

19 sept 2011, 04:43:56
Vistas: 1.96K
Votos: 1

Estoy intentando crear una forma de cambiar el orden de los posts usando una meta_key / meta_value que se actualiza mediante jQuery ui-sortable.

Ya estoy usando menu_order de la misma manera pero necesito crear una forma de previsualizar el nuevo orden antes de guardar los nuevos valores de menu_order.

Mi función Ajax que no está funcionando:

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

Puedo actualizar el menu_order sin problemas usando una función Ajax similar pero estoy atascado en cambiar el valor de meta_key.

JS Sortable:

Actualización: Hice algunos ajustes al js para guardar el orden al hacer clic.

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>Orden de posts actualizado</p></div>');
            $("#<?php echo $catID; ?>-ajax-response div").delay(3000).hide("slow");
        });
    });
});

Mi consulta para mostrar los posts usando orderby con 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);

Actualización:

Esta es la función Ajax para cambiar el menu_order que sí funciona:

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

¿Por qué no simplemente actualizas la columna menu_order en la tabla wp_posts? Esto podría ahorrarte un trabajo considerable ya que puedes simplemente usar orderby menu_order.

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

Bueno, ¿cuál es el error (el valor de e)? Solo para que lo sepas, estás solicitando una respuesta json, pero la función wnd_preview_item_order no está enviando ningún dato codificado en json.

onetrickpony onetrickpony
19 sept 2011 05:10:33

@BrianFegter Estoy usando menu_order pero mi cliente quiere la capacidad de previsualizar la página con el nuevo orden antes de guardar.

Chris_O Chris_O
19 sept 2011 05:56:01

@OneTrickPony Estaba alertando éxito.

Chris_O Chris_O
19 sept 2011 06:01:45

Solo una nota: No uses die(1), ya que a veces evita lanzar un 0 o -1 correcto al retornar. Simplemente usa exit;, que además es un poco más rápido.

kaiser kaiser
4 oct 2012 12:22:00

Gracias por el consejo. ¿Entonces admin-ajax.php lanzará el 0 o -1?

Chris_O Chris_O
4 oct 2012 21:12:45

¿La pregunta sigue siendo relevante o puede cerrarse?

Rarst Rarst
8 oct 2012 23:09:23

@Chris_O Sí, afaik lo hará. ¿Podrías por favor mover tu solución a una respuesta?

kaiser kaiser
9 oct 2012 17:56:32
Mostrar los 3 comentarios restantes