Видалити пов'язані медіа після видалення сторінки


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

1
Будьте уважні до видалення посилань на засоби масової інформації, які використовуються в інших місцях, наприклад, інших публікаціях або якщо ваша публікація була надана в соціальних мережах.
Гілберт

Добре, якщо я змушую користувача завантажувати одне і те ж зображення двічі (якщо вони хочуть однакового зображення для двох різних сторінок), воно перейменовано одне із зображень, тож воно повинно бути добре.
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 зображення, пошкоджений пост, порожній смітник. Зображення все ще є в медіатеці. EDIT: О, це не вистачає додаючої частини
Майкл Роджерс

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

Нічого не робить для мене. Видалення результатів публікації на неприєднаному носії, як зазвичай, не видаляє.
Майкл Роджерс

Якщо ви не адаптували код, це лише для сторінок. Ви це бачили, правда, @MichaelRogers?
tfrommen

Тобі шкода!
Майкл Роджерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.