一段时间后自动删除wordpress媒体的功能

问题描述 投票:1回答:1

我正在编写我认为是一系列简单的函数来为媒体分配“删除日期”,然后在访问网站时自动删除那些过期的媒体。

在上传图像时使用在线表格为图像设置删除日期的post_meta(使用强大的专业表格和“after_create_entry”挂钩。我可以确认元字段已成功创建,并且删除日期已正确分配(名为'mtp_deletiondate'。为了测试,我在自定义页面上做了一个wp_query,每个图像都有一个正确设置的删除日期。

接下来,我想运行一个检查过期图像的功能(设置为上传日期后21天),如果它们已过期,则删除它们。我想在每次访问管理员时触发此功能,因为我想我每个月至少会进入一次以运行更新,现在是清理旧图像的好时机。对于这种情况,我决定不做一个cron工作,因为我可以每月一次可靠地访问该网站。

问题是函数似乎没有触发,我不知道是因为函数被破坏还是因为我使用了错误的操作,或者两者兼而有之。一些研究告诉我使用admin_init,但我也试过“wp”和“wp-footer”。可能是因为我只是误解了这个过程。我的功能(在我的主题的functions.php中):

function drick_delete_expired_uploads() {
// WP_Query arguments
$args = array (
    'post_status'    => 'any',
    'post_type' => array( 'Attachment' ),
    'posts_per_page' => -1,
    'meta_query' => array(
        array(
            'key' => 'mtp_deletiondate',
        ),
    ),
);

// The Query
$mediaquery = new WP_Query( $args );

// The Loop
if ( $mediaquery->have_posts() ) {
    while ( $mediaquery->have_posts() ) {
        $mediaquery->the_post();
        date_default_timezone_set('America/Denver');
        $CurrentDate = date('Y-m-d h:i');
        $CurrentDateStr = strtotime($CurrentDate);
        $DeletionDate = get_post_meta( $post->ID, 'mtp_deletiondate', true );
        $DeletionDateStr = strtotime($DeletionDate);
        if ( isset($DeletionDateStr) ) {
            if ( $DeletionDateStr < $CurrentDateStr ) { 
                wp_delete_attachment( $post->ID, true );
            }
        }
    }
} else {
    // no posts found
} // IF HAVE POSTS 

// Restore original Post Data
wp_reset_postdata();
}
add_action('admin_init', 'drick_delete_expired_uploads');

如果我保存我的functions.php,然后重新加载Wordpress仪表板,然后检查我的媒体,过期的图像仍然存在。但是,如果我将此功能添加到实际页面然后访问该页面,它确实有效。所以我相信这个功能正在做它应该做的事情,它只是没有被正确触发?我还在我的functions.php中为函数添加了一个快速的wp_mail(),当我访问管理员时它确实触发了电子邮件,所以我猜这个函数正在激活。

我很感激任何见解,谢谢!

php wordpress function
1个回答
0
投票

所以我想我想出来了,但我不知道我有解释为什么它有效。基本上它看起来像wp_delete_attachment不起作用,但wp_delete_post起作用。我已经测试并确认了三个额外的图像,当访问管理仪表板时会触发功能自动删除。我还通过仅查询过期的图像来改变查询参数的构造方式,而不是查询具有mtp_deletiondate元的所有图像,然后在查询中运行条件语句。不知道那是否相关。最终的工作职能:

function drick_delete_expired_uploads() {
// WP_Query arguments
date_default_timezone_set('America/Denver');
$CurrentDate = date('Y-m-d h:i');
$args = array (
    'post_status'    => 'any',
    'post_type' => array( 'Attachment' ),
    'posts_per_page' => -1,
    'meta_query' => array(
        array(
            'key' => 'mtp_deletiondate',
            'value' => $CurrentDate,
            'compare' => '<',
            'type' => 'DATE',
        ),
    ),
);

// The Query
$mediaquery = new WP_Query( $args );

// The Loop
if ( $mediaquery->have_posts() ) {
    while ( $mediaquery->have_posts() ) {
        $mediaquery->the_post();
        wp_delete_post(get_the_ID());
    }
} else {
    // no posts found
} // IF HAVE POSTS 

// Restore original Post Data
wp_reset_postdata();
}
add_action('admin_init', 'drick_delete_expired_uploads');

仍然期待知情人士的任何反馈,可以告诉我为什么以前的版本不起作用(在这里学习)。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.