创建按产品类别和子类别提取的自定义菜单项

时间:2019-06-12 作者:IseNgaRt

因此,我们的一位客户使用ERP来更新Woocomece在其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 个回复
最合适的回答,由SO网友:Alex Uleberg 整理而成

您可以使用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中创建一个菜单,然后在函数顶部设置slug,以确保它只在适用的菜单上运行。然后,此功能将用您的所有产品类别替换该菜单中的任何项目。

如果你有大量的类别,我建议使用一个瞬态缓存这个菜单,例如,每天只重新生成一次。

相关推荐

用标准的干净文件替换NAV-menus.php文件?

我是一个自学成才的wordpress网站设计师,请原谅我的无知。我为一个客户开发的几个网站最近被一个印尼黑客组织破坏了(很有趣!)。客户端没有更新wordpress安装和其他一些危及安全的事情。遗憾的是,没有网站的清理备份。网络主机给了我一个包含恶意软件扫描结果的文本文件。看起来很多受影响的文件都是导航菜单。网站的php文件。文本文件中显示的扫描结果示例如下:“[主目录]/[网站文件夹名称]/wp includes/nav-menu.php:SL-php-INJECTOR-1-ejw.UNOFFICIAL