从外部类中删除操作

时间:2012-12-06 作者:Brooke.

我想做一些类似于这个问题的事情: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 然后添加到wp_head 在里面__Construct

我是新手,但我找到了一种方法,通过

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 );

正如我所说,我是新来的,所以任何帮助都会很好。

10 个回复
最合适的回答,由SO网友:Ahmad M 整理而成

实现这一点的一种简单方法(但不使用类方法)是过滤wp_head 使用操作挂钩output buffering.

在您的主题中header.php, 包装wp_head() 使用呼叫ob_start($cb)ob_end_flush(); 功能如下:

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;
}

SO网友:Mike Lecomte

谢谢你的帮助,我终于解决了。我创建了一个函数。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 );

SO网友:Steve Claridge

我认为你不能用remove_action. 中的函数参数remove_action 不会帮助您,因为debug_marker() 函数不是中使用的函数add_action() 呼叫

约斯特大概有点像add_action( "wp_head", "head" ) 在他的代码中。因此,您可以删除“head”功能,但是debug_marker 未明确添加为操作。

你可以

编辑Yoast的源文件并删除调试注释行WPSEO_Frontend 类并重载debug_marker 函数返回“”。TBH,就WP加载插件而言,我不确定这将如何工作,但可能值得研究

SO网友:Adrien Be

在使用与相同的解决方案后查找此线程the one mentioned by Steve Claridge, 即:

Extend the WPSEO_Frontend class and overload the debug_marker function to return ""

我在下面详细介绍了这些步骤,尽管我在最后一步遇到了困难。

创建自定义插件,如中所述this article from WP Tavern, "E;实现这一点的最简单方法是创建一个与之并行运行的功能插件;。

所以我继续creating my first plugin following this article from ElegantTheme.

扩展相关类

//get the base class
if(!class_exists(\'WPSEO_Frontend\')) {
    require_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-content/plugins/wordpress-seo/frontend/class-frontend.php\';
}

/**
 * Class Definition
 */
class WPSEO_Frontend_GUP extends WPSEO_Frontend{

    /**
     * 
     * OVERRIDES function from YOAST SEO
     * 
     * Outputs or returns the debug marker, which is also used for title replacement when force rewrite is active.
     *
     * @param bool $echo Whether or not to echo the debug marker.
     *
     * @return string
     */
    public function debug_marker( $echo = true ) {
        return \'\';
    }

}

SO网友:Ogier Schelvis

我发现可以在函数中删除debug\\u标记操作。php。Yoast插件在wp\\u head操作中执行。我只是使用了紧随其后的动作挂钩,即wp\\u enqueue\\u脚本,并在那里挂接了一个删除debug\\u标记输出的函数。为此,还必须传递plugin对象。此外,优先级编号必须与插件中设置的优先级编号相同。

function remove_debugmarker(){
global $wpseo_front;
remove_action( \'wpseo_head\', array($wpseo_front, \'debug_marker\') , 2 );
}
add_action(\'wp_enqueue_scripts\',\'remove_debugmarker\');
但是,这不会删除

<!-- / Yoast WordPress SEO plugin. -->
部分,因为这在插件的关键包装函数head中得到了响应。您可以尝试覆盖它。

SO网友:Bryan Willis

要添加到Ahmad的答案中,您可以删除所有具有相同代码量的html注释,因为Yoast不是唯一一个这样做的插件。

   <?php
   function remove_html_comments_buffer_callback($buffer) {
        $buffer = preg_replace(\'/<!--[^\\[\\>\\<](.|\\s)*?-->/\', \'\', $buffer);
        return $buffer;
    }
    function remove_html_comments_buffer_start() {
        ob_start("remove_html_comments_buffer_callback");
    }
    function remove_html_comments_buffer_end() {
        ob_end_flush();
    }
    add_action(\'template_redirect\', \'remove_html_comments_buffer_start\', -1);
    add_action(\'get_header\', \'remove_html_comments_buffer_start\'); 
    add_action(\'wp_footer\', \'remove_html_comments_buffer_end\', 999);

SO网友:Adriano Monecchi

我遇到了一个从前端删除所有Yoast WordPress SEO评论的片段。它还修改了@bryan willis和@ahmad-m的答案使用的输出缓冲方法。

只需将片段放在主题的functions.php 或自定义插件/主题php文件。

I\'ll leave it here as a reference - credit goes to the snippet\'s author

/**
 * Yoast WordPress SEO Plugin - Remove All Yoast HTML Comments
 * See at: https://gist.github.com/paulcollett/4c81c4f6eb85334ba076
**/
if (defined(\'WPSEO_VERSION\')){
  add_action(\'get_header\',function (){ ob_start(function ($o){
  return preg_replace(\'/\\n?<.*?yoast.*?>/mi\',\'\',$o); }); });
  add_action(\'wp_head\',function (){ ob_end_flush(); }, 999);
}

SO网友:TarranJones

这是@ahmad-m的修改版本Answer, 通过应用过滤器,可以对标题html进行多个内容更改。

function header_str_replace_start(){
    ob_start(\'header_str_replace_output\');
}
function header_str_replace_output($output){
    return apply_filters(\'header_str_replace\', $output);
}
function header_str_replace_finish(){
    ob_end_flush();
}
add_action(\'get_header\', \'header_str_replace_start\',-1);
add_action(\'wp_head\', \'header_str_replace_finish\', 999);


add_filter( \'header_str_replace\', \'remove_yeost_seo_comments\' ) ;
add_filter( \'header_str_replace\', \'remove_white_space\');


function remove_yeost_seo_comments($output) {
    $output = str_ireplace(\'<!-- / Yoast SEO plugin. -->\', \'\', $output);
    return $output;
}


function remove_white_space($content){
     return trim(preg_replace(\'/\\s+/\', \' \', $content));
}

SO网友:Ov3rfly

找到了类似的解决方案functions.php 不使用硬编码优先级2 但动态读取并使用Yoast的优先级add_action().

// disable \'This site is optimized with the Yoast SEO ...\'
if ( class_exists( \'WPSEO_Frontend\') && method_exists( \'WPSEO_Frontend\', \'get_instance\' ) ) {
    $wpseo_front = WPSEO_Frontend::get_instance();
    if ( $wpseo_dbg_prio = has_action( \'wpseo_head\', array( $wpseo_front, \'debug_mark\' ) ) ) {
        remove_action( \'wpseo_head\', array( $wpseo_front, \'debug_mark\'), $wpseo_dbg_prio );
    }
}

SO网友:Wakanina

请参阅wordpress seo/frontend/class frontend中的flush\\u缓存函数。php

查找此行代码

$content = str_replace( $this->debug_marker( false ), $this->debug_marker( false ) . "\\n" . \'<title>\' . $title . \'</title>\', $content );
替换为

$content = str_replace( $this->debug_marker( false ), \'<title>\' . $title . \'</title>\', $content );
感谢这个伟大插件的创建者。

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $