问题描述

我正在尝试类似于这个问题:remove_action or remove_filter with external classes?

我试图删除

<!-- This site is optimized with the Yoast WordPress SEO plugin v1.0.3 - http;//yoast.com/wordpress/seo/ -->

从插件的消息。

在你向我说明这可能是不道德的之前,作者说可以这样做:http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous-inserted-yoast-message-in-page-headers?replies=29#post-2503475

我已经找到添加评论的类:http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

基本上,WPSEO_Frontend 类具有名为 debug_marker 的功能,然后由名为 head 的函数调用,然后将其添加到__Construct 中的 wp_head

我是新手上课,但我发现了一种方法,通过做完全删除头

global $wpseo_front;    
remove_action( 'wp_head', array($wpseo_front,'head'), 1, 1 );

但我只想从中删除 debug_marker 部件。我试过这个,但它不工作 remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

正如我所说,我是新来的课,所以任何帮助将是巨大的。

最佳解决方案

通过使用 output buffering 过滤 wp_head 动作钩子的输出,实现这一点的简单方法 (但不使用 Class 方法) 。

在您的主题 header.php 中,使用 ob_start($cb)ob_end_flush(); 函数打包 wp_head()函数,如:

ob_start('ad_filter_wp_head_output');
wp_head();
ob_end_flush();

现在在主题 functions.php 文件中,声明您的输出回调函数 (在这种情况下为 ad_filter_wp_head_output):

function ad_filter_wp_head_output($output) {
    if (defined('WPSEO_VERSION')) {
        $output = str_ireplace('<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - http://yoast.com/wordpress/seo/ -->', '', $output);
        $output = str_ireplace('<!-- / Yoast WordPress SEO plugin. -->', '', $output);
    }
    return $output;
}

如果要通过 functions.php 执行所有操作,无需编辑 header.php 文件,您可以挂接到 get_headerwp_head 动作钩子来定义输出缓冲会话:

add_action('get_header', 'ad_ob_start');
add_action('wp_head', 'ad_ob_end_flush', 100);
function ad_ob_start() {
    ob_start('ad_filter_wp_head_output');
}
function ad_ob_end_flush() {
    ob_end_flush();
}
function ad_filter_wp_head_output($output) {
    if (defined('WPSEO_VERSION')) {
        $output = str_ireplace('<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - http://yoast.com/wordpress/seo/ -->', '', $output);
        $output = str_ireplace('<!-- / Yoast WordPress SEO plugin. -->', '', $output);
    }
    return $output;
}

次佳解决方案

我不认为你将能够使用 remove_action 做到这一点。 remove_action 中的函数参数不会帮助您,因为 debug_marker()函数不是 add_action()调用中使用的函数。

在他的代码中可能有一些类似 add_action( "wp_head", "head" )的东西。因此,您可以删除”head” 功能,但 debug_marker 没有明确添加为一个操作。

你可以

  1. 编辑 Yoast 的源文件并删除调试注释行。

  2. 扩展 WPSEO_Frontend 类并重载 debug_marker 函数返回 「」 。 TBH,我不知道这将在 WP 加载插件方面如何工作,但可能值得调查。

第三种解决方案

感谢您的帮助,我终于解决了。我为我的孩子主题创建了一个 functions.php,然后添加

// we get the instance of the class
$instance = WPSEO_Frontend::get_instance();
/* then we remove the function
    You can remove also others functions, BUT remember that when you remove an action or a filter, arguments MUST MATCH with the add_action
    In our case, we had :
    add_action( 'wpseo_head', array( $this, 'debug_marker' ), 2 );

    so we do : 
    remove_action( 'wpseo_head', array( $this, 'debug_marker' ), 2 );
    */
    remove_action( 'wpseo_head', array( $instance, 'debug_marker' ), 2 );

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。