Создайте пользовательский пункт меню, выбранный по категориям продуктов и подкатегориям


Итак, один из наших клиентов использует 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);

Что я пытаюсь сделать, это найти главное меню из шаблона, найти все пункты меню этого меню и после этого получить полезную нагрузку всех категорий и подкатегорий продуктов и проверить, существуют ли в пунктах меню полезная нагрузка

Author: IseNgaRt, 2019-06-12

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, а затем установить значок в верхней части функции, чтобы убедиться, что это работает только в соответствующем меню. Затем эта функция заменит любые пункты в этом меню всеми вашими категориями товаров.

Если у вас огромное количество категорий, я предлагаю кэшировать это меню с помощью переходного процесса, чтобы оно получало только регенерируется, например, один раз в день.

 3
Author: Alex Uleberg, 2019-06-12 23:48:15