0

だから私は少し問題があります。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;
}

私の問題は、リストが最初に完全に更新される一方で、ページが手動で更新されていないと仮定して送信される次のシリアル化された配列が正しく更新されないことです。これは、新しいリストとデータベースから新しく更新されたリストが同期されなくなったためです。

これは、更新が必要なものを一致させるために配列インデックスを使用しているためですが、最初の変更後、新しいリストのインデックスと配列からのインデックスがまったく一致しません...

この問題を解決する方法について誰か考えがありますか? 私はかなり見回しましたが、見つけたコードのほとんどは私のものと似ており、私のものを壊す可能性のある顕著な違いは見られません. 更新のたびにページを更新する必要がありますか?

4

1 に答える 1

0

私はまた自分で答えを見つけました、ハハ...

私は pirority_order フィールドに集中していましたが、代わりに各カテゴリ ID を送信し、SQL を使用して ORDER BY priority_id を実行し、カウンターを使用して新しい順序を割り当てることができました。

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["ebs_list_item"];

$counter = 0;
foreach($new_order as $v)
{
    $update_sql = "UPDATE ".$table_name." SET priority_order=".$counter." WHERE id=".$v;
    $wpdb->query($update_sql);

    $counter++;
}
die();

<tr id="list_item_<?php echo $result->id; ?>" class="list_item">
    <td>
        <?php echo $result->name; ?>
    </td>
    <td>
        <?php echo $result->priority_order; ?>
    </td>
</tr>
于 2012-11-23T16:48:43.877 に答える