我正在编写我认为是一系列简单函数来分配"删除日期"到媒体,然后在访问该网站时自动删除那些过期的媒体。
当上传图像时,通过在线表格为图像设置删除日期的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(),当我访问管理员时它确实触发了电子邮件,所以我猜这个函数正在激活。
我很感激任何见解,谢谢!
答案 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');
仍然期待知情人士的任何反馈,可以告诉我为什么以前的版本没有工作(想在这里学习)。谢谢!