/**
  * Sync WooCommerce categories to Square.
  *
  * Looks for category names that don't exist in Square, and creates them.
  */
 public function sync_categories()
 {
     $wc_category_objects = $this->connect->wc->get_product_categories();
     $wc_categories = array();
     if (is_wp_error($wc_category_objects) || empty($wc_category_objects['product_categories'])) {
         return;
     }
     foreach ($wc_category_objects['product_categories'] as $wc_category) {
         if (empty($wc_category['name']) || empty($wc_category['id']) || $wc_category['parent'] !== 0) {
             continue;
         }
         $wc_categories[$wc_category['name']] = $wc_category['id'];
     }
     $square_category_objects = $this->connect->get_square_categories();
     $square_categories = array();
     $processed_categories = array();
     foreach ($square_category_objects as $square_category) {
         // Square list endpoints may return dups so we need to check for that
         if (in_array($square_category->id, $processed_categories)) {
             continue;
         }
         if (is_object($square_category) && !empty($square_category->name) && !empty($square_category->id)) {
             $square_categories[$square_category->name] = $square_category->id;
             $processed_categories[] = $square_category->id;
         }
     }
     foreach ($wc_categories as $wc_cat_name => $wc_cat_id) {
         $square_cat_id = WC_Square_Utils::get_wc_term_square_id($wc_cat_id);
         if ($square_cat_id && ($square_cat_name = array_search($square_cat_id, $square_categories))) {
             // Update a known Square Category whose name has changed in WC.
             if ($wc_cat_name !== $square_cat_name) {
                 $this->connect->update_square_category($square_cat_id, $wc_cat_name);
             }
         } elseif (isset($square_categories[$wc_cat_name])) {
             // Store the Square Category ID on a WC term that matches.
             $square_category_id = $square_categories[$wc_cat_name];
             WC_Square_Utils::update_wc_term_square_id($wc_cat_id, $square_category_id);
         } else {
             // Create a new Square Category for a WC term that doesn't yet exist.
             $response = $this->connect->create_square_category($wc_cat_name);
             if (!empty($response->id)) {
                 $square_category_id = $response->id;
                 WC_Square_Utils::update_wc_term_square_id($wc_cat_id, $square_category_id);
             }
         }
     }
 }