2011-07-28 31 views
1

我正在为自定义菜单布局创建一个WordPress插件。我很清楚,我可以直接将这个菜单直接应用到主题中,并且我已经详细阅读了wp_nav_menu()的功能和局限性,另外我已经尝试过并测试了为替换默认WordPress菜单而创建的每个插件。用插件替换WordPress的核心功能

我希望使用一个插件,因为我的客户将在几个不同的WordPress网站上实现这个插件,其中许多插件运行在不同的主题上 - 其中大多数是我没有创建的主题,编写他们的代码以防将来更新主题。

当我研究了一种将菜单实现到主题中的方法时,我发现只有两个好方法,因为在菜单显示时没有钩子或过滤器被调用。首先是更换主题去寻找插件(这是类似于PixoPoint和许多其他菜单插件使用的方法):

header.php: 

if(function_exists('pixopoint_menu')){ 
    pixopoint_menu(); 
} else { 
    wp_nav_menu(); 
} 

第二种方法是学步车类:

plugin.php: 

class my_walker_class Extends Walker_Nav_Menu { 
    function start_el(&$output, $item, $depth, $args) { 
     /* 
     * Etc. Etc. 
     */ 
    } 
} 

header.php: 

wp_nav_menu(Array('walker' => 'my_walker_class')); 

但是,你会注意到这两种方法都需要修改标准的header.php文件。

理想情况下,我想简单地替换wp_nav_menu()函数,如果我的插件被加载,因为这将使我的插件支持大多数主题而无需编辑任何主题文件。有没有一个好的方法来做到这一点?还是有更好的方式来编写我没有看到的菜单插件?

回答

2

您可以使用wp_nav_menu_args过滤器来修改传递给wp_nav_menu的参数,以便您可以指定自定义walker类。

add_filter('wp_nav_menu_args', 'my_wp_nav_menu_args_filter'); 
function my_wp_nav_menu_args_filter($args = array()) { 
    $args['walker'] = new my_walker_class(); 
    return $args; 
} 
+0

谢谢。我无法相信这一直在逃避我。出于某种原因,我没有意识到我可以使用该过滤器来通过我自己的沃克班......我真的很愚蠢,当谈到WordPress ... – stevendesu