从外部类中删除动作


8

我正在尝试执行与此问题类似的操作:使用外部类的remove_action或remove_filter?

我正在尝试删除

<!-- 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在页面标题中插入酵母消息?回复= 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 );

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

Answers:


5

一种简单的方法(但没有Class方法)是通过wp_head使用输出缓冲对动作钩子的输出进行过滤。

在您的主题中header.phpwp_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;
}

我使用了hook方法,因此不必编辑header.php。谢谢。
布鲁克。

4

感谢您的所有帮助,我终于解决了。我为子主题创建了一个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 );

这是最好的答案
sMyles

如果您无法访问类对象,则可以使用my remove_class_action删除操作/过滤器gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles

3

我认为您将无法使用做到这一点remove_action。中的function参数对remove_action您没有帮助,因为该debug_marker()函数不是add_action()调用中使用的函数。

Yoast大概add_action( "wp_head", "head" )在他的代码中有类似的东西。因此,您可以删除“ head”功能,但未debug_marker明确将其添加为操作。

你可以

  1. 编辑Yoast的源文件,并删除调试注释行。
  2. 扩展WPSEO_Frontend类并重载debug_marker函数以返回“”。TBH,我不确定在WP加载插件方面如何工作,但是值得研究。

谢谢,我真的不想编辑该文件。我会对学习如何扩展课程感兴趣,但这是我的知识。
布鲁克。

史蒂夫,在尝试您的文章之前,我正在尝试解决方案2。尽管我在完成此操作时遇到问题。我在此页面上发布了进度作为答案。wordpress.stackexchange.com/a/209800/84030如果您有想法可以解决这个问题,我们将不胜感激。
Adrien Be

2

在与提及的Steve Claridge解决方案相同的解决方案上找到该线程后,即:

扩展WPSEO_Frontend类并重载debug_marker函数以返回“”

尽管陷入了最后一步,但我详细介绍了以下步骤。


创建一个自定义插件

正如WP Tavern本文中所提到的,“完成此操作的最简单方法是创建一个可与其一起运行的功能插件”。

因此,我根据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 '';
    }

}

1
哦,谢谢你指出这一点!Yoast WordPress Seo有很多操作和过滤器,使我们可以对其类进行部分更改,类扩展方法可能会帮助我在特定上下文中摆脱一些困扰。
Adriano Monecchi

1

我发现您可以在functions.php中删除debug_marker操作。Yoast插件在wp_head操作中执行。我只是接了紧随其后的动作钩子,即wp_enqueue_scripts,在那里我钩了一个删除debug_marker输出的函数。为此,您还必须传递插件对象。另外,优先级编号必须与插件中的优先级编号相同。

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中得到了回应。您可以尝试覆盖它。


1

要添加到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);

1
+1为通用方法。可能需要一段时间删除Yoast SEO注释,才能发现在安装另一个插件之后又出现了另一个。
Adrien Be

是的,我讨厌插件这样做。Yoast,revslider,w3总高速缓存和大多数其他高速缓存/最小化插件,还有很多其他都可以做到这一点。
布赖恩·威利斯

1

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

只需将代码段放置在您的主题functions.php或自定义插件/主题php文件上。

我将其留作参考-摘录的作者

/**
 * 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);
}

0

这是@ 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));
}

0

找到了一个类似的解决方案,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 );
    }
}

-3

请参阅wordpress-seo / frontend / class-frontend.php中的flush_cache函数

找到这行代码

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

感谢这个出色的插件的创建者。


如果您不是作者,切勿更改任何主题,插件或核心中的任何文件。另外,请勿出于促销目的使用本网站。
Pieter Goosen 2015年

抱歉,我没有晋升。我只是提供另一个解决方案。也许不是最好的。
Wakanina

考虑捐赠是一种晋升,您可以直接或间接地从此财务中受益
Pieter Goosen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.