Создайте пользовательский пункт меню, выбранный по категориям продуктов и подкатегориям
Итак, один из наших клиентов использует ERP для обновления продуктов woocomerce на своем веб-сайте WordPress. ERP обновляет базу данных непосредственно для всего, что касается продуктов, категорий, подкатегорий и т.д. Их единственная проблема заключается в том, что они хотят создать пункт меню в главном меню и при добавлении новой категории/подкатегории или удалении существующей динамически обновлять этот элемент меню, в котором будут содержаться категории/подкатегории продуктов.
Есть ли любая функция, которая отображает ВСЕ категории продуктов в виде меню, потому что код, который я начал внедрять, кажется излишним.
require_once('../../../wp-config.php');
require_once('ProductToMenu.php');
global $wp_query;
global $wpdb;
$productToMenuHelper = new ProductToMenu();
$activeTemplateResult = $wpdb->get_results("SELECT * FROM `wp_options` where option_name='template'");
$activeTemplate = $activeTemplateResult[0]->option_value;
$templateOptionsResult = $wpdb->get_results("SELECT * FROM `wp_options` where option_name ='theme_mods_".$activeTemplate."'");
$templateOptions = $productToMenuHelper->unserializeOption($templateOptionsResult[0]->option_value);
$mainMenuId = $templateOptions["nav_menu_locations"]["top"];
$menuItems = $wpdb->get_results("SELECT p.*
FROM wp_posts AS p
LEFT JOIN wp_term_relationships AS tr ON tr.object_id = p.ID
LEFT JOIN wp_term_taxonomy AS tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE p.post_type = 'nav_menu_item' and tt.term_id={$mainMenuId}");
var_dump($menuItems);
Что я пытаюсь сделать, это найти главное меню из шаблона, найти все пункты меню этого меню и после этого получить полезную нагрузку всех категорий и подкатегорий продуктов и проверить, существуют ли в пунктах меню полезная нагрузка
1 answers
Вы можете использовать фильтр wp_get_nav_menu_items
add_filter('wp_get_nav_menu_items', 'prefix_add_categories_to_menu', 10, 3);
Тогда вы могли бы сделать что-то вроде этого:
function prefix_add_categories_to_menu($items, $menu, $args) {
// Make sure we only run the code on the applicable menu
if($menu->slug !== 'replace_this' || is_admin()) return $items;
// Get all the product categories
$categories = get_categories(array(
'taxonomy' => 'product_cat',
'orderby' => 'name',
'show_count' => 0,
'pad_counts' => 0,
'hierarchical' => 1,
'hide_empty' => 1,
'depth' => $depth,
'title_li' => '',
'echo' => 0
));
$menu_items = array();
// Create menu items
foreach($categories as $category) {
$new_item = (object)array(
'ID' => intval($category->term_id),
'db_id' => intval($category->term_id),
'menu_item_parent' => intval($category->category_parent),
'post_type' => "nav_menu_item",
'object_id' => intval($category->term_id),
'object' => "product_cat",
'type' => "taxonomy",
'type_label' => __("Product Category", "textdomain"),
'title' => $category->name,
'url' => get_term_link($category),
'classes' => array()
);
array_push($menu_items, $new_item);
}
$menu_order = 0;
// Set the order property
foreach ($menu_items as &$menu_item) {
$menu_order++;
$menu_item->menu_order = $menu_order;
}
unset($menu_item);
return $menu_items;
}
Вы должны создать меню в WordPress, а затем установить значок в верхней части функции, чтобы убедиться, что это работает только в соответствующем меню. Затем эта функция заменит любые пункты в этом меню всеми вашими категориями товаров.
Если у вас огромное количество категорий, я предлагаю кэшировать это меню с помощью переходного процесса, чтобы оно получало только регенерируется, например, один раз в день.