WordPress:使用自定义字段的日期来删除帖子

WordPress:使用自定义字段的日期来删除帖子

问题描述:

我正在使用自定义帖子类型在我的网站上显示事件。 该事件有两个自定义字段的开始和结束日期。日期以以下格式存储:YYYY-MM-DD。WordPress:使用自定义字段的日期来删除帖子

我正在使用该字段对前端中的事件进行排序,我将根据当前日期从下一个事件开始。

在此日期之后,事件不再显示在前端,因为它们位于过去。

现在我想删除结束日期后的事件。 有没有办法做到这一点?

我发现从@彼得 - 古森一个很好的解决方案的天数后删帖:https://wordpress.stackexchange.com/questions/209046/delete-expired-posts-after-a-number-of-days-after-they-expired

但我不知道如何使用此功能和元场。

任何想法/提示?

我的代码:

function expirePastEvents() { 

    $current_date_query = date ('Y-m-d'); 

    $postType = 'event'; // Change this to your post type name. 
    $metaKeyName = 'gid_22'; // Change this to your meta key name for end date. 
    $skipTrash = false; // Whether or not to skip the trash. 

    $posts = new WP_Query([ 
     'post_type' => $postType, 
     'fields' => 'ids', 
     'post_status' => 'publish', 
     'meta_query' => [ 
      [ 
       'key' => $metaKeyName, 
       //'value' => current_time('timestamp'), 
       'value' => $current_date_query, 
       'compare' => '<=' 
      ] 
     ] 
    ]); 

    foreach ($posts->posts as $post) { 
     wp_delete_post($post->ID, $skipTrash); 
    } 
} 



// expired_post_delete hook fires when the Cron is executed 
add_action('expired_post_delete', 'expirePastEvents'); 


// Add function to register event to wp 
add_action('wp', 'register_daily_events_delete_event'); 
function register_daily_events_delete_event() { 
    // Make sure this event hasn't been scheduled 
    if(!wp_next_scheduled('expired_post_delete')) { 
     // Schedule the event 
     wp_schedule_event(time(), 'hourly', 'expired_post_delete'); 
    } 
} 
+0

你可以简单地创建一个cronjob来为你做。 –

+0

是的,但我没有这个功能,只能删除在元字段中具有特定日期的帖子:( – Cray

+0

您提供的链接实际上向您显示*完全*如何在元字段中执行此操作... – naththedeveloper

我找到了解决办法

这里是我的代码:

function get_delete_old_events() { 

    $past_query = date('Y-m-d', strtotime('-1 day')); 

    // Set our query arguments 
    $args = [ 
     'fields'   => 'ids', // Only get post ID's to improve performance 
     'post_type'  => 'event', // Post type 
     'posts_per_page' => -1, 
     'meta_query'  => [ 
      [ 
       'key'  => 'gid_22', // Replace this with the event end date meta key. 
       'value' => $past_query, 
       'compare' => '<=' 
      ] 
     ] 
     ]; 
    $q = get_posts($args); 

    // Check if we have posts to delete, if not, return false 
    if (!$q) 
     return false; 

    // OK, we have posts to delete, lets delete them 
    foreach ($q as $id) 
     wp_trash_post($id); 
} 

// expired_post_delete hook fires when the Cron is executed 
add_action('old_event_delete', 'get_delete_old_events'); 

// Add function to register event to wp 
add_action('wp', 'register_daily_events_delete_event'); 

function register_daily_events_delete_event() { 
    // Make sure this event hasn't been scheduled 
    if(!wp_next_scheduled('old_event_delete')) { 
     // Schedule the event 
     wp_schedule_event(time(), 'hourly', 'old_event_delete'); 
    } 
} 

我已经改变了说法wp_delete_post()wp_trash_post()因为wp_delete_post()仅适用于本地的帖子,网页和附件。来自@rarst的很好的回答:https://wordpress.stackexchange.com/questions/281877/error-after-deleting-custom-post-type-with-a-function-no-trash-used/281888#281888

您所提供的链接显示你如何做到这一点,你只需要改变一些在回答中的信息来得到它的工作。

function expirePastEvents() { 
    $postType = 'events'; // Change this to your post type name. 
    $metaKeyName = 'end_date'; // Change this to your meta key name for end date. 
    $skipTrash = false; // Whether or not to skip the trash. 

    $posts = new WP_Query([ 
     'post_type' => $postType, 
     'fields' => 'ids', 
     'post_status' => 'publish', 
     'meta_query' => [ 
      [ 
       'key' => $metaKeyName, 
       'value' => current_time('timestamp'), 
       'compare' => '<=' 
      ] 
     ] 
    ]); 

    foreach ($posts->posts as $post) { 
     wp_delete_post($post->ID, $skipTrash); 
    } 
} 
+0

对不起,我已经尽了我最好的但它不工作我已经将我的代码添加到我的问题有什么不对吗 – Cray

请执行下列操作步骤:

  1. 安装WP Control插件。
  2. 激活插件。
  3. 导航到wp-admin/tools.php?page = crontrol_admin_manage_page,然后在Add Cron Event部分中,在下面的Hook Name选项卡中添加'my_daily_event_delete'。
  4. 保存活动。

    将下面的代码添加到您的functions.php文件中。

    add_action('my_daily_event_delete', '_delete_this_daily'); 
    
    function _delete_this_daily() { 
        $past = strtotime("- 1 day"); 
        // Set our query arguments 
        $args = [ 
        'fields'   => 'ids', // Only get post ID's to improve performance 
        'post_type'  => 'event', // Post type 
        'posts_per_page' => -1, 
        'meta_query'  => [ 
         [ 
          'key'  => 'event_end_date', // Replace this with the event end date meta key. 
          'value' => $past, 
          'compare' => '<=' 
         ] 
        ] 
        ]; 
        $q = get_posts($args); 
    
        // Check if we have posts to delete, if not, return false 
        if (!$q) { 
        return false; 
        } 
        // OK, we have posts to delete, lets delete them 
        foreach ($q as $id){ 
         wp_delete_post($id); 
        } 
    } 
    
+0

对不起,我已经尽力了,但它不起作用。字段作为元键,但如果我手动运行cron,则不会有任何反应。 – Cray