web-dev-qa-db-fra.com

Supprimer les pièces jointes de Front end

J'essaie de créer un simple gestionnaire de médias au début de mes publications, car mon site aura de nombreux auteurs. Je veux leur donner la possibilité de supprimer toutes les images jointes qu’ils ont téléchargées dans leurs messages (sans avoir accès au gestionnaire de médias, car je veux que ce soit compatible avec les appareils mobiles).

De mes recherches en ligne, je suis arrivé avec le code suivant qui ne fonctionne pas. Il affiche la vignette avec la case à cocher demandant de supprimer l'image, mais lorsque j'appuie sur Soumettre, la page est rechargée et aucune modification n'est visible (la pièce jointe n'a pas été supprimée).

Pouvez-vous m'aider à faire fonctionner ça, s'il vous plaît?

 <?php
$user_id = get_current_user_id();
if ( $user_id == $EM_Event->event_owner ){
?> 
<?php
if (isset($_POST['submit'])) {
      $i = 1;
   while ($i < 13) {                
    if (isset($_POST['deleteimage'.$i])) {
        $value = $_POST['deleteimage'.$i];
        if ($value !== '') {
            wp_delete_attachment($value);
        }                       
    }               
$i++;
}
}

$args = array(
'order'          => 'ASC',
'orderby'        => 'menu_order',
'post_type'      => 'attachment',
'post_parent'    => $post->ID,
'post_mime_type' => 'image',
'post_status'    => null,
'numberposts'    => -1,
);              
$images = get_posts( $args );
$imagenum=0;
foreach($images as $image):
$imagenum++;

?>
            <div style="width:110px; float:left;">
    <?php echo wp_get_attachment_image($image->ID, 'thumbnail'); ?><br>
                <?php echo $image->ID; ?>
                <?php echo '<input type="checkbox" name="deleteimage'.$imagenum. '"        value="'.$image->ID.'" />Delete Image'; ?>
            </div>
       <?php endforeach; ?>
        <form><input type="submit" value="click submit" name="submit" />    </form>
  <?php } ?>
3
Adzay

Vous pouvez le faire via ajax, d'abord, changeons votre fonction actuelle en ceci:

<?php 

$args = array(
    'order'          => 'ASC',
            'orderby'        => 'menu_order',
            'post_type'      => 'attachment',
            'post_parent'    => $post->ID,
            'post_mime_type' => 'image',
            'post_status'    => null,
            'numberposts'    => -1,
    );          

$images = get_posts( $args );
$imagenum=0;
foreach($images as $image):
    $imagenum++;
?>

<div style="width:110px; float:left;">
<?php echo wp_get_attachment_image( $image->ID, $size = 'thumbnail', $icon = false, $attr = '' ); ?><br>
<?php echo '<input type="checkbox" id="selected" name="image'.$imagenum.'" value="'.$image->ID.'" />Delete Image'; ?>
</div>
<?php endforeach; ?>    
<input type="submit" id="submit" value="click submit" name="submit" />
<input type="hidden" value="" id="ids" />

Sous votre page, ou dans footer.php, ajoutez ceci:

<script>

jQuery('#submit').click(function() {

jQuery('#ids').val('');
var content = jQuery('body').find('#selected');

jQuery(content).each(function (i) {

    t = jQuery(this).val();

    if (jQuery(this).attr('checked')=='checked') { 
        jQuery('#ids').val(function(i,val){
        return val + t + ',';
        }); 
    };

});

var $ids = jQuery('#ids').val();

jQuery.ajax({
    type        : 'POST',
    url         : '<?php echo admin_url('admin-ajax.php'); ?>',
    data        : { action : 'front_delete', Delete: $ids, postID: <?php echo $post->ID; ?> },
    success     : function(response) {
        if (response = 'reload') { location.reload(); } else { alert(response); }
        }
    });  
});
</script>

Dans votre thème functions.php, collez ce code:

add_action('wp_ajax_nopriv_front_delete', 'front_delete');
add_action('wp_ajax_front_delete', 'front_delete');

function front_delete() {
    if (!isset($_REQUEST['postID']))
        echo 'Post ID not coming...';

    if (isset($_REQUEST['Delete'])) {

        $sel = explode(',', $_REQUEST['Delete']);
        foreach ($sel as $key) {
            if ($key != '' || $key != '0')
                wp_delete_attachment( $key );
            if (false === wp_delete_attachment( $key ))
                echo 'Image not deleted or error';
        } echo 'reload';
    } else { echo 'No ID coming from your function'; }
die();
}   

Si vous voulez le comprendre, je peux expliquer ... je ne sais pas si vous le voulez ... :)

3
Santoro

Chaque identifiant doit être unique. La case à cocher correspondant à votre image n'applique donc cet identifiant qu'à la première image. Pour que ce code fonctionne, il vous suffit de changer l'ID sélectionné pour une classe sélectionnée - cela signifie que le code est utilisé pour tous les éléments, pas un seul.

Dans le code, modifiez remove id = "selected" et remplacez par class = "selected"

Dans le script contenant la commande find, supprimez '#selected' et remplacez-le par '.selected'

0
David Proctosaurus