From 88e792ba7c035921a5ede3ae8bc6e6fc5230efd4 Mon Sep 17 00:00:00 2001 From: 3wc <3wc@doesthisthing.work> Date: Wed, 8 May 2024 17:15:27 -0300 Subject: [PATCH] Incorporate changes from snippet, and temporary plugin --- wp-content/themes/mont58-coffee/functions.php | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/wp-content/themes/mont58-coffee/functions.php b/wp-content/themes/mont58-coffee/functions.php index 76372fb..5f675e4 100644 --- a/wp-content/themes/mont58-coffee/functions.php +++ b/wp-content/themes/mont58-coffee/functions.php @@ -43,3 +43,157 @@ function eg_extend_subscription_period_intervals( $intervals ) { return $intervals; } add_filter( 'woocommerce_subscription_period_interval_strings', 'eg_extend_subscription_period_intervals' ); + +/** + * Snippet Name: Mont58 Coffee Label + * Description: Display labels for coffee shipping + * Version: 1.0.0 + * Author: Autonomic Co-op + * Author URI: https://autonomic.zone/ + * License: GPL2 +*/ + +function process_coffee_items($order, &$order_coffees, &$seen_subscriptions) { + // Iterate through all items in the order + foreach ($order->get_items() as $order_item) { + // Check if the item is a subscription (based on name containing "subscription") + if (stripos($order_item->get_name(), "subscription") !== false) { + // Get the coffee list associated with the subscription item + $coffee_list = get_field("coffee_list", $order_item->get_product_id()); + + // TODO log or display this error + if (!$coffee_list) { + continue; + } + + // Get the list of coffees from the coffee list + $coffees_in_list = get_field("coffees", $coffee_list); + // Get the quantity of this specific item in the order + $item_quantity = $order_item->get_quantity(); + + // Process each quantity of the subscription item + for ($x = 0; $x < $item_quantity; $x++) { + $coffee_list_id = $coffee_list->ID; + + // Check if this coffee list has been seen before in this order + if (array_key_exists($coffee_list_id, $seen_subscriptions)) { + // Increment the count of times this coffee list has been encountered + $seen_subscriptions[$coffee_list_id]++; + // Calculate the index to select a coffee from the list + $index = $seen_subscriptions[$coffee_list_id]; + $coffee = $coffees_in_list[$index % sizeof($coffees_in_list)]; + } else { + // If this coffee list is encountered for the first time in this order + $seen_subscriptions[$coffee_list_id] = 0; + // Select the last coffee from the list + $coffee = array_pop(array_reverse($coffees_in_list)); + } + + // Add the selected coffee with its associated coffee list to the order_coffees array + array_push($order_coffees, array("coffee_list" => $coffee_list, "coffee" => $coffee)); + } + } + } +} + +// Handle new order creation event +function action_woocommerce_new_order($order_id, $order) { + // Initialize arrays to store processed data + $order_coffees = array(); + $seen_subscriptions = array(); + + // Process coffee items in the new order + process_coffee_items($order, $order_coffees, $seen_subscriptions); + + // Update the custom field "coffees" with the processed coffee data for the order + update_field("coffees", $order_coffees, $order_id); +} +// Hook the above function to the 'woocommerce_new_order' action +add_action('woocommerce_new_order', 'action_woocommerce_new_order', 10, 2); + +// Handle renewal order creation event +function action_wcs_renewal_order_created($order, $subscription) { + // Retrieve related orders of the subscription excluding the current renewal order + $last_orders = wcs_get_subscription($subscription)->get_related_orders('ids', array('parent', 'renewal')); + unset($last_orders[$order->get_ID()]); + + // If there are previous orders related to the subscription + if (sizeof($last_orders) > 0) { + // Get the ID of the most recent previous order + $last_order_id = max($last_orders); + $last_order = wc_get_order($last_order_id); + // Get the processed coffees from the most recent previous order + $last_order_coffees = get_field("coffees", $last_order_id); + + // Initialize arrays to store processed data for the current order + $order_coffees = array(); + $seen_subscriptions = array(); + + // Get the latest coffee seen in each coffee list from the previous order + foreach(array_reverse($last_order_coffees) as $last_order_coffee) { + if (array_key_exists($last_order_coffee["coffee_list"]->ID, $seen_subscriptions)) { + continue; + } + $position_in_list = array_search( + $last_order_coffee["coffee"]->ID, + $last_order_coffee["coffee_list"]->coffees + ); + if (!$position_in_list) { + // ignore this, can't find it in list anymore + continue; + } + $seen_subscriptions[$last_order_coffee["coffee_list"]->ID] = $position_in_list; + } + + // Process coffee items based on the coffees in the last order + process_coffee_items($last_order, $order_coffees, $seen_subscriptions); + + // Update the custom field "coffees" with the processed coffee data for the current renewal order + update_field("coffees", $order_coffees, $order->get_ID()); + } +} +// Hook the above function to the 'wcs_renewal_order_created' action +add_action('wcs_renewal_order_created', 'action_wcs_renewal_order_created', 10, 2); + +// Add a sidepanel on WooCommerce order pages +add_action('add_meta_boxes', 'mont58_coffee_label_add_sidepanel'); + +function mont58_coffee_label_add_sidepanel() { + add_meta_box( + 'mont58_coffee_label_sidepanel', + 'Coffee Label', + 'mont58_coffee_label_render_sidepanel', + 'shop_order', + 'side', + 'high' + ); +} + +function mont58_coffee_label_render_sidepanel($post) { + // Render the content of the sidepanel here + $order_ids = array($post->ID); + echo 'View Label'; +} + +// Load custom template +function load_custom_template($template) { + if (is_page('coffee-label')) { + return plugin_dir_path(__FILE__) . 'template-order-label.php'; + } + + return $template; +} + +add_filter('template_include', 'load_custom_template'); + +add_filter('bulk_actions-edit-shop_order', function($bulk_actions) { + $bulk_actions['generate-label'] = __('Generate label', 'txtdomain'); + return $bulk_actions; +}); + +add_filter('handle_bulk_actions-edit-shop_order', function($redirect_url, $action, $post_ids) { + if ($action == 'generate-label') { + $redirect_url = add_query_arg('order_ids', $post_ids, "/coffee-label"); + } + return $redirect_url; +}, 10, 3);