1

处理由以前的 Web 开发人员编写的一些代码,我遇到了一个问题,即更新画廊的拖放 AJAX 驱动的照片顺序无法保存。我正在运行最新版本的 WordPress (3.3.2),但客户说自定义订购从未奏效。

以下是正在发生的事情的更详细列表:

  1. 客户转到 WP 管理面板上帖子的编辑区域。
  2. 客户端使用拖放功能对一些照片重新排序,AJAX 触发的警报表明订单已保存。
  3. 用户单击“更新”按钮并查看他们的帖子。订单现在混乱,并没有保留他们的拖放顺序。

下面的方法对我有用,但只是部分:

  1. 单击现有帖子进行编辑。
  2. 拖放了一些照片的排列,但还没有点击“更新”。
  3. 相反,在显示 AJAX 驱动的警报表明订单已保存后,我去刷新前端的更新帖子。该帖子反映了我设置的新照片顺序。
  4. 在避免像瘟疫一样的“更新”按钮之后,我点击帖子列表并回到同一个帖子,就像我想编辑其他东西一样。我猜基本上是在帖子本身内开始一个新会话。照片顺序现在混乱了,我之前设置的拖放顺序被吹走了。

以下是处理照片订单本身的 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);
        }
    }
}

如果您想查看完整实现的内容,可以在此处查看

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

4

0 回答 0