如何在删除帖子时从上传目录中删除自定义文件

时间:2019-12-05 作者:Mayeenul Islam

我正在将上载的附件存储到自定义目录下wp-content/uploads/my-directory/ 并将其价值存储在wp_postmeta 桌子当我删除帖子时,并不是从路径中删除附加文件。

所以我试着抓住delete_post 钩子从文件路径中删除文件:

<?php
/**
 * Delete Custom Attachment when deleting its post.
 *
 * @param integer $post_id Post ID.
 * 
 * @return void
 */
function wpse353942_delete_attachment( $post_id ) {
    if ( \'my-cpt\' !== get_post_type( $post_id ) ) {
        return;
    }

    $attachment = get_post_meta( $post_id, \'_attachment\', true ); // get the attachment URL.
    if ( ! $attachment ) {
        return;
    }

    $upload_dir = wp_get_upload_dir();
    unlink( $upload_dir[\'basedir\'] . \'/my-directory/\' . basename( $attachment ) );
}

add_action( \'delete_post\', \'wpse353942_delete_attachment\' );
但遗憾的是,这并不是从目录中删除文件(

我能做什么?

1 个回复
最合适的回答,由SO网友:Mayeenul Islam 整理而成

如果您看到wp_delete_post() 函数,您可以看到,该函数是在删除帖子本身之前删除帖子的元数据-上面的一行带有delete_metadata_by_mid().

因此,在您的函数中,当您尝试获取附件URL时,它已经从数据库中删除,因此它变为空,函数将不执行任何操作返回。

因此,最好的方法是挂接之前的一个,而不是delete_post - 您可以使用:thebefore_delete_post 钩子具有相同的功能,应该可以工作。

只需更改:

add_action( \'delete_post\', \'wpse353942_delete_attachment\' );
进入

add_action( \'before_delete_post\', \'wpse353942_delete_attachment\' );
参考文献:
  1. Action Hook: delete_post - 开发商参考Function: wp_delete_post() - 开发商参考Function: delete_metadata_by_mid() - 开发商参考Action Hook: before_delete_post - 开发人员参考

相关推荐

Delete all user attachments

在buddypress中,当用户想要删除自己的帐户-->时,是否可以删除使用媒体上载的所有附件条目和图像?注意:图片不附在帖子上,因为im不允许用户创建普通帖子,他们只能使用媒体上传图片。提前谢谢。