追加到现有父主题函数

时间:2018-07-16 作者:yourenotthere

我的父主题调用函数:

function get_nav_markup() {
    ob_start();
?>
    <nav class="navbar navbar-toggleable-md navbar-inverse site-navbar" role="navigation">
        <div class="container">
            <?php if ( is_home() ): ?>
            <h1 class="navbar-brand mb-0">
                <?php echo get_sitename_formatted(); ?>
            </h1>
            <?php else: ?>
            <a href="<?php echo bloginfo( \'url\' ); ?>" class="navbar-brand">
                <?php echo get_sitename_formatted(); ?>
            </a>
            <?php endif; ?>
            <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#header-menu" aria-controls="header-menu" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <?php
                wp_nav_menu( array(
                    \'theme_location\'  => \'header-menu\',
                    \'depth\'           => 2,
                    \'container\'       => \'div\',
                    \'container_class\' => \'collapse navbar-collapse\',
                    \'container_id\'    => \'header-menu\',
                    \'menu_class\'      => \'nav navbar-nav ml-md-auto\',
                ) );
            ?>
        </div>
    </nav>
<?php
    return ob_get_clean();
}
然后再这样使用它:

function get_header_markup() {
    global $post;
    echo get_nav_markup( $post );

    $videos = get_header_videos( $post );
    $images = get_header_images( $post );

    if ( $videos || $images ) {
        echo get_header_media_markup( $post, $videos, $images );
    }
    else {
        echo get_header_default_markup( $post );
    }
}
我是否可以覆盖get\\u nav\\u标记,或者至少在子主题中立即附加附加信息?

考虑到父主题函数的编写方式,我认为我做不到。但是我真的需要能够在/nav之后添加一些额外的div和PHP

3 个回复
最合适的回答,由SO网友:yourenotthere 整理而成

好的,这是我在这种情况下的决定。

我已经复制了标题。php文件转换为我的子主题

  • 我已经更改了来自get\\u header\\u markup()的头文件中的行;获取\\u header\\u markup\\u updated()现在的结果如下所示:

    function get_header_markup_updated() {
        global $post;
        echo get_nav_markup( $post ); ?>
    <div class="breadcrumbnav">
        <!-- Inserted all my other code here --> 
    </div>
    <?php       
        $videos = get_header_videos( $post );
        $images = get_header_images( $post );
    
        if ( $videos || $images ) {
            echo get_header_media_markup( $post, $videos, $images );
        }
        else {
            echo get_header_default_markup( $post );
        }
    }
    ?>
    
    这似乎工作得很好。希望这也是未来最不突兀的一次。

  • SO网友:Jacob Peattie

    不,这似乎不可能。至少不是直接的。如果父主题中的函数包装在以下内容中,则可以替换它们:

    if ( ! function_exists( \'get_nav_markup\' ) ) {
    }
    
    因为子主题是在父主题之前加载的,所以您有机会定义get_nav_markup() 加载父主题之前。那个if 语句表示如果子主题中已有函数,则父函数不会注册该函数。

    如果父主题已将函数与add_action(), 像这样:

    add_action( \'hook_name\', \'get_nav_markup\' );
    
    然后,您可以编写自己的函数并将其挂接在原始函数的位置来替换该函数:

    remove_action( \'hook_name\', \'get_nav_markup\' );
    add_action( \'hook_name\', \'my_get_nav_markup\' );
    
    因此,由于父主题不执行这两项操作,因此您唯一的选择是在模板级别进行替换。您需要:

    复制get_nav_markup() 函数,但将其重命名。然后做你想做的任何改变get_header_markup() 函数,将其重命名,并将引用替换为get_nav_markup() 到子主题中重命名和修改的副本get_header_markup(), 大概是标题。php,将其复制到子主题,以便替换父主题,并将引用更改为get_header_markup() 到您的重命名和修改版本

    SO网友:Andrea Somovigo

    如果在模板页面中使用了get\\u header\\u markup(),则可以使用以相同方式命名的文件轻松覆盖父主题的模板(假设模板文件为主题/template1.php,在子主题文件夹中创建一个名为子主题/template1.php的文件),并从中调用新的自定义函数。

    echo NEW_get_nav_markup( $post );
    
    否则,您需要检查是否已通过某个地方调用了get\\u header\\u markup(),在这种情况下,您可以删除并添加一个新的

    remove_action(\'called hook\',\'get_header_markup\', 10, 2);
    add_action(\'called hook\',\'NEW_get_header_markup\', 10, 2);
    
    如果是这种情况,请记住,要删除以前通过add\\u action()添加的操作,必须使用相同的优先级和参数。

    根据我的经验,作为一个基于主题的架构(不是插件),从输出内容的模板文件开始,几乎总是有可能找到一个点,在这个点上使用子主题的模板文件覆盖原始功能。

    结束

    相关推荐

    Calculations in functions.php

    我为自己创建了一个发票主题,并试图在自定义列中获取发票总额。我已经尝试调整模板页面中使用的代码,以便在函数中显示这一点。php文件,但它不工作。我的乘法操作数出现了一个操作数错误,我不知道为什么。这是我的代码(如有任何帮助,将不胜感激)。if( $column_name == \'invoice_total\' ) { $hours = 0; // This allows counting of each sub_field //* Set repeater va