【发布时间】:2018-03-06 18:22:39
【问题描述】:
我正在编写我认为是一系列简单的函数来为媒体分配“删除日期”,然后在访问网站时自动删除那些过期的媒体。
删除日期的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(),当我访问管理员时它确实触发了电子邮件,所以我猜这个函数正在触发。
如果有任何见解,我将不胜感激,谢谢!
【问题讨论】: