Класс $wpdb: обновление meta_value с использованием Ajax

19 сент. 2011 г., 04:43:56
Просмотры: 1.96K
Голосов: 1

Я пытаюсь создать способ изменения порядка записей с использованием meta_key / meta_value, который обновляется с помощью jQuery ui-sortable.

Я уже использую menu_order аналогичным образом, но мне нужно создать возможность предварительного просмотра нового порядка перед сохранением новых значений menu_order.

Моя Ajax-функция, которая не работает:

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

Я могу без проблем обновлять menu_order с помощью аналогичной Ajax-функции, но застрял на изменении значения meta_key.

Sortable js:

Обновление: Я внес некоторые изменения в js для сохранения порядка по клику.

    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>Порядок записей обновлен</p></div>');
       $("#<?php echo $catID; ?>-ajax-response div").delay(3000).hide("slow");
    });
       });

});

Мой запрос для отображения записей с использованием 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 );

Обновление:

Вот Ajax-функция для изменения menu_order, которая работает:

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);
}
Комментарии

Почему бы просто не обновить столбец menu_order в таблице wp_posts? Это может сэкономить вам значительную работу, так как можно просто использовать orderby menu_order.

Brian Fegter Brian Fegter
19 сент. 2011 г. 04:56:50

Так какая именно ошибка (значение e)? Просто чтобы вы знали, вы запрашиваете json-ответ, но функция wnd_preview_item_order не отправляет никаких данных в формате json.

onetrickpony onetrickpony
19 сент. 2011 г. 05:10:33

@BrianFegter Я использую menu_order, но мой клиент хочет иметь возможность предварительного просмотра страницы с новым порядком перед сохранением.

Chris_O Chris_O
19 сент. 2011 г. 05:56:01

@OneTrickPony Это было уведомление об успехе.

Chris_O Chris_O
19 сент. 2011 г. 06:01:45

Просто заметка: Не используйте die(1), так как это иногда мешает корректному возвращению 0 или -1. Просто используйте exit;, что также немного быстрее.

kaiser kaiser
4 окт. 2012 г. 12:22:00

Спасибо за совет. Значит, admin-ajax.php вернет 0 или -1?

Chris_O Chris_O
4 окт. 2012 г. 21:12:45

Актуален ли ещё вопрос или его можно закрыть?

Rarst Rarst
8 окт. 2012 г. 23:09:23

@Chris_O Да, насколько мне известно, будет. Не мог бы ты перенести своё решение в ответ?

kaiser kaiser
9 окт. 2012 г. 17:56:32
Показать остальные 3 комментариев