优化WordPress:实现高效清空回收站同时自动删除关联附件

在WordPress中删除文章时,默认情况下,文章的正文内容会被移至回收站(如果未永久删除),但是与文章关联的媒体文件(如图片、PDF等附件)并不会自动删除。这些附件会继续保留在媒体库中,这意味着它们仍然可以被重新使用或手动删除。

如果你确实想要删除与某篇文章相关的所有附件,开发一个WordPress插件来实现在删除文章时自动删除关联附件的功能是一个不错的主意。下面我将提供一个简单的指南,帮助你创建这个插件。

步骤 1: 创建插件文件

首先,在你的WordPress安装目录下的 wp-content/plugins/ 文件夹中创建一个新的文件夹,例如命名为 delete-post-attachments。然后,在该文件夹内创建一个PHP文件,比如命名为 delete-post-attachments.php

步骤 2: 编写插件头部信息

打开 delete-post-attachments.php 文件,并在顶部添加插件的头部信息:

<?php
/*
Plugin Name: Delete Post Attachments
Description: Automatically delete all attachments when a post is deleted.
Version: 1.0
Author: Your Name
*/

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}

步骤 3: 添加钩子和功能

接下来,你需要使用WordPress提供的钩子来监听清空回收站的动作,并执行删除相关附件的逻辑。当你清空文章回收站时,WordPress实际上会批量处理这些文章的删除操作。在同一个文件中继续编写以下代码:

function dp_delete_posts_attachments_on_empty_trash() {
    global $wpdb;

    // 获取回收站中所有文章的ID
    $posts_in_trash = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_status = 'trash'");

    if (!empty($posts_in_trash)) {
        // 根据文章ID查找所有关联的附件
        $attachments = get_posts(array(
            'post_parent__in' => $posts_in_trash,
            'post_type'       => 'attachment',
            'numberposts'     => -1,
            'post_status'     => 'any'
        ));

        // 删除找到的所有附件
        foreach ($attachments as $attachment) {
            wp_delete_attachment($attachment->ID, true);
        }
    }
}

// 在清空回收站前触发
add_action('load-edit.php', function() {
    if (isset($_GET['post_status']) && $_GET['post_status'] == 'trash' && isset($_REQUEST['delete_all'])) {
        dp_delete_posts_attachments_on_empty_trash();
    }
});

在开始清空回收站之前一次性获取所有待删除文章的ID,然后根据这些ID一次性获取所有相关的附件,并一次性删除它们。

+1

发表回复