Пользовательский каталог загрузки на CPT; при удалении файл не удаляется

У меня есть этот код в functions.php, который организует загрузку мультимедиа в соответствии со своим настраиваемым типом сообщения (CPT).

Таким образом, все изображения, загруженные в CPT продукта, будут находиться внутри каталога wp-content/uploads/product.

add_filter("upload_dir", function ($args) {
  $id = (isset($_REQUEST["post_id"]) ? $_REQUEST["post_id"] : "");

  if($id) {
    $newdir = "/" . get_post_type($id);

    // remove default dir
    $args["path"] = str_replace( $args["subdir"], "", $args["path"]);
    $args["url"] = str_replace( $args["subdir"], "", $args["url"]);

    // assign new dir
    $args["subdir"] = $newdir;
    $args["path"] .= $newdir; 
    $args["url"] .= $newdir;

    return $args;
  }
});

Это хорошо работает, за исключением случаев, когда я удаляю носитель, файл все еще существует (запись в базе данных удалена просто отлично).

Я решил, что мне нужно фильтровать удаление файлов , но не может найти правильный путь. Кто-нибудь успешно установил это?

Спасибо

ИЗМЕНИТЬ

Я попытался добавить условное использование папки по умолчанию, когда тип сообщения post.

if(get_post_type($id) === "post") {
  return $args;
} else {
  ...
}

Удаление носителя Post также не удалит файл.

5 голосов | спросил hrsetyono 29 +03002015-10-29T07:32:04+03:00312015bEurope/MoscowThu, 29 Oct 2015 07:32:04 +0300 2015, 07:32:04

1 ответ


1

В нашем плагине мы недавно кое-что сделали. Вот как мы обрабатываем удаление файлов только при удалении одного из наших сообщений.

/**
 * Удалите все прикрепленные носители, когда продукт удален.
 * /
function product_delete_attached_media ($ post_id) {

    //Если это не продукт, который удаляется, мы не хотим ничего делать
    if ('product'! = get_post_type ($ post_id))
        вернуть;

    //Настройка аргументов для пользовательского запроса
    $ args = array (
        'post_type' => 'attachment', //Мы хотим вложения ...
        'posts_per_page' => -1, //... все из них ...
        'post_status' => «any», //... независимо от того, публично, в корзине и т. д. ...
        'post_parent' => $ post_id //..., являющийся дочерним элементом этого продукта, удаляемого здесь!
    );

    //Делаем пользовательский запрос с этими аргументами для получения этих вложений
    $ attachments = новый WP_Query ($ args);

    //Прокручиваем каждый из них и удаляем их
    foreach ($ attachments-> сообщения как $ attachment) {
        if (false === wp_delete_attachment ($ attachment-> ID, true)) {
            //Здесь вы можете выводить или записывать что-то, если что-то пошло не так
        }
    }
}

//Мы добавляем эту функцию в ссылку «before_delete_post»
//который выполняется перед каждым удалением сообщения
add_action ('before_delete_post', 'product_delete_attached_media');

Комментарии должны объяснить, что происходит довольно хорошо. Функция wp_delete_attachment () выполняет удаление файлов мультимедиа и должна успешно удалять файлы, а также записи в базе данных.

Единственное, что нам нужно было сделать, это удалить всю структуру пользовательских папок, если наш плагин будет удален.

Кроме того, я уверен, что WP_Query может быть оптимизирован, поскольку он может стать медленным, если у вас много сообщений и изображений.

Надеюсь, что это поможет.

ответил Claudio Rimann 4 32015vEurope/Moscow11bEurope/MoscowWed, 04 Nov 2015 22:01:33 +0300 2015, 22:01:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132