studiou-wc-product-cat-manage.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. /**
  3. * Plugin Name: QDR - Studiou WC Export/Import Product Categories
  4. * Plugin URI: https://www.quadarax.com/plugins/studiou-wc-product-cat-manage
  5. * Description: Allows batch import and export WooCommerce product categories
  6. * Version: 1.2.2
  7. * Requires at least: 6.8.1
  8. * Requires PHP: 8.2
  9. * Author: Dalibor Votruba
  10. * Author URI: https://www.quadarax.com
  11. * License: GPL v2 or later
  12. * License URI: https://www.gnu.org/licenses/gpl-2.0.html
  13. * Text Domain: studiou-wc-product-cat-manage
  14. * Domain Path: /languages
  15. * WC requires at least: 9.0
  16. * WC tested up to: 9.8
  17. * Woo: 12345:342928dfsfhsf8429842374wdf4234sfd
  18. */
  19. // If this file is called directly, abort.
  20. if (!defined('WPINC')) {
  21. die;
  22. }
  23. // Define plugin constants
  24. if (!defined('STUDIOU_WCPCM_VERSION')) define('STUDIOU_WCPCM_VERSION', '1.2.2');
  25. if (!defined('STUDIOU_WCPCM_PLUGIN_DIR')) define('STUDIOU_WCPCM_PLUGIN_DIR', plugin_dir_path(__FILE__));
  26. if (!defined('STUDIOU_WCPCM_PLUGIN_URL')) define('STUDIOU_WCPCM_PLUGIN_URL', plugin_dir_url(__FILE__));
  27. if (!defined('STUDIOU_WCPCM_PLUGIN_BASENAME')) define('STUDIOU_WCPCM_PLUGIN_BASENAME', plugin_basename(__FILE__));
  28. /**
  29. * Main plugin class
  30. */
  31. class Studiou_WC_Product_Cat_Manage {
  32. /**
  33. * @var Studiou_WC_Product_Cat_Manage_Export
  34. */
  35. private $exporter;
  36. /**
  37. * @var Studiou_WC_Product_Cat_Manage_Import
  38. */
  39. private $importer;
  40. /**
  41. * @var Studiou_WC_Product_Cat_Manage_DB
  42. */
  43. private $db;
  44. /**
  45. * @var Studiou_WC_Product_Cat_Manage_Manipulator
  46. */
  47. private $manipulator;
  48. /**
  49. * Initialize the plugin
  50. */
  51. public function __construct() {
  52. // Load dependencies
  53. $this->load_dependencies();
  54. // Check required plugins
  55. add_action('admin_init', array($this, 'check_required_plugins'));
  56. // Add admin menu items
  57. add_action('admin_menu', array($this, 'add_admin_menu'), 99);
  58. // Register admin assets
  59. add_action('admin_enqueue_scripts', array($this, 'register_admin_assets'));
  60. // Initialize components
  61. $this->init_components();
  62. // Declare WooCommerce HPOS compatibility
  63. add_action('before_woocommerce_init', array($this, 'declare_hpos_compatibility'));
  64. }
  65. /**
  66. * Declare compatibility with WooCommerce HPOS (High-Performance Order Storage)
  67. */
  68. public function declare_hpos_compatibility() {
  69. if (class_exists('Automattic\WooCommerce\Utilities\FeaturesUtil')) {
  70. \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
  71. 'custom_order_tables',
  72. __FILE__,
  73. true
  74. );
  75. }
  76. }
  77. /**
  78. * Load required dependencies
  79. */
  80. private function load_dependencies() {
  81. require_once STUDIOU_WCPCM_PLUGIN_DIR . 'includes/class-studiou-wc-product-cat-manage-db.php';
  82. require_once STUDIOU_WCPCM_PLUGIN_DIR . 'includes/class-studiou-wc-product-cat-manage-export.php';
  83. require_once STUDIOU_WCPCM_PLUGIN_DIR . 'includes/class-studiou-wc-product-cat-manage-import.php';
  84. require_once STUDIOU_WCPCM_PLUGIN_DIR . 'includes/class-studiou-wc-product-cat-manage-manipulator.php';
  85. }
  86. /**
  87. * Initialize components
  88. */
  89. private function init_components() {
  90. $this->db = new Studiou_WC_Product_Cat_Manage_DB();
  91. $this->exporter = new Studiou_WC_Product_Cat_Manage_Export($this->db);
  92. $this->importer = new Studiou_WC_Product_Cat_Manage_Import($this->db);
  93. $this->manipulator = new Studiou_WC_Product_Cat_Manage_Manipulator($this->db);
  94. }
  95. /**
  96. * Check if required plugins are active
  97. */
  98. public function check_required_plugins() {
  99. if (!is_admin() || isset($_GET['activate-multi'])) {
  100. return;
  101. }
  102. // Check for WooCommerce
  103. if (!class_exists('WooCommerce') || !defined('WC_VERSION') || version_compare(WC_VERSION, '9.8', '<')) {
  104. add_action('admin_notices', array($this, 'woocommerce_missing_notice'));
  105. deactivate_plugins(STUDIOU_WCPCM_PLUGIN_BASENAME);
  106. if (isset($_GET['activate'])) {
  107. unset($_GET['activate']);
  108. }
  109. }
  110. }
  111. /**
  112. * WooCommerce missing notice
  113. */
  114. public function woocommerce_missing_notice() {
  115. ?>
  116. <div class="error">
  117. <p><?php echo sprintf(
  118. __('QDR - Studiou WC Export/Import Product Categories requires WooCommerce version 9.8 or higher. Please %sinstall or update WooCommerce%s.', 'studiou-wc-product-cat-manage'),
  119. '<a href="' . admin_url('plugin-install.php?s=woocommerce&tab=search&type=term') . '">',
  120. '</a>'
  121. ); ?></p>
  122. </div>
  123. <?php
  124. }
  125. /**
  126. * Add admin menu items
  127. */
  128. public function add_admin_menu() {
  129. // Make sure WooCommerce menu exists
  130. if (class_exists('WooCommerce')) {
  131. add_submenu_page(
  132. 'edit.php?post_type=product',
  133. __('Import Product Categories', 'studiou-wc-product-cat-manage'),
  134. __('Import Product Categories', 'studiou-wc-product-cat-manage'),
  135. 'manage_woocommerce',
  136. 'studiou-import-product-categories',
  137. array($this, 'render_import_page')
  138. );
  139. add_submenu_page(
  140. 'edit.php?post_type=product',
  141. __('Export Product Categories', 'studiou-wc-product-cat-manage'),
  142. __('Export Product Categories', 'studiou-wc-product-cat-manage'),
  143. 'manage_woocommerce',
  144. 'studiou-export-product-categories',
  145. array($this, 'render_export_page')
  146. );
  147. add_submenu_page(
  148. 'edit.php?post_type=product',
  149. __('Category Manipulations', 'studiou-wc-product-cat-manage'),
  150. __('Category Manipulations', 'studiou-wc-product-cat-manage'),
  151. 'manage_woocommerce',
  152. 'studiou-category-manipulations',
  153. array($this, 'render_manipulations_page')
  154. );
  155. }
  156. }
  157. /**
  158. * Register admin assets
  159. */
  160. public function register_admin_assets($hook) {
  161. // Debug: Log hook being checked
  162. if (defined('WP_DEBUG') && WP_DEBUG) {
  163. error_log('STUDIOU WC: Checking admin assets for hook: ' . $hook);
  164. }
  165. if ('product_page_studiou-import-product-categories' === $hook ||
  166. 'product_page_studiou-export-product-categories' === $hook ||
  167. 'product_page_studiou-category-manipulations' === $hook) {
  168. if (defined('WP_DEBUG') && WP_DEBUG) {
  169. error_log('STUDIOU WC: Loading admin assets for hook: ' . $hook);
  170. }
  171. wp_enqueue_style(
  172. 'studiou-wcpcm-admin',
  173. STUDIOU_WCPCM_PLUGIN_URL . 'assets/css/admin.css',
  174. array(),
  175. STUDIOU_WCPCM_VERSION
  176. );
  177. wp_enqueue_script(
  178. 'studiou-wcpcm-admin',
  179. STUDIOU_WCPCM_PLUGIN_URL . 'assets/js/admin.js',
  180. array('jquery'),
  181. STUDIOU_WCPCM_VERSION,
  182. true
  183. );
  184. wp_localize_script('studiou-wcpcm-admin', 'studiouWcpcm', array(
  185. 'ajaxUrl' => admin_url('admin-ajax.php'),
  186. 'nonce' => wp_create_nonce('studiou-wcpcm-nonce'),
  187. 'i18n' => array(
  188. 'importSuccess' => __('Import successful', 'studiou-wc-product-cat-manage'),
  189. 'importError' => __('Import error', 'studiou-wc-product-cat-manage'),
  190. 'exportSuccess' => __('Export successful', 'studiou-wc-product-cat-manage'),
  191. 'exportError' => __('Export error', 'studiou-wc-product-cat-manage'),
  192. 'moveSuccess' => __('Move operation successful', 'studiou-wc-product-cat-manage'),
  193. 'moveError' => __('Move operation error', 'studiou-wc-product-cat-manage'),
  194. 'selectDifferentCategories' => __('Please select different source and target categories', 'studiou-wc-product-cat-manage'),
  195. 'batchDescriptionSuccess' => __('Batch description operation successful', 'studiou-wc-product-cat-manage'),
  196. 'batchDescriptionError' => __('Batch description operation error', 'studiou-wc-product-cat-manage'),
  197. )
  198. ));
  199. if (defined('WP_DEBUG') && WP_DEBUG) {
  200. error_log('STUDIOU WC: Admin assets loaded successfully');
  201. }
  202. }
  203. }
  204. /**
  205. * Render import page
  206. */
  207. public function render_import_page() {
  208. include STUDIOU_WCPCM_PLUGIN_DIR . 'views/import.php';
  209. }
  210. /**
  211. * Render export page
  212. */
  213. public function render_export_page() {
  214. include STUDIOU_WCPCM_PLUGIN_DIR . 'views/export.php';
  215. }
  216. /**
  217. * Render manipulations page
  218. */
  219. public function render_manipulations_page() {
  220. include STUDIOU_WCPCM_PLUGIN_DIR . 'views/manipulations.php';
  221. }
  222. }
  223. /**
  224. * Begin execution of the plugin
  225. */
  226. function run_studiou_wc_product_cat_manage() {
  227. // Only initialize once
  228. static $initialized = false;
  229. if ($initialized) {
  230. return;
  231. }
  232. $initialized = true;
  233. // Load text domain first
  234. load_plugin_textdomain(
  235. 'studiou-wc-product-cat-manage',
  236. false,
  237. dirname(plugin_basename(__FILE__)) . '/languages/'
  238. );
  239. // Create instance
  240. new Studiou_WC_Product_Cat_Manage();
  241. }
  242. // Run the plugin after plugins are loaded to ensure WooCommerce is available
  243. add_action('plugins_loaded', 'run_studiou_wc_product_cat_manage');