Remover uma ação de uma classe externa

8

Estou tentando fazer algo semelhante a esta 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 plugin.

E antes que você grite comigo sobre como isso pode ser antiético, o autor diz que não há problema em fazer aqui: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-yoast-message-in-page-headers? answers = 29 # post-2503475

Encontrei a classe que adiciona o comentário aqui: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Basicamente, a WPSEO_Frontendclasse tem uma função chamada debug_markerque é então chamado por uma função chamada headque é então adicionado a wp_headem__Construct

Sou iniciante 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 debug_markerparte dele. Eu tentei isso, mas não funciona remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

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

Brooke.
fonte

Respostas:

5

Uma maneira simples de conseguir isso (mas sem a abordagem de classe) é filtrando a saída do wp_headgancho de ação usando o buffer de saída .

Nos temas header.php, encerre a wp_head()chamada 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 functions.phparquivo do tema , declare sua função de retorno de chamada de saída ( ad_filter_wp_head_outputneste 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 através do arquivo functions.phpsem edição header.php, poderá conectar get_headere wp_headganchos de ação 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;
}
Ahmad M
fonte
Eu fui com o método hook para não precisar editar o header.php. Obrigado.
Brooke.
4

Obrigado por toda a sua ajuda, eu finalmente resolvi. Criei um functions.php para o meu tema filho e, 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 );
Mike Lecomte
fonte
Esta é a melhor resposta
sMyles
Se você não pode ter acesso ao objeto de classe, você pode usar o meu remove_class_actionpara remover a ação / filtro gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
Smyles
3

Eu não acho que você será capaz de fazer isso usando remove_action. O argumento da função in remove_actionnão o ajudará, pois a debug_marker()função não foi a função usada na add_action()chamada.

Yoast presumivelmente tem algo parecido add_action( "wp_head", "head" )em seu código. Portanto, você pode remover a função "head", mas debug_markernão foi explicitamente adicionada como uma ação.

Você poderia

  1. Edite o arquivo de origem do Yoast e remova a linha de comentário de depuração.
  2. Estenda a WPSEO_Frontendclasse e sobrecarregue a debug_markerfunção para retornar "". TBH, não tenho certeza de como isso funcionaria em termos de carregamento do plugin pelo WP, mas poderia valer a pena investigar.
Steve Claridge
fonte
Obrigado, eu realmente não quero editar o arquivo. Eu estaria interessado em aprender como estender a aula, mas isso está um pouco fora do meu conhecimento.
Brooke.
Steve, eu estava tentando a solução 2 antes de topar com sua postagem. Embora eu estivesse tendo problemas para concluir isso. Postei meu progresso como resposta nesta página. wordpress.stackexchange.com/a/209800/84030 Sua ajuda seria apreciada se você tiver uma idéia de como eu poderia resolver isso.
Adrien Seja
2

Localizando esse thread depois de trabalhar na mesma solução mencionada porSteve Claridge , ou seja:

Estenda a WPSEO_Frontendclasse e sobrecarregue a debug_markerfunção para retornar ""

Eu detalhei as etapas abaixo, embora eu esteja ficando preso na etapa final.


Crie um plug-in de personalização

Como mencionado neste artigo do WP Tavern , "a maneira mais fácil de fazer isso é criar um plug-in de funcionalidade que será executado ao lado dele".

Então, eu comecei a criar meu primeiro plugin, seguindo este artigo do ElegantTheme .

Estenda a classe relevante.

Foi quando as coisas ficaram complicadas. Eu adicionei o seguinte, mas 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 '';
    }

}
Adrien Be
fonte
11
Oh, obrigado por apontar isso! O Yoast WordPress Seo tem várias ações e filtros que nos permitem fazer alterações parciais em suas classes, a abordagem de extensão de classe pode me ajudar muito a me livrar de algumas coisas em contextos específicos.
Adriano Monecchi 15/06
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 gancho de ação que se segue diretamente a seguir, ou seja, wp_enqueue_scripts e lá enganchei uma função que removeu a saída debug_marker. Para isso, você também precisa passar o objeto do plugin. Além disso, o número de prioridade deve ser igual ao número definido no plug-in.

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 cabeça da função de invólucro crucial do plug-in . Você pode tentar substituir isso.

Ogier Schelvis
fonte
1

Para adicionar à resposta do 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);
Bryan Willis
fonte
11
+1 para a abordagem genérica. Pode demorar um pouco para remover o comentário do Yoast SEO e descobrir apenas que existe outro após a instalação de outro plug-in.
Adrien Seja
Sim, eu odeio quando plugins fazem isso. Yoast, revslider, cache total do w3 e a maioria dos outros plugins de cache / minificação, e muitos outros fazem isso.
Bryan Willis
1

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

Simplesmente coloque o snippet no seu tema functions.phpou em um arquivo php de plugin / tema 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);
}
Adriano Monecchi
fonte
0

Esta é uma versão modificada do @ ahmad-m Answer . Ao aplicar filtros, você pode fazer várias alterações no conteúdo do 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));
}
TarranJones
fonte
0

Foi encontrada uma solução semelhante para a functions.phpqual não usa prioridade codificada, 2mas lê e usa dinamicamente a prioridade do 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 );
    }
}
Ov3rfly
fonte
-3

Veja a função flush_cache em 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 com

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

Obrigado ao criador deste ótimo plugin.

Wakanina
fonte
Nunca altere nenhum arquivo em nenhum tema, plugin ou núcleo se você não for o autor. Além disso, não use este site por motivos promocionais.
Pieter Goosen
Desculpe, não estou fazendo uma promoção. Eu apenas forneço outra solução. Talvez não seja o melhor.
Wakanina 9/02/2015
considere fazer uma doação é a promoção, você quer beneficiar direta ou indiretamente deste finansialy
Pieter Goosen