だから私は少し問題があります。WordPressプラグイン内に、ユーザーがカテゴリを注文できるようにするドラッグアンドドロップリストを作成しました。ほとんどの場合、これが機能しています...
テーブルは MySQL データベースから取り込まれます。
$results = $wpdb->get_results($sql);
foreach($results as $result)
{
?>
<tr id="list_item_<?php echo $result->priority_order; ?>" class="list_item">
<td>
<?php echo $result->name; ?>
</td>
<td>
<?php echo $result->priority_order; ?>
</td>
</tr>
<?php
}
テーブルをソート可能にするために「jquery-ui-sortable」を使用しています。
リストをドラッグ可能にしてリストを更新するための私のJQueryは次のとおりです。
$('.list').sortable(
{
items: '.list_item',
opacity: 0.6,
cursor: 'move',
axis: 'y',
update: function()
{
var order = $(this).sortable('serialize') + '&action=update_order';
$.post(ajaxurl, order, function(response)
{
//alert(response);
});
}
});
新しい順序でデータベースを更新するために使用される PHP は次のとおりです。
function save_order()
{
global $wpdb;
$table_name = $wpdb->prefix . "categories";
$sql = "SELECT * FROM ".$table_name." ORDER BY priority_order ASC";
$results = $wpdb->get_results($sql);
$results = parseObjectToArray($results);
$new_order = $_POST["list_item"];
$counter = 0;
foreach($new_order as $v)
{
if(isset($results[$v]["priority_order"]))
{
$update_sql = "UPDATE ".$table_name." SET priority_order='".$counter."' WHERE category_id='".$results[$v]["category_id"]."'";
$wpdb->query($update_sql);
$counter++;
}
}
die();
}
add_action('wp_ajax_update_order','save_order');
// Converts StdObject to regular array
function parseObjectToArray($object)
{
$array = array();
foreach($object as $o)
{
if (is_object($o))
{
$array[] = get_object_vars($o);
}
}
return $array;
}
私の問題は、リストが最初に完全に更新される一方で、ページが手動で更新されていないと仮定して送信される次のシリアル化された配列が正しく更新されないことです。これは、新しいリストとデータベースから新しく更新されたリストが同期されなくなったためです。
これは、更新が必要なものを一致させるために配列インデックスを使用しているためですが、最初の変更後、新しいリストのインデックスと配列からのインデックスがまったく一致しません...
この問題を解決する方法について誰か考えがありますか? 私はかなり見回しましたが、見つけたコードのほとんどは私のものと似ており、私のものを壊す可能性のある顕著な違いは見られません. 更新のたびにページを更新する必要がありますか?