Remover uma ação de uma classe externa

9

Estou tentando fazer algo semelhante a essa pergunta aqui: remove_action ou remove_filter com classes externas?

Estou tentando remover o

  

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

mensagem do plug-in.

E antes de você gritar comigo sobre como isso pode ser antiético o autor diz que não há problema em fazer aqui: enlace

Encontrei a classe que adiciona o comentário aqui: enlace

Basicamente, a classe WPSEO_Frontend tem uma função chamada debug_marker , que é então chamada por uma função chamada head , que é então adicionada a wp_head in __Construct

Sou novo nas aulas, mas encontrei uma maneira de remover completamente a cabeça fazendo

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

mas eu só quero remover a parte debug_marker dela. Eu tentei isso, mas não funciona remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Como eu disse, sou novo nas aulas, então qualquer ajuda seria ótima.

    
por BandonRandon 06.12.2012 / 10:15

9 respostas

6

Uma maneira simples de conseguir isso (mas sem a abordagem Class) é filtrar a saída do wp_head action hook usando o buffer de saída .

No header.php do seu tema, envolva a chamada wp_head() com ob_start($cb) e ob_end_flush(); funções como:

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

Agora, no tema functions.php file, declare sua função de callback de saída ( ad_filter_wp_head_output neste caso):

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

Se você quiser fazer tudo isso por meio do arquivo functions.php sem editar o arquivo header.php , poderá conectar os ganchos get_header e wp_head action para definir a sessão de buffer de saída:

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;
}
    
por Ahmad M 06.12.2012 / 17:05
4

Obrigado por toda sua ajuda, eu finalmente resolvi isso. Eu criei um functions.php para o meu tema filho, em seguida, adicione

// 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 );
    
por Mike Lecomte 01.12.2015 / 16:54
3

Eu não acho que você conseguirá fazer isso usando remove_action . O argumento de função em remove_action não ajudará você, pois a função debug_marker() não era a função usada na chamada add_action() .

O Yoast, presumivelmente, tem algo parecido com add_action( "wp_head", "head" ) em seu código. Assim, você pode remover a função "head", mas debug_marker não foi explicitamente adicionado como uma ação.

Você poderia

  1. Edite o arquivo de origem do Yoast e remova a linha de comentários de depuração.
  2. Estenda a classe WPSEO_Frontend e sobrecarregue a função debug_marker para retornar "". TBH, não tenho certeza de como isso funcionaria em termos de WP carregando o plugin, mas valeria a pena investigar.
por Steve Claridge 06.12.2012 / 12:37
2

Encontrando este segmento depois de trabalhar na mesma solução que aquele mencionado por Steve Claridge , ou seja:

Estenda a classe WPSEO_Frontend e sobrecarregue a função debug_marker para retornar ""

Eu detalhei os passos abaixo, embora eu esteja ficando preso na etapa final.

Crie um plugin de personalização

Como mencionado em este artigo da WP Tavern , "A maneira mais fácil de conseguir isso é criar um plugin de funcionalidade que será executado ao lado dele".

Então eu fui para criar meu primeiro plugin seguindo este artigo de ElegantTheme .

Estenda a turma relevante.

Foi quando as coisas ficaram complicadas. Eu adicionei o seguinte, mas a minha função de substituição ainda não é acionada por algum motivo.

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

}
    
por Adrien Be 25.11.2015 / 10:26
1

Descobri que você pode remover a ação debug_marker em functions.php. O plugin Yoast é executado na ação wp_head. Eu apenas peguei o hook de ação que segue diretamente depois disso, ou seja, wp_enqueue_scripts e aí eu enganchei uma função que removeu a saída debug_marker. Para isso você também tem que passar o objeto plugin. Além disso, o número de prioridade deve ser o mesmo que o conjunto de dentro do plugin.

function remove_debugmarker(){
global $wpseo_front;
remove_action( 'wpseo_head', array($wpseo_front, 'debug_marker') , 2 );
}
add_action('wp_enqueue_scripts','remove_debugmarker');

No entanto, isso não remove o

<!-- / Yoast WordPress SEO plugin. -->

parte, porque isso é ecoado na função de wrapper crucial do plugin head . Você poderia tentar sobrescrever isso.

    
por Ogier Schelvis 27.01.2014 / 13:35
1

Para adicionar à resposta de Ahmad você pode remover todos os comentários html com a mesma quantidade de código, já que o Yoast não é o único plugin que faz isso.

   <?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);
    
por Bryan Willis 28.06.2015 / 05:06
1

Eu encontrei um trecho que remove todos os comentários do Yoast WordPress SEO do front end. Também modifica a abordagem de buffer de saída que as respostas de @ bryan-willis e @ ahmad-m usam.

Basta colocar o snippet no arquivo functions.php do seu tema ou em um arquivo plugin / theme php personalizado.

Vou deixar aqui como referência - o crédito vai para o autor do snippet

/**
 * 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);
}
    
por Adriano Monecchi 15.06.2016 / 18:38
0

Esta é uma versão modificada do @ ahmad-m Resposta , aplicando filtros você pode fazer várias alterações de conteúdo para o cabeçalho 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));
}
    
por TarranJones 12.02.2016 / 17:30
-3

Veja a função flush_cache no wordpress-seo / frontend / class-frontend.php

Encontre esta linha de código

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

Substituir por

$content = str_replace( $this->debug_marker( false ), '<title>' . $title . '</title>', $content );

Obrigado ao criador deste ótimo plugin.

    
por Wakanina 09.02.2015 / 07:26