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

时间:2018-03-06 18:22:39

标签: php wordpress function

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

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

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

问题是功能似乎没有触发,我不知道它是否因为功能被破坏或因为我使用了错误的动作,或者都。一些研究告诉我使用admin_init,但我也尝试过" wp"和" wp-footer"。可能是因为我误解了这个过程。我的功能(在我的主题&function; .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(),当我访问管理员时它确实触发了电子邮件,所以我猜这个函数正在激活。

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

1 个答案:

答案 0 :(得分: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');

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