/* Plugin Name: WooCommerce Mobile Menu Builder Description: A mobile-first menu builder for WooCommerce categories with icon support, rename, and dynamic filtering. Version: 1.0 Author: FeitFisk */ // Register admin menu add_action('admin_menu', function () { add_menu_page( 'Mobile Menu Builder', 'Mobile Menu Builder', 'manage_woocommerce', 'wc-mobile-menu-builder', 'wc_mobile_menu_admin_page', 'dashicons-menu', 58 ); }); // Enqueue styles and scripts add_action('admin_enqueue_scripts', function ($hook) { if ($hook !== 'toplevel_page_wc-mobile-menu-builder') return; wp_enqueue_style('wc-mobile-menu-admin', plugin_dir_url(__FILE__) . 'assets/admin.css'); wp_enqueue_script('wc-mobile-menu-admin-js', plugin_dir_url(__FILE__) . 'assets/admin.js', ['jquery'], null, true); }); function wc_mobile_menu_admin_page() { $categories = get_terms(['taxonomy' => 'product_cat', 'hide_empty' => false]); $settings = get_option('wc_mobile_menu_settings', []); echo '

WooCommerce Mobile Menu Builder

'; echo ''; foreach ($categories as $cat) { $id = $cat->term_id; $custom = $settings[$id] ?? []; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
CategoryMainCustom NameIconExclude
' . esc_html($cat->name) . '
'; submit_button(); echo '
'; } add_action('admin_init', function () { if (!empty($_POST['settings']) && current_user_can('manage_woocommerce')) { update_option('wc_mobile_menu_settings', array_map('wc_mobile_menu_sanitize_settings', $_POST['settings'])); } }); function wc_mobile_menu_sanitize_settings($data) { return [ 'main' => !empty($data['main']), 'name' => sanitize_text_field($data['name'] ?? ''), 'icon' => sanitize_text_field($data['icon'] ?? ''), 'exclude' => !empty($data['exclude']), ]; } function wc_mobile_menu_build_tree($parent_id = 0, $categories, $settings) { $branch = []; foreach ($categories as $cat) { if ($cat->parent != $parent_id) continue; $id = $cat->term_id; $conf = $settings[$id] ?? []; if (!empty($conf['exclude'])) continue; $children = wc_mobile_menu_build_tree($id, $categories, $settings); $has_products = $cat->count > 0 || count($children) > 0; if (!$has_products) continue; $branch[] = [ 'name' => $conf['name'] ?: $cat->name, 'icon' => $conf['icon'] ?? '', 'url' => get_term_link($cat), 'children' => $children ]; } return $branch; } add_shortcode('woo_mobile_menu', function () { ob_start(); echo '
'; wp_enqueue_style('wc-mobile-menu-style', plugin_dir_url(__FILE__) . 'assets/menu.css'); wp_enqueue_script('wc-mobile-menu-script', plugin_dir_url(__FILE__) . 'assets/menu.js', [], null, true); $settings = get_option('wc_mobile_menu_settings', []); $all_categories = get_terms(['taxonomy' => 'product_cat', 'hide_empty' => false]); $main_ids = array_filter(array_keys($settings), fn($id) => !empty($settings[$id]['main'])); $main_categories = array_filter($all_categories, fn($cat) => in_array($cat->term_id, $main_ids)); $menu_data = wc_mobile_menu_build_tree(0, $all_categories, $settings); wp_localize_script('wc-mobile-menu-script', 'wcMobileMenuData', $menu_data); return ob_get_clean(); }); } ] }