2017-10-04 108 views
0

我正在使用自定義帖子類型在我的網站上顯示事件。 該事件有兩個自定義字段的開始和結束日期。日期以以下格式存儲: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

回答

0

我找到了解決辦法

這裏是我的代碼:

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

1

您所提供的鏈接顯示你如何做到這一點,你只需要改變一些在回答中的信息來得到它的工作。

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

請執行下列操作步驟:

  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

相關問題