WordPress AJAX在图库中拖放图像不保留用户设置的顺序

时间:2012-05-29 18:13:47

标签: php wordpress

处理由前一个Web开发人员组装的一些代码,我遇到了一个问题,即更新拖放AJAX驱动的图库顺序不能保存。我正在运行最新版本的WordPress(3.3.2),但客户说自定义排序从未奏效。

以下是更详细的清单:

  1. 客户端转到WP管理面板上帖子的编辑区域。
  2. 客户端使用拖放功能对某些照片进行重新排序,并且AJAX触发的警报表示订单已保存。
  3. 用户点击“更新”按钮并查看其帖子。订单现在混乱,并没有保留拖放顺序。
  4. 以下方法对我有用但只是部分:

    1. 点击现有帖子进行编辑。
    2. 拖放了一些照片的排列,但没有点击“更新”。
    3. 相反,在显示AJAX驱动的警报显示订单已保存之后,我去了前端更新了更新的帖子。该帖子反映了我设置的新照片订单。
    4. 在避开像瘟疫一样的“更新”按钮后,我点击了帖子列表并回到了同一个帖子,就像我想要编辑其他内容一样。基本上我在帖子中开始一个新的会话。照片订单现在混乱了,我之前设置的拖放命令被吹走了。
    5. 以下是处理照片订单本身的functions.php文件中的代码:

      // Ajax callback for reordering images
      function reorder_images() {
          if (!isset($_POST['data'])) die();
      
          list($order, $post_id, $key, $nonce) = explode('!',$_POST['data']);
      
          if (!wp_verify_nonce($nonce, 'rw_ajax_sort_file')) {
              die('1');
          }
      
          parse_str($order, $items);
          $items = $items['item'];
          $order = 0;
          $meta = array();
          foreach ($items as $item) {
              wp_update_post(array(
                  'ID' => $item,
                  'post_parent' => $post_id,
                  'menu_order' => $order
              ));
              $order++;
              $meta[] = $item;
          }
          delete_post_meta($post_id, $key);
          foreach ($meta as $value) {
              add_post_meta($post_id, $key, $value);
          }
      
          die('0');
      }
      

      我认为DOING_AUTOSAVE存在问题,但发现它已经在代码中实现了(见下文):

      // Save data from meta box
      function save($post_id) {
          global $post_type;
          $post_type_object = get_post_type_object($post_type);
      
          if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)                       // check autosave
          || (!isset($_POST['post_ID']) || $post_id != $_POST['post_ID'])         // check revision
          || (!in_array($post_type, $this->_meta_box['pages']))                   // check if current post type is supported
          || (!check_admin_referer(basename(__FILE__), 'rw_meta_box_nonce'))      // verify nonce
          || (!current_user_can($post_type_object->cap->edit_post, $post_id))) {  // check permission
              return $post_id;
          }
      
          foreach ($this->_fields as $field) {
              $name = $field['id'];
              $type = $field['type'];
              $old = get_post_meta($post_id, $name, !$field['multiple']);
              $new = isset($_POST[$name]) ? $_POST[$name] : ($field['multiple'] ? array() : '');
      
              // validate meta value
              if (class_exists('RW_Meta_Box_Validate') && method_exists('RW_Meta_Box_Validate', $field['validate_func'])) {
                  $new = call_user_func(array('RW_Meta_Box_Validate', $field['validate_func']), $new);
              }
      
              // call defined method to save meta value, if there's no methods, call common one
              $save_func = 'save_field_' . $type;
              if (method_exists($this, $save_func)) {
                  call_user_func(array(&$this, 'save_field_' . $type), $post_id, $field, $old, $new);
              } else {
                  $this->save_field($post_id, $field, $old, $new);
              }
          }
      }
      

      如果您想查看完整内容,可以see it here

      提前致谢。如果您需要更多信息,我会尝试提供我能做的一切。也许这只是某种插件冲突。上面概述的方法目前正通过主题本身的functions.php文件实现。

0 个答案:

没有答案