Программно удалять по одному файлу за раз в WordPress

#php #wordpress

#php #wordpress

Вопрос:

Я создаю пользовательский загрузчик файлов WordPress в своей пользовательской теме, и теперь мне нужно иметь возможность удалять каждый файл при нажатии кнопки. У меня есть это до сих пор:

  <?php

    $attachments = get_posts(
        array(
            'post_type' => 'attachment',
                        'numberposts' => -1,
                        'post_status' => null,
        )
    );
    foreach ( $attachments as $attachment ) {
     
       
                            $file_link = wp_get_attachment_url($attachment->ID, "full");
                            $file_img = wp_get_attachment_image($attachment->ID);
    
                            $file_title = get_the_title($attachment->ID);
                            $size_media = filesize(get_attached_file($attachment->ID));
    
                            $total_size = ($size_media) / 1000;
    
    
                        ?>

                                <div>
    
                                    <a href="http:<?php echo $file_link; ?>" target="_blank">
                                        <div>
                                            <?php if (strpos($file_link, '.png') !== false || strpos($file_link, '.jpg') !== false || strpos($file_link, '.gif') !== false || strpos($file_link, '.tif') !== false ) {
                                                echo '<span class="material-icons">insert_photo</span>';
                                            } else {
                                                echo '<span class="material-icons">description</span>';
                                            }
                                            ?>
                                        </div>
                                    </a>
                                </div>
                                <div>
                                    <a href="http:<?php echo wp_get_attachment_url($attachment->ID, "full");  ?>" target="_blank">
                                        <p><?php echo $file_title; ?></p>
                                    </a>
                                    <p>Size: <?php echo $total_size; ?>KB</p>
                                    <a href="<?php wp_delete_attachment( $attachment->ID ); ?>">Delete</a>
                                </div>

                        <?php } ?>
    
    
    }
  

Происходит то, что при нажатии на ссылку удаления ВСЕ файлы удаляются. Я этого не хочу. Мне нужен только один файл, в котором была нажата ссылка, для удаления.

Ответ №1:

Вы делаете неверное предположение о php-функциях, включенных в html. Что делает php, так это выводит некоторый html. В вашем случае то, что вы делаете, это:

 <a href="<?php wp_delete_attachment( $attachment->ID ); ?>">Delete</a>
  

Это говорит WordPress немедленно удалить вложение. Затем он ничего не возвращает, поэтому ваш html будет выглядеть так:

 <a href="">Delete</a>
  

Что вам нужно, так это функция javascript, которая выполняет ajax-запрос, чтобы сообщить серверному php удалить определенное вложение. Вы можете вызвать это в html:

 <a href="deleteFile(<?php echo $attachment->ID ?>);">Delete</a>
  

Это приведет к следующему html:

 <a onclick="deleteFile(30);">Delete</a>
  

Теперь вы можете пойти и написать вызываемую функцию javascript deleteFile , которая принимает идентификатор вложения в качестве аргумента. Он должен отправить идентификатор на сервер и вызвать wp_delete_attachment( $_GET['id'] ) .