Удалить связанные медиа при удалении страницы

9

Запись

Используйте на свой страх и риск, он глючит, и я столкнулся с парой случаев, когда он удалял ВСЕ вложения. Не уверен почему.

Можно ли удалить носитель, связанный со страницей, при удалении этой страницы? Я знаю, что на странице «Вставка мультимедиа» вы можете фильтровать по изображениям «Загружено на эту страницу», так что я могу получить их список и просто удалить их по мере удаления страницы?

Прямо сейчас я играю с подключением к удалению сообщения. Прямо сейчас ... это ничего не делает, но я думаю, что у меня что-то получится.

function del_post_media($pid) {
    $query = "DELETE FROM wp_postmeta
            WHERE ".$pid." IN
            (
            SELECT id
            FROM wp_posts
            WHERE post_type = 'attachment'
            )";
    global $wpdb;
    if ($wpdb->get_var($wpdb->prepare($query))) {
        return $wpdb->query($wpdb->prepare($query));
    }
    return true;
}
add_action('delete_post', 'del_post_media');
Howdy_McGee
источник
1
Будьте осторожны при удалении ссылок на средства массовой информации, которые используются в других местах, например, на другие публикации или если ваша публикация была опубликована в социальных сетях.
Гилберт
Хорошо, если я заставлю пользователя загрузить одно и то же изображение дважды (если ему нужно одно и то же изображение для 2 разных страниц), оно переименует одно из изображений, так что все должно быть в порядке.
Howdy_McGee

Ответы:

8

Как насчет этого? Он адаптирует пример на справочной странице функции get_posts () .

function delete_post_media( $post_id ) {

    $attachments = get_posts( array(
        'post_type'      => 'attachment',
        'posts_per_page' => -1,
        'post_status'    => 'any',
        'post_parent'    => $post_id
    ) );

    foreach ( $attachments as $attachment ) {
        if ( false === wp_delete_attachment( $attachment->ID ) ) {
            // Log failure to delete attachment.
        }
    }
}

add_action( 'before_delete_post', 'delete_post_media' );
Чарльз Кларксон
источник
1
Не работал для меня Создан пост, прикреплено 1 изображение, мусор пост, пустая корзина. Изображение все еще там в медиа-библиотеке. РЕДАКТИРОВАТЬ: О, это пропускает часть add_action
Майкл Роджерс
8

Я полагаю, вы ищете что-то вроде этого ...?

function delete_associated_media($id) {
    // check if page
    if ('page' !== get_post_type($id)) return;

    $media = get_children(array(
        'post_parent' => $id,
        'post_type' => 'attachment'
    ));
    if (empty($media)) return;

    foreach ($media as $file) {
        // pick what you want to do
        wp_delete_attachment($file->ID);
        unlink(get_attached_file($file->ID));
    }
}
add_action('before_delete_post', 'delete_associated_media');
tfrommen
источник
Ничего не делает для меня Удаление результатов публикации на неприкрепленном носителе, как обычно, не приводит к его удалению.
Майкл Роджерс
Если вы не адаптировали код, он предназначен только для страниц. Вы видели это, верно, @MichaelRogers?
17
Понял извини тогда!
Майкл Роджерс