/*
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
';
}
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();
});
}
]
}