【问题标题】:Function to auto-delete wordpress media after period of time一段时间后自动删除wordpress媒体的功能
【发布时间】: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(),当我访问管理员时它确实触发了电子邮件,所以我猜这个函数正在触发。

如果有任何见解,我将不胜感激,谢谢!

【问题讨论】:

    标签: php wordpress function


    【解决方案1】:

    所以我想我明白了,但我不知道我对它为什么起作用有一个解释。从本质上讲,它看起来 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');
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 2020-03-02
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多