如何在子主题中覆盖此主题函数

时间:2015-06-28 作者:ReynierPM

我正在处理一个子主题,我需要重写一个函数,以便删除顶部菜单上一些不需要的项目。所以我做了一些研究,发现了很多文档,真的,像this, thisthis 但我仍然不清楚如何在我的具体案例中实现这一点。所以我希望这里有人能给我指出正确的方向。我在原始主题中有此功能functions.php 文件:

function udesign_nav() {
    if ( function_exists( \'wp_nav_menu\' ) ) {
        $defaults = array(
            \'container_class\' => \'navigation-menu\',
            \'container_id\' => \'navigation-menu\',
            \'menu_id\'    => \'main-top-menu\',
            \'menu_class\' => \'sf-menu\',
            \'link_before\'=> \'<span>\',
            \'link_after\' => \'</span>\',
            \'theme_location\' => \'primary\',
            \'fallback_cb\' => \'udesign_nav_fallback\'
        );
        wp_nav_menu( $defaults );
    } else {
        udesign_nav_fallback();
    }
}

function udesign_nav_fallback() {
    $menu_html = \'<div id="navigation-menu" class="navigation-menu">\';
    $menu_html .= \'<ul id="main-top-menu" class="sf-menu">\';
    $menu_html .= is_front_page() ? "<li class=\'current_page_item\'>" : "<li>";
    $menu_html .= \'<a href="\'.home_url().\'"><span>\'.esc_html__(\'Home\', \'udesign\').\'</span></a></li>\';
    $menu_html .= wp_list_pages(\'depth=5&title_li=0&sort_column=menu_order&link_before=<span>&link_after=</span>&echo=0\');
    $menu_html .= \'</ul>\';
    $menu_html .= \'</div>\';
    echo $menu_html;
}
我想,它被称为:

// Setup the main menu
function udesign_top_main_menu() {
    ob_start(); ?>
            <div class="clear"></div>
            <div id="main-menu">
                <div id="dropdown-holder" class="container_24">
<?php               udesign_nav(); // this function calls the main menu ?>
                </div>
                <!-- end dropdown-holder -->
            </div>
            <!-- end top-main-menu -->
<?php
    $main_menu_html = ob_get_clean();
    echo apply_filters( \'udesign_get_top_main_menu\', $main_menu_html );
}
add_action(\'udesign_top_wrapper_bottom\', \'udesign_top_main_menu\', 10);
我需要重写的是从udesign_nav_fallback() 功能:

$menu_html .= is_front_page() ? "<li class=\'current_page_item\'>" : "<li>";
$menu_html .= \'<a href="\'.home_url().\'"><span>\'.esc_html__(\'Home\', \'udesign\').\'</span></a></li>\';
使用functions.php 关于儿童主题?

1 个回复
SO网友:s_ha_dum

无法重写该函数。它们不应该被覆盖。请参见:"Override parent theme function that is not hooked or in the functions.php file""Is it possible to disable a function of a parent theme?". 这是对你问题的直接回答。

然而,通过使用主题提供的过滤器,几乎可以肯定地达到您想要的结果--udesign_get_top_main_menu-- 或any number of filters provided by wp_nav_menu() or by the Walker_Nav_menu class-- 可能wp_nav_menu_objectswp_nav_menu_items.

根据问题,您要删除:

$menu_html .= is_front_page() ? "<li class=\'current_page_item\'>" : "<li>";
$menu_html .= \'<a href="\'.home_url().\'"><span>\'.esc_html__(\'Home\', \'udesign\').\'</span></a></li>\';
好的。您可能需要使用发布的代码中提供的过滤器:

function udesign_strip($menu) {
  var_dump($menu);
  $menu_html = is_front_page() ? "<li class=\'current_page_item\'>" : "<li>";
  $menu_html .= \'<a href="\'.home_url().\'"><span>\'.esc_html__(\'Home\', \'udesign\').\'</span></a></li>\';
  $menu = str_replace($menu_html,\'\',$menu);
  return $menu;
}
add_filter(\'udesign_get_top_main_menu\',\'udesign_strip\');
我不喜欢str_replace但在这种情况下,这可能是最好的方法。

结束

相关推荐

Upgrading themes never works

我在家里的服务器上安装了Wordpress,为我购买的域名提供服务。它运行在Debian Linux上,目前安装在/usr/share/wordpress.当我在管理面板中时,我会看到主题或插件更新的通知。因此,我将SSH连接到服务器,打开FTP守护程序,然后启动更新。以下是输出示例:Downloading install package from http://downloads.wordpress.org/plugin/akismet.3.0.0.zip… Unpacking the pack