是否在<Body>标记后插入代码而不使用unctions.php?

时间:2018-10-29 作者:Daan Slurink

我目前正在编写一个插件,用户可以选择是插入谷歌分析标签还是GTM标签(谷歌标签管理器)。我已经知道了如何在标记后插入代码。

此时,代码通过我的主题中的自定义函数插入function.php 调用主题中的函数header.php

Header.php

<?php wp_after_body();?>

Functions.php

function wp_after_body() {
do_action(\'wp_after_body\');
}
但我想知道是否有一种解决方案,我可以使用我的插件文件在标记后插入代码(这样我就不必每次使用插件时都更改主题文件)。

我已经试过了:

https://stackoverflow.com/a/27309880/7634982

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

既然你想让你的插件独立于主题,你就必须依赖于你可能认为在任何一个体面的主题中都存在的钩子。目前你只能依靠wp_headwp_footer. 一个钩子就在<body> 标签is under discussion, 但即使它在今天被宣布为标准,仍有数千个现有主题没有实施它。所以这对你没用。

您尝试的选项只是缓冲页面的大部分,允许您在打印之前更改缓冲区的内容。它应该可以工作,尽管它远远不够优雅,并且很容易干扰使用某种缓冲的其他插件。

所以,不,没有直接的文字印刷方式可以可靠地做到这一点。然而,您可以在插件中使用json解决它。这个想法相当简单,尽管它需要一些工作(可能还需要学习曲线)。

钩住wp_head 添加jquery脚本文件,该文件在<body> 标记和use the rest api 调用通常会在该位置生成所需代码的函数。

SO网友:Chris Hayes

自WordPress 5.2(2019年5月)起,这一点得到了官方支持

Compatibility:截至2021 1月,WordPress 5.2+的使用率为76%according to WordPress Stats.

How to use:综合WordPress博客帖子解释wp_body_open 功能位于https://make.wordpress.org/core/2019/04/24/miscellaneous-developer-updates-in-5-2/

TL;DR公司

Snippet Usage

<?php add_action( \'wp_body_open\', function () { ?>

<!-- Your HTML code here -->

<?php } ); ?>

Theme Usage

<body <?php body_class(); ?>>
<?php wp_body_open(); ?>

Theme Usage with Backwards-Compatibility

<body <?php body_class(); ?>>
<?php 
if ( function_exists( \'wp_body_open\' ) ) {
    wp_body_open();
} else {
    do_action( \'wp_body_open\' );
}

SO网友:djboris

恐怕目前这是不可能的。这完全取决于主题领域,您将始终依赖于主题代码。

BUT!! 对于不复杂的代码插入,您可以使用一种简单的黑客方法。我说这是一个黑客,你会明白为什么。

99.99%的主题中唯一可以信赖的是<body <?php body_class(); ?>>. 因此,我们可以使用过滤器挂钩将另一个“类”添加到body标记,除了。。。这不是一门课。查看此代码:

add_filter( \'body_class\', function ( $classes ) {
    return array_merge( 
        $classes, 
        array( \'">
            <iframe src="//www.googletagmanager.com/ns.html?id=XXX-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
            <input type="hidden\' // Important to handle the closing of the body element
        ) 
    );
} );
我们在这里做了什么?我们首先添加了"> 关闭body 要素然后你可以插入任何你想要的HTML。最后一部分也是强制性的,用于处理body 元素,我们需要创建一些不会破坏模板的内容,因此隐藏的输入字段应该可以很好地工作。我们添加<input type="hidden, 但是没有结束"> 因为body_class() 函数将为我们完成它。

请注意,这可能会与上的其他一些过滤器发生冲突body_class, 取决于优先级。要处理这个问题,您可以将其包装到另一个动作挂钩中,该挂钩将在加载主题后触发,例如get_header. 在这种情况下,完整代码为:

add_action( \'get_header\', function() {
    add_filter( \'body_class\', function ( $classes ) {
        return array_merge(
            $classes,
            array( \'">
            <iframe src="//www.googletagmanager.com/ns.html?id=XXX-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
            <input type="hidden\' // Important to handle the closing of the body element
            ) );
    } );
});
尽管这可能符合你的要求,但我真的不能推荐这个。

结束