WooCommerce 產品自動分類:根據商品創建日期動態管理“新品”標簽

WooCommerce 產品自動分類:根據商品創建日期動態管理“新品”標簽

本教程詳細介紹了如何在WooCommerce中實現產品自動分類功能,根據商品的創建日期將其動態地歸類到“新品”類別,并在指定天數(例如60天)后自動移除。文章將提供完整的php代碼示例,并指導如何將其集成到WordPress環境中,同時探討性能考量及最佳實踐,幫助您高效管理商品生命周期。

概述

在電子商務網站中,動態展示“新品”是吸引顧客、提升銷量的有效策略。然而,手動管理商品的“新品”狀態既耗時又容易出錯。本教程旨在提供一個自動化解決方案,通過編寫自定義php代碼,讓woocommerce能夠根據商品的創建日期自動將其添加到特定的“新品”分類,并在達到設定的時間限制后(例如60天)自動從該分類中移除。

實現原理

該功能的實現主要依賴于以下幾個核心步驟:

  1. 獲取所有產品: 遍歷WooCommerce中的所有產品。
  2. 計算產品年齡: 獲取每個產品的創建日期,并與當前日期進行比較,計算出產品發布至今的天數。
  3. 條件判斷與分類操作: 根據計算出的天數,判斷產品是否滿足“新品”條件。如果滿足,則將其添加到預設的“新品”分類;如果超過時間限制,則從該分類中移除。
  4. 集成到WordPress: 將上述邏輯封裝成一個函數,并掛載到WordPress的特定動作鉤子(init)上,確保在每次頁面加載時執行。

詳細實現步驟與代碼

以下是實現此功能的完整代碼和詳細說明。建議將此代碼添加到您當前活動主題的 functions.php 文件中,或者更好地,封裝到一個自定義插件中。

1. 獲取所有產品

首先,我們需要使用WP_Query來獲取WooCommerce中的所有產品。WP_Query是WordPress查詢文章(包括自定義文章類型如產品)的標準方式。

$args = array(     'post_type'      => 'product',      // 指定文章類型為產品     'posts_per_page' => -1              // 獲取所有產品,不限制數量 );  $products = new WP_Query( $args );  if ( $products->have_posts() ) {     while ( $products->have_posts() ) {         $products->the_post();         // 在這里處理每個產品     }     wp_reset_postdata(); // 恢復全局文章數據 }

2. 計算產品年齡

獲取產品創建日期并計算與當前日期的天數差是關鍵一步。WooCommerce提供了WC_Product對象,通過get_date_created()方法可以獲取產品的創建日期。為了準確計算,我們需要處理時區并確保日期對象的一致性。

$product  = wc_get_product( get_the_ID() ); // 獲取當前循環中的產品對象 $datetime = $product->get_date_created();   // 獲取產品創建日期 (WC_DateTime 對象)  if ( $datetime ) { // 確保日期對象存在     $timezone = $datetime->getTimezone(); // 獲取產品創建日期所在的時區     $now_time = new WC_DateTime();        // 創建當前時間的 WC_DateTime 對象      $now_time->setTimezone($timezone);    // 將當前時間對象設置為與產品創建日期相同的時區      // 計算時間戳差值(秒)     $timestamp_diff = $now_time->getTimestamp() - $datetime->getTimestamp();      // 將秒數差值轉換為天數     // 這里使用一個輔助函數 timestamp_to_array 來獲取天數     $data = timestamp_to_array( $timestamp_diff );     $days = (int)$data['d']; // 確保天數是整數類型 } else {     $days = 9999; // 如果沒有創建日期,則默認設置為一個大值,確保不被視為新品 }

這里我們引入了一個輔助函數 timestamp_to_array 來將秒數差值轉換為天、小時、分鐘和秒的數組。雖然我們只需要天數,但這個函數提供了一個完整的轉換示例。

/**  * 將時間戳差值轉換為天、小時、分鐘、秒的數組  *  * @param int $timestamp 時間戳差值(秒)  * @return array 包含 'd', 'h', 'm', 's' 的數組  */ function timestamp_to_array( $timestamp ) {     $d = floor($timestamp/86400);     $_d = ($d < 10 ? '0' : '').$d; // 格式化為兩位數字符串      $h = floor(($timestamp-$d*86400)/3600);     $_h = ($h < 10 ? '0' : '').$h;      $m = floor(($timestamp-($d*86400+$h*3600))/60);     $_m = ($m < 10 ? '0' : '').$m;      $s = $timestamp-($d*86400+$h*3600+$m*60);     $_s = ($s < 10 ? '0' : '').$s;      return array('d' => $_d, 'h' => $_h, 'm' => $_m, 's' => $_s); }

3. 應用/移除分類

根據計算出的天數,我們使用wp_set_object_terms和wp_remove_object_terms函數來管理產品的分類。

  • wp_set_object_terms( $object_id, $terms, $taxonomy, $append ): 用于設置或添加對象的分類術語。
    • $object_id: 產品ID。
    • $terms: 要添加的分類ID或分類名稱(這里使用分類ID 40)。
    • $taxonomy: 分類法名稱(產品分類是product_cat)。
    • $append: 如果為true,則將新術語添加到現有術語中;如果為false,則替換現有術語。這里我們設置為true以僅添加“新品”分類而不影響其他分類。
  • wp_remove_object_terms( $object_id, $terms, $taxonomy ): 用于移除對象的分類術語。
$new_in_category_id = 40; // 請替換為您的“新品”分類ID  if ( $days < 60 ) { // 如果天數小于60,則認為是新品     // 將產品添加到“新品”分類,并保留現有分類     wp_set_object_terms( get_the_ID(), $new_in_category_id, 'product_cat', true ); } else {     // 如果天數大于等于60,則從“新品”分類中移除     wp_remove_object_terms( get_the_ID(), $new_in_category_id, 'product_cat' ); }

如何找到您的“新品”分類ID:

  1. 登錄WordPress后臺。
  2. 導航到 產品 > 分類。
  3. 鼠標懸停在您想要作為“新品”的分類名稱上,瀏覽器左下角會顯示一個鏈接,其中包含 tag_ID= 參數,例如 …&tag_ID=40&…。這里的數字(例如40)就是該分類的ID。

4. 整合代碼并掛載到動作鉤子

將上述所有邏輯封裝在一個函數中,并將其掛載到WordPress的init動作鉤子上。init鉤子在WordPress核心加載完畢后、用戶請求被路由之前觸發,是執行此類全局操作的理想時機。

/**  * 根據產品創建日期自動設置/移除“新品”分類  */ function add_category_to_product_for_certain_days(){     $new_in_category_id = 40; // <-- 請將此ID替換為您的“新品”分類ID      $args = array(         'post_type'      => 'product',         'posts_per_page' => -1 // 獲取所有產品     );      $products = new WP_Query( $args );      if ( $products->have_posts() ) {         while ( $products->have_posts() ) {             $products->the_post();              $product  = wc_get_product( get_the_ID() );             $datetime = $product->get_date_created();              if ( $datetime ) {                 $timezone = $datetime->getTimezone();                 $now_time = new WC_DateTime();                 $now_time->setTimezone($timezone);                  $timestamp_diff = $now_time->getTimestamp() - $datetime->getTimestamp();                 $data           = timestamp_to_array( $timestamp_diff );                 $days           = (int)$data['d']; // 確保天數是整數             } else {                 $days = 9999; // 如果沒有創建日期,則設置為一個大值,確保不被視為新品             }              // 根據天數判斷并設置/移除分類             if ( $days < 60 ) { // 60天內視為新品                 wp_set_object_terms( get_the_ID(), $new_in_category_id, 'product_cat', true );             } else {                 wp_remove_object_terms( get_the_ID(), $new_in_category_id, 'product_cat' );             }         }         wp_reset_postdata(); // 恢復全局文章數據     } }  // 掛載函數到 'init' 動作鉤子 add_action( 'init', 'add_category_to_product_for_certain_days', 10, 0 );  /**  * 輔助函數:將時間戳差值轉換為天、小時、分鐘、秒的數組  * (此函數應與主函數放在同一文件中)  *  * @param int $timestamp 時間戳差值(秒)  * @return array 包含 'd', 'h', 'm', 's' 的數組  */ function timestamp_to_array( $timestamp ) {     $d = floor($timestamp/86400);     $_d = ($d < 10 ? '0' : '').$d;      $h = floor(($timestamp-($d*86400)/3600));     $_h = ($h < 10 ? '0' : '').$h;      $m = floor(($timestamp-($d*86400+$h*3600))/60);     $_m = ($m < 10 ? '0' : '').$m;      $s = $timestamp-($d*86400+$h*3600+$m*60);     $_s = ($s < 10 ? '0' : '').$s;      return array('d' => $_d, 'h' => $_h, 'm' => $_m, 's' => $_s); }

注意事項與最佳實踐

  1. 分類ID: 務必將代碼中的 40 替換為您實際的“新品”分類ID。
  2. 代碼位置: 建議將此代碼放置在子主題的 functions.php 文件中,以防止主題更新時代碼被覆蓋。對于更復雜的項目,可以考慮創建一個自定義插件。
  3. 性能考量:
    • 將此功能掛載到 init 鉤子上意味著每次頁面加載時都會執行此邏輯。對于擁有大量產品(例如數千個)的網站,這可能會導致顯著的性能開銷,增加頁面加載時間。
    • 優化建議: 對于大型商店,強烈建議使用WordPress的Cron Job(定時任務)來替代 init 鉤子。例如,可以設置一個每日或每小時運行的定時任務來執行此產品分類更新,而不是在每次用戶訪問時都執行。這樣可以顯著減輕服務器負載。
      • 要實現定時任務,您可以使用 wp_schedule_event() 和 wp_unschedule_event() 函數。
  4. 調試: 在生產環境中使用前,務必在開發或測試環境中充分測試此功能。
  5. 數據準確性: 確保您的產品創建日期數據是準確的,因為所有邏輯都基于此。

總結

通過上述代碼和步驟,您可以為WooCommerce商店實現一個高效的自動化“新品”分類管理系統。這不僅能節省手動操作的時間,還能確保“新品”展示的準確性和及時性,從而提升用戶體驗和銷售轉化率。在實施時,請務必根據您的商店規模和性能需求,選擇最合適的執行頻率和方式(例如 init 鉤子或定時任務)。

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享