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