it-swarm-ja.com

削除リンクのクリックイベントでjQueryが使用されている場合に添付ファイルを削除する方法

私は自分がやるべきことを正しく軌道に乗せていると思います。私はよくわかりません、私は私が知っているすべてのための方法をオフにすることができます。

これはアップロードされた画像ファイルのサイズを変更するために昨夜助けを必要としていたコードの一部ですが、今私はwp_delete_attachment($ id)関数を使用して投稿に添付された画像を削除する方法を考えています。

それで、私は添付するより多くの画像をアップロードするために、追加のフィールドを追加/削除するこのjQueryスクリプトを持っています。画像を追加するたびに、それらを削除するためのリンクが表示されます。 [削除]をクリックしても、クリックしたリンクが含まれていたdivが削除されるだけで、投稿を保存するときに添付ファイルがまだ添付ファイルとして表示されます。

削除リンクのクリックイベントハンドラで、最初にwp_delete_attachment()を呼び出す関数を実行して、ファイル/添付ファイルを完全に削除する必要があります。その場合、jQueryを使用してその添付ファイルのdivをページから削除できます。そのようにポストを保存するとき、それは削除されて、まだ再び現れないでしょう。

これが私が働きかけようとしていた私の機能です。

// a function that returns the delete attachment php function, 
// and a message saying Deleted that fades in and out.
    jQuery(function() {
        function delete_att( attID ) {
            var div = jQuery('#img_uploads'),
                msg = $('div').html('<strong>Attachment Deleted!</strong>').fadeIn().delay(200).fadeOut().appendTo('div');
            return '<?php wp_delete_attachment( ' + attID + ', true ); ?>', msg;
        }

そして、この関数を呼び出して、それからページから含まれているdiv要素を削除するクリックハンドラは、次のとおりです。

    jQuery('.remImage').live('click', function() { 
        if( size > 1 ) {
            var postID = jQuery('#attID').val()
            delete_att( postID );

            //jQuery(this).parents('.attchmt').find('#attID');
            jQuery(this).parents('.attchmt').detach();
            size--;
        } 
        return false; 
    });
});

追加のフィールドを追加するためのコードはこれら2つの部分の間にありますが、これらは私が助けを必要とするもののための重要な部分です。現在、私がそれをここでコーディングした方法は、このエラーメッセージを得ています。 idk wtfこれはまあまあですが笑。

Error: uncaught exception: [Exception... "Node cannot be inserted at the specified point in the hierarchy"  code: "3" nsresult: "0x80530003 (NS_ERROR_DOM_HIERARCHY_REQUEST_ERR)"  location: "http://code.jquery.com/jquery-1.4.4.min.js Line: 113"]

それで、これが私が使っている完全なコードです。 https://Gist.github.com/802465 jQueryとPhpの間で情報をやり取りしようとしているだけで、それは常にお尻の痛みです。(私のために)。

2
jaredwilli

私はようやくそれをする方法を考え出しました、そしてそれは今100%うまくいきます!

加えて、admin-ajax.phpを使用しているので、Removeリンクをクリックすると、添付ファイルの削除を行い、削除されたというメッセージを返す関数にajaxリクエストが送信されます。

これが私の解決策のコードです、最初はメタボックスのhtmlです:

<a class="remImage" href="#"><?php _e('Remove');?></a>                  
<input type="hidden" id="att_remove" name="att_remove[]" value="<?php echo $attachment->ID; ?>" />
<input type="hidden" name="nonce" id="nonce" value="<?php echo wp_create_nonce( 'delete_attachment' ); ?>" />

これがPhp関数です。

add_action( 'wp_ajax_delete_attachment', 'delete_attachment' );
function delete_attachment( $post ) {
    //echo $_POST['att_ID'];
    $msg = 'Attachment ID [' . $_POST['att_ID'] . '] has been deleted!';
    if( wp_delete_attachment( $_POST['att_ID'], true )) {
        echo $msg;
    }
    die();
}

そして、アタッチメントIDやアクションなどを送信し、ajaxレスポンスを受け取った後にDOMからdivを削除するjQueryスクリプトは次のとおりです。

    jQuery('.remImage').live('click', function() {
        if( size > 1 ) {
            jQuery.ajax({
                type: 'post',
                url: ajaxurl,
                data: {
                    action: 'delete_attachment',
                    att_ID: jQuery(this).parents('.attchmt').find('#att_remove').val(),
                    _ajax_nonce: jQuery('#nonce').val(),
                    post_type: 'attachment'
                },
                success: function( html ) {
                    alert( html );
                }
            });
            jQuery(this).parents('.attchmt').detach();
            size--;
        }
        return false;
    });

私は今や、私がそれを試みる試みで何度も失敗した試みの数々の試みの後に、私が全く不可能だと思ったことをついに完成することができました。

それはすぐにプラグインになるでしょう、それで私はそれにそれを追加するためにポストタイプを定義するための簡単なオプションで、どんなサイトでも簡単に使うことができます。

3
jaredwilli

WordPress関数をJQueryから直接呼び出そうとしているためにうまくいかないようです。あなたができることはdivを隠すためにあなたの関数を使うことですが、そのアクションであなたが添付ファイルのIDを持った配列として削除したいそれぞれの添付ファイルのために隠されたフィールドを加える:

<input type="hidden" name="att_remove[]" value="attachment_ID">

そしてsave_postフックでこれらのファイルを削除するための関数を追加してください。

function remove_custom_att_1212(){
   global $post;
   if ($post->post_type =="your custom post type"){
      if (isset($_POST['att_remove']){
         foreach ($_POST['att_remove'] as $att_id){
           delete_att($att_id);
         }
      }
   }
}
add_action('save_post','remove_custom_att_1212');
2
Bainternet