处理由以前的 Web 开发人员编写的一些代码,我遇到了一个问题,即更新画廊的拖放 AJAX 驱动的照片顺序无法保存。我正在运行最新版本的 WordPress (3.3.2),但客户说自定义订购从未奏效。
以下是正在发生的事情的更详细列表:
- 客户转到 WP 管理面板上帖子的编辑区域。
- 客户端使用拖放功能对一些照片重新排序,AJAX 触发的警报表明订单已保存。
- 用户单击“更新”按钮并查看他们的帖子。订单现在混乱,并没有保留他们的拖放顺序。
下面的方法对我有用,但只是部分:
- 单击现有帖子进行编辑。
- 拖放了一些照片的排列,但还没有点击“更新”。
- 相反,在显示 AJAX 驱动的警报表明订单已保存后,我去刷新前端的更新帖子。该帖子反映了我设置的新照片顺序。
- 在避免像瘟疫一样的“更新”按钮之后,我点击帖子列表并回到同一个帖子,就像我想编辑其他东西一样。我猜基本上是在帖子本身内开始一个新会话。照片顺序现在混乱了,我之前设置的拖放顺序被吹走了。
以下是处理照片订单本身的 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
主题本身的文件实现。