<?php /** * Product Functions * * @package WP_Ultimo\Functions * @since 2.0.0 */ // Exit if accessed directly defined('ABSPATH') || exit; use \WP_Ultimo\Models\Product; /** * Returns a product. * * @since 2.0.0 * * @param null|int|string $product_id_or_slug The ID or slug of the product. * @return Product|false */ function wu_get_product($product_id_or_slug) { if (is_numeric($product_id_or_slug) === false) { return wu_get_product_by_slug($product_id_or_slug); } // end if; return Product::get_by_id($product_id_or_slug); } // end wu_get_product; /** * Queries products. * * @since 2.0.0 * * @param array $query Query arguments. * @return Product[] */ function wu_get_products($query = array()) { return Product::query($query); } // end wu_get_products; /** * Queries plans. * * @since 2.0.0 * * @param array $query Query arguments. * @return Product[] */ function wu_get_plans($query = array()) { $query['type'] = 'plan'; /* * Fixes the order. */ $query['order'] = 'ASC'; $query['orderby'] = 'list_order'; return Product::query($query); } // end wu_get_plans; /** * Returns the list of plans as ID -> Name. * * @since 2.0.0 * @return array */ function wu_get_plans_as_options() { $options = array(); foreach (wu_get_plans() as $plan) { $options[$plan->get_id()] = $plan->get_name(); } // end foreach; return $options; } // end wu_get_plans_as_options; /** * Returns a product based on slug. * * @since 2.0.0 * * @param string $product_slug The slug of the product. * @return Product|false */ function wu_get_product_by_slug($product_slug) { return Product::get_by('slug', $product_slug); } // end wu_get_product_by_slug; /** * Returns a single product defined by a particular column and value. * * @since 2.0.0 * * @param string $column The column name. * @param mixed $value The column value. * @return \WP_Ultimo\Models\Product|false */ function wu_get_product_by($column, $value) { return Product::get_by($column, $value); } // end wu_get_product_by; /** * Creates a new product. * * @since 2.0.0 * * @param array $product_data Product data. * @return Product|\WP_Error */ function wu_create_product($product_data) { $product_data = wp_parse_args($product_data, array( 'name' => false, 'description' => false, 'currency' => false, 'pricing_type' => false, 'setup_fee' => false, 'parent_id' => 0, 'slug' => false, 'recurring' => false, 'trial_duration' => 0, 'trial_duration_unit' => 'day', 'duration' => 1, 'duration_unit' => 'day', 'amount' => false, 'billing_cycles' => false, 'active' => false, 'type' => false, 'featured_image_id' => 0, 'list_order' => 0, 'date_created' => wu_get_current_time('mysql', true), 'date_modified' => wu_get_current_time('mysql', true), 'migrated_from_id' => 0, 'meta' => array(), 'available_addons' => array(), 'group' => '', )); $product = new Product($product_data); $saved = $product->save(); return is_wp_error($saved) ? $saved : $product; } // end wu_create_product; /** * Returns a list of available product groups. * * @since 2.0.0 */ function wu_get_product_groups(): array { global $wpdb; $query = "SELECT DISTINCT `product_group` FROM {$wpdb->base_prefix}wu_products WHERE `product_group` <> ''"; $results = array_column($wpdb->get_results($query, ARRAY_A), 'product_group'); // phpcs:ignore return array_combine($results, $results); } // end wu_get_product_groups; /** * Takes a list of product objects and separates them into plan and addons. * * @since 2.0.0 * * @param Product[] $products List of products. * @return array first element is the first plan found, the second is an array with all the other products. */ function wu_segregate_products($products) { $results = array(false, array()); foreach ($products as $product) { if (is_a($product, Product::class) === false) { $product = wu_get_product($product); if (!$product) { continue; } // end if; } // end if; if ($product->get_type() === 'plan' && $results[0] === false) { $results[0] = $product; } else { $results[1][] = $product; } // end if; } // end foreach; return $results; } // end wu_segregate_products;