it-swarm.com.de

So löschen Sie Post-Anhänge, wenn jQuery mit einem Klickereignis auf den Löschlink verwendet wird

Ich denke, ich bin auf dem richtigen Weg, was ich tun muss, zumindest, um eine der Möglichkeiten zu finden, die es gibt. Ich bin mir allerdings nicht sicher, ob ich weit weg sein könnte, soweit ich weiß.

Dies ist ein Teil des Codes, den ich gestern Abend zum Ändern der Größe der hochgeladenen Bilddateien benötigte, aber jetzt versuche ich herauszufinden, wie die Funktion wp_delete_attachment ($ id) zum Löschen von an die Beiträge angehängten Bildern verwendet wird.

Also, ich habe dieses jQuery-Skript, das zusätzliche Felder hinzufügt/entfernt, um mehr Bilder zum Anhängen hochzuladen. Für jedes hinzugefügte Bild gibt es einen Link, um sie zu entfernen. Wenn Sie auf "Entfernen" klicken, wird immer nur das Div entfernt, in dem der angeklickte Link enthalten war. Beim Speichern des Posts wird die angehängte Datei als noch angehängt angezeigt.

In meinem Click-Event-Handler für den Remove-Link muss ich zuerst eine Funktion ausführen, die wp_delete_attachment () aufruft, um die Datei/den Anhang dauerhaft zu löschen. DANN kann ich jQuery verwenden, um den Div dieses Anhangs von der Seite zu entfernen. Auf diese Weise wird der Beitrag beim Speichern gelöscht und nicht mehr angezeigt.

Hier sind meine Funktionen, mit denen ich versucht habe zu arbeiten:

// 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;
        }

Der Click-Handler, der diese Funktion aufruft und dann das enthaltende div-Element von der Seite entfernt, lautet:

    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; 
    });
});

Der Code zum Hinzufügen zusätzlicher Felder befindet sich zwischen diesen beiden Teilen, aber dies sind die Schlüsselelemente für das, bei dem ich Hilfe benötige. Momentan erhalte ich, wie ich es hier codiert habe, diese Fehlermeldung. idk wtf das heißt aber genau lol.

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"]

Hier ist also der vollständige Code, den ich genau verwende. https://Gist.github.com/802465 Ich versuche nur, Informationen an/von jQuery und Php zu übermitteln, und das ist immer ein Ärgernis (für mich).

2
jaredwilli

Ich habe endlich herausgefunden, wie es geht und es funktioniert jetzt zu 100% !!

Außerdem wird die Datei admin-ajax.php verwendet. Wenn Sie also auf den Link Entfernen klicken, wird eine Ajax-Anforderung an die Funktion gesendet, die den Anhang löscht und die Meldung zurückgibt, dass er gelöscht wurde.

Hier ist der Code für meine Lösung, zuerst ist der HTML-Code für die Metabox:

<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' ); ?>" />

Hier ist die PHP-Funktion:

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();
}

Das jQuery-Skript, das die Anhangs-ID und die Aktion usw. sendet und anschließend nach Erhalt der Ajax-Antwort das div aus dem DOM entfernt, lautet:

    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;
    });

Ich bin jetzt in der Lage, endlich das zu vervollständigen, was ich nach der Anzahl der Versuche, die ich unternommen habe, um es zu schaffen, für absolut unmöglich gehalten habe und die jedes Mal gescheitert sind.

Es wird in Kürze ein Plugin geben, das ich dann problemlos auf jeder Site verwenden kann, mit einfachen Optionen zum Definieren des Beitragstyps, zu dem es hinzugefügt werden soll.

3
jaredwilli

Es sieht so aus, als ob Sie versuchen, die WordPress-Funktion direkt von JQuery aus aufzurufen, sodass dies nicht funktioniert. Was Sie tun können, ist, Ihre Funktion zu verwenden, um das div auszublenden. Fügen Sie bei dieser Aktion ein ausgeblendetes Feld für jeden Anhang hinzu, den Sie als Array mit der ID des Anhangs entfernen möchten.

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

und füge dann eine Funktion zum Entfernen dieser Dateien bei save_post hinzu:

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