Cómo eliminar archivos adjuntos de publicaciones cuando jQuery se usa con un evento de clic en el enlace de eliminación

2

Creo que estoy en el camino correcto con lo que tengo que hacer, al menos para hacer una de las formas en que podría hacerse. Sin embargo, no estoy muy seguro, podría estar muy lejos de lo que sé.

Esto es parte del código con el que necesité ayuda anoche para cambiar el tamaño de los archivos de imagen cargados, pero ahora estoy tratando de averiguar cómo usar la función wp_delete_attachment ($ id) para eliminar las imágenes adjuntas a las publicaciones.

Entonces, tengo este script jQuery que agrega / elimina campos adicionales, para cargar más imágenes para adjuntar. Por cada imagen agregada hay un enlace para eliminarlos. Al hacer clic en eliminar solo se eliminó el div que contenía el enlace y, al guardar la publicación, el archivo adjunto se mostrará como si estuviera adjunto.

En mi controlador de eventos de clic para el enlace de eliminación, primero necesito ejecutar la función que llamará a wp_delete_attachment (), para eliminar permanentemente el archivo / archivo adjunto, ENTONCES puedo usar jQuery para eliminar la división de ese archivo adjunto de la página . De esa forma, al guardar la publicación, se habrá eliminado y no volverá a aparecer.

Aquí están mis funciones con las que he estado tratando de trabajar:

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

Y el controlador de clic que llama a esta función y luego elimina el elemento div que contiene de la página es:

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

El código para agregar campos adicionales se encuentra entre estas dos partes, pero estas son las piezas clave para lo que necesito ayuda. Actualmente, la forma en que lo tengo codificado aquí aparece este mensaje de error. Idk wtf esto significa exactamente aunque 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"]

Aquí está el código completo que estoy usando, exactamente. enlace Solo intento pasar información a / desde jQuery y Php y eso siempre es un dolor en el culo, (para mí).

    
pregunta jaredwilli 31.01.2011 - 00:30

2 respuestas

3

¡Finalmente he descubierto cómo hacerlo, y ahora funciona al 100%!

Además, utiliza admin-ajax.php, por lo que al hacer clic en el enlace Eliminar, se envía una solicitud ajax a la función que elimina el archivo adjunto y devuelve el mensaje diciendo que se ha eliminado.

Aquí está el código para mi solución, primero es el html para el 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' ); ?>" />

Aquí está la función 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();
}

Y el script jQuery que envía el ID y la acción del archivo adjunto, etc., luego elimina el div del DOM después de recibir la respuesta ajax:

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

Ahora puedo finalmente completar lo que pensé que era totalmente imposible después de la cantidad de intentos que hice para intentar hacerlo y que han fallado cada vez.

Pronto se convertirá en un complemento, que luego puedo usar en cualquier sitio fácilmente, con opciones simples para definir el tipo de publicación para agregarlo.

    
respondido por el jaredwilli 01.02.2011 - 04:10
2

Parece que está intentando llamar a la función de WordPress directamente desde JQuery para que no funcione. lo que puede hacer es utilizar su función para ocultar el div, pero en esa acción agregue un campo oculto para cada archivo adjunto que desee eliminar como una matriz con el ID del archivo adjunto algo como:

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

y luego agregue una función para eliminar estos archivos en save_post hook algo como esto:

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');
    
respondido por el Bainternet 31.01.2011 - 08:14

Lea otras preguntas en las etiquetas