PluginProbe ʕ •ᴥ•ʔ
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). / 2.7.91
CommerceBird – AI Command Center, ERP Integrations & B2B for WooCommerce (Zoho, Exact Online). v2.7.91
3.0.3 3.0.2 3.0.1 trunk 2.2.14 2.2.15 2.2.16 2.2.17 2.2.18 2.2.19 2.3.0 2.3.1 2.3.10 2.3.11 2.3.12 2.3.13 2.3.14 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.3.8 2.3.9 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 2.7.91 2.7.92 2.7.93 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.8.5 2.9.0 2.9.1 2.9.2 2.9.3 3.0.0
commercebird / commercebird.php
commercebird Last commit date
admin 3 months ago includes 3 months ago languages 1 year ago mu-plugins 5 months ago vendor 3 months ago LICENSE 1 year ago commercebird.php 3 months ago composer.json 4 months ago index.php 1 year ago readme.txt 3 months ago wp-dependencies.json 8 months ago
commercebird.php
274 lines
1 <?php
2 /**
3 * Plugin Name: CommerceBird
4 * Plugin URI: https://commercebird.com
5 * Author: CommerceBird
6 * Description: This plugin helps you get the most of CommerceBird AI App and use integrations like Zoho Inventory, Zoho CRM, Exact Online and more. Requires a subscription at CommerceBird.com.
7 * Version: 2.7.91
8 * Requires PHP: 8.2
9 * Requires Plugins: woocommerce
10 * Requires at least: 6.5
11 * Tested up to: 6.9.4
12 * Text Domain: commercebird
13 * Domain Path: /languages
14 *
15 * License: GNU General Public License v3.0
16 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
17 *
18 * @category Fulfillment
19 * @package CommerceBird
20 * @author Fawad Tiemoerie <info@commercebird.com>
21 * @copyright Copyright (c) 2026, CommerceBird
22 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL-3.0-or-later
23 *
24 * WC requires at least: 9.8.0
25 * WC tested up to: 10.6.1
26 */
27
28 if ( ! defined( 'ABSPATH' ) ) {
29 exit; // Exit if accessed directly.
30 }
31
32 if ( ! defined( 'CMBIRD_VERSION' ) ) {
33 define( 'CMBIRD_VERSION', '2.7.91' );
34 }
35 if ( ! defined( 'CMBIRD_PATH' ) ) {
36 define( 'CMBIRD_PATH', plugin_dir_path( __FILE__ ) );
37 }
38 if ( ! defined( 'CMBIRD_URL' ) ) {
39 define( 'CMBIRD_URL', plugin_dir_url( __FILE__ ) );
40 }
41 if ( ! defined( 'CMBIRD_MENU_SLUG' ) ) {
42 define( 'CMBIRD_MENU_SLUG', 'commercebird-app' );
43 }
44
45 require_once CMBIRD_PATH . 'includes/woo-functions.php';
46 require_once CMBIRD_PATH . 'includes/sync/order-backend.php';
47
48 require __DIR__ . '/vendor/autoload.php';
49
50 use Automattic\WooCommerce\Utilities\FeaturesUtil;
51 use CommerceBird\Admin\Actions\Sync\ExactOnlineSync;
52 use CommerceBird\Admin\Actions\Sync\ZohoCRMSync;
53 use CommerceBird\API\CMBird_APIs;
54 use CommerceBird\API\CreateOrderWebhook;
55 use CommerceBird\API\Exact;
56 use CommerceBird\API\ProductWebhook;
57 use CommerceBird\API\ShippingWebhook;
58 use CommerceBird\API\Zoho;
59 use CommerceBird\Plugin;
60
61 /*
62 |--------------------------------------------------------------------------
63 | Activation, deactivation and uninstall event.
64 |--------------------------------------------------------------------------
65 */
66
67 register_activation_hook( __FILE__, array( Plugin::class, 'activate' ) );
68 register_deactivation_hook( __FILE__, array( Plugin::class, 'deactivate' ) );
69 register_uninstall_hook( __FILE__, array( Plugin::class, 'uninstall' ) );
70
71 /*
72 |--------------------------------------------------------------------------
73 | Load the plugin translations
74 |--------------------------------------------------------------------------
75 | Note: WordPress.org automatically loads translations for plugins since WP 4.6.
76 | Manual loading not required for plugins hosted on WordPress.org.
77 */
78
79 /** Loading Purchase Order Class
80 *
81 * @since 1.0.0
82 */
83 function cmbird_purchase_order_class() {
84 if ( class_exists( 'WooCommerce' ) ) {
85 new CMBIRD_Purchase_Order();
86 }
87 }
88 add_action( 'woocommerce_init', 'cmbird_purchase_order_class' );
89 add_action( 'init', array( CMBIRD_PO_Admin_Manager::class, 'init' ), 11 );
90
91 /*
92 |--------------------------------------------------------------------------
93 | Start the plugin
94 |--------------------------------------------------------------------------
95 */
96 Plugin::init();
97
98 /**
99 * Declaring compatibility for WooCommerce HPOS
100 */
101 add_action(
102 'before_woocommerce_init',
103 function () {
104 if ( class_exists( FeaturesUtil::class ) ) {
105 FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
106 FeaturesUtil::declare_compatibility( 'product_instance_caching', __FILE__, true );
107 }
108 }
109 );
110
111 /*
112 --------------------------------------------------------------------------
113 | Install required dependencies
114 |--------------------------------------------------------------------------
115 */
116 add_action(
117 'plugins_loaded',
118 static function () {
119 // Only if Premium plan is active via transient subscription_details.
120 $subscription = get_transient( 'subscription_details' );
121 // return if no subscription found.
122 if ( false === $subscription || empty( $subscription ) ) {
123 return;
124 }
125 if ( 'active' === $subscription['status'] ) {
126 $premium_plans = array( 'Premium', 'PremiumPlus' );
127 if ( in_array( $subscription['plan'], $premium_plans, true ) ) {
128 if ( class_exists( 'ACF' ) ) {
129 return;
130 }
131 WP_Dependency_Installer::instance( __DIR__ )->run();
132 }
133 }
134 }
135 );
136
137 /**
138 * Hooks for WC Action Scheduler to import or export products
139 */
140 $cmbird_import_products = new CMBIRD_Products_ZI();
141 $cmbird_import_pricelist = new CMBIRD_Pricelist_ZI();
142 $cmbird_product_class = new CMBIRD_Products_ZI_Export();
143 $cmbird_common_class = new CMBIRD_Common_Functions();
144 $cmbird_contact_class = new CMBIRD_Contact_ZI();
145 $cmbird_category_class = new CMBIRD_Categories_ZI();
146 $cmbird_import_pricelist->wc_b2b_groups();
147 add_action( 'import_group_items_cron', array( $cmbird_import_products, 'sync_groupitem_recursively' ), 10, 2 );
148 add_action( 'import_simple_items_cron', array( $cmbird_import_products, 'sync_items_batch' ), 10, 2 );
149 add_action( 'import_variable_product_cron', array( $cmbird_import_products, 'import_variable_product_variations' ), 10, 2 );
150 add_action( 'sync_zi_product_cron', array( $cmbird_product_class, 'cmbird_zi_products_prepare_sync' ), 10, 2 );
151 add_action( 'sync_zi_pricelist', array( $cmbird_import_pricelist, 'zi_get_pricelist' ), 10, 2 );
152 add_action( 'sync_zi_order', array( $cmbird_common_class, 'cmbird_orders_prepare_sync' ), 10, 2 );
153 add_action( 'sync_zi_import_contacts', array( $cmbird_contact_class, 'cmbird_get_zoho_contacts' ), 10, 2 );
154 // add action to set the zoho rate limit option exceeded to false.
155 add_action( 'cmbird_common', array( CMBIRD_Common_Functions::class, 'set_zoho_rate_limit_option' ) );
156 // Zoho CRM Hooks.
157 add_action( 'sync_zcrm_order', array( $cmbird_common_class, 'cmbird_orders_prepare_sync' ) );
158 add_action( 'sync_zcrm_contact', array( ZohoCRMSync::class, 'cmbird_zcrm_contact_sync' ) );
159 // Exact Online Hooks.
160 add_action( 'cmbird_sync_eo', array( ExactOnlineSync::class, 'sync' ), 10, 3 );
161 add_action( 'cmbird_exact_online_sync_orders', array( ExactOnlineSync::class, 'sync_orders_via_cron' ) );
162 add_action( 'cmbird_payment_status', array( ExactOnlineSync::class, 'cmbird_payment_status' ), 10, 1 );
163 add_action( 'cmbird_eo_get_payment_statuses', array( ExactOnlineSync::class, 'get_payment_status_via_cron' ) );
164 // Callback functions for scheduled action to process product or customer chunk.
165 add_action(
166 'cmbird_process_product_chunk',
167 function ( $args ) {
168 if ( ! is_array( $args ) || empty( $args['transient_key'] ) ) {
169 return;
170 }
171 $transient_key = $args['transient_key'];
172 $import_products = $args['import_products'] ?? false;
173 $chunked_products = get_transient( $transient_key );
174 if ( $chunked_products ) {
175 $sync = new ExactOnlineSync();
176 $sync->sync( 'product', $chunked_products, (bool) $import_products );
177 // Remove transient after processing.
178 delete_transient( $transient_key );
179 }
180 },
181 10,
182 1
183 );
184 add_action(
185 'cmbird_process_customer_chunk',
186 function ( $args ) {
187 if ( ! is_array( $args ) || empty( $args['transient_key'] ) ) {
188 return;
189 }
190 $transient_key = $args['transient_key'];
191 $import_customers = $args['import_customers'] ?? false;
192 $chunked_customers = get_transient( $transient_key );
193 if ( $chunked_customers ) {
194 $sync = new ExactOnlineSync();
195 $sync->sync( 'customer', $chunked_customers, (bool) $import_customers );
196 // Remove transient after processing.
197 delete_transient( $transient_key );
198 }
199 },
200 10,
201 1
202 );
203 // Zoho CRM Hooks.
204 add_action( 'init', array( ZohoCRMSync::class, 'refresh_token' ) );
205 // Zoho Inventory Cron Hook for importing items.
206 add_action( 'zi_execute_import_sync', array( Plugin::class, 'dispatch_import_simple_items' ) );
207
208 // add classes to REST API.
209 add_action(
210 'rest_api_init',
211 function () {
212 new Zoho();
213 new Exact();
214 new ProductWebhook();
215 new ShippingWebhook();
216 new CreateOrderWebhook();
217 new CMBird_APIs();
218 $po_controller = new CMBIRD_REST_Shop_Purchase_Controller();
219 $po_controller->register_routes();
220 }
221 );
222
223 add_action(
224 'save_post',
225 function ( $post_id, $post ) {
226 if ( 'wcb2b_group' === $post->post_type ) {
227 delete_transient( 'wc_b2b_groups' );
228 }
229 },
230 10,
231 2
232 );
233
234 /**
235 * Perform actions when the plugin is updated
236 *
237 * @param string $upgrader_object
238 * @param array $options
239 * @return void
240 */
241 add_action( 'upgrader_process_complete', 'cmbird_update_plugin_tasks', 10, 2 );
242
243 /**
244 * Perform tasks when the plugin is updated.
245 *
246 * @param \WP_Upgrader $upgrader_object - Upgrader object.
247 * @param array $options - Options array.
248 *
249 * @see https://developer.wordpress.org/reference/hooks/upgrader_process_complete/
250 */
251 function cmbird_update_plugin_tasks( $upgrader_object, $options ) {
252 $this_plugin = plugin_basename( __FILE__ );
253
254 if ( 'update' === $options['action'] && 'plugin' === $options['type'] ) {
255 foreach ( $options['plugins'] as $plugin ) {
256 if ( $plugin === $this_plugin ) {
257 // Perform tasks when the plugin is updated.
258 // Updating meta key from '_cost_price' to '_cogs_total_value'.
259 global $wpdb;
260 $table_name = $wpdb->prefix . 'postmeta';
261 $wpdb->query(
262 $wpdb->prepare(
263 'UPDATE %s SET meta_key = %s WHERE meta_key = %s',
264 $table_name,
265 '_cogs_total_value',
266 '_cost_price'
267 )
268 );
269 break;
270 }
271 }
272 }
273 }
274