Eliminar una acción de una clase externa

9

Estoy tratando de hacer algo similar a esta pregunta aquí: remove_action o remove_filter con clases externas?

Estoy tratando de eliminar el

  

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

mensaje del complemento.

Y antes de que me grites que esto puede ser poco ético, el autor dice que está bien hacerlo aquí: enlace

He encontrado la clase que agrega el comentario aquí: enlace

Básicamente, la clase WPSEO_Frontend tiene una función llamada debug_marker que luego es llamada por una función llamada head que luego se agrega a wp_head en __Construct

Soy nuevo en las clases, pero encontré una manera de eliminar completamente la cabeza haciendo

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

pero solo quiero eliminar la parte debug_marker de ella. Probé esto pero no funciona remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Como dije, soy nuevo en las clases, así que cualquier ayuda sería genial.

    
pregunta BandonRandon 06.12.2012 - 10:15

9 respuestas

6

Una forma sencilla de lograr esto (pero sin el enfoque de Clase) es filtrar la salida del gancho de acción wp_head usando búfer de salida .

En el tema header.php , envuelva la llamada wp_head() con las funciones ob_start($cb) y ob_end_flush(); como:

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

Ahora en el archivo de tema functions.php , declare su función de devolución de llamada de salida ( ad_filter_wp_head_output en este 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;
}

Si desea hacer todo eso a través del archivo functions.php sin editar el archivo header.php , puede enlazar a los ganchos de acción get_header y wp_head para definir la sesión de búfer de salida:

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

Gracias por toda su ayuda, finalmente lo resolví. Creé un functions.php para el tema de mi hijo, luego añado

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

No creo que puedas hacerlo usando remove_action . El argumento de la función en remove_action no te ayudará, ya que la función debug_marker() no fue la función que se utilizó en la llamada add_action() .

Es probable que Yoast tenga algo como add_action( "wp_head", "head" ) en su código. Así que puedes eliminar la función "cabeza", pero debug_marker no se agregó explícitamente como una acción.

Podrías

  1. Edite el archivo fuente de Yoast y elimine la línea de comentarios de depuración.
  2. Extienda la clase WPSEO_Frontend y sobrecargue la función debug_marker para devolver "". TBH, no estoy seguro de cómo funcionaría esto en términos de que WP cargue el complemento, pero podría valer la pena investigar.
respondido por el Steve Claridge 06.12.2012 - 12:37
2

Encontrar este hilo después de trabajar en la misma solución que el mencionado por Steve Claridge , es decir:

Extienda la clase WPSEO_Frontend y sobrecargue la función debug_marker para devolver ""

Detallé los pasos a continuación, aunque me estoy atascando en el paso final.

Crear un complemento de personalización

Como se menciona en este artículo de WP Tavern , "La forma más fácil de lograr esto es crear un complemento de funcionalidad que se ejecute a su lado".

Así que pasé a creando mi primer complemento después de este artículo de ElegantTheme .

Extiende la clase relevante.

Ahí es cuando las cosas se complicaron. Agregué lo siguiente, pero mi función de reemplazo aún no está activada por alguna razón.

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

}
    
respondido por el Adrien Be 25.11.2015 - 10:26
1

Descubrí que puedes eliminar la acción debug_marker en functions.php. El complemento de Yoast se ejecuta en la acción wp_head. Acabo de tomar el enganche de acción que sigue directamente después de eso, a saber wp_enqueue_scripts y allí enganché una función que eliminó la salida debug_marker. Para esto también tienes que pasar el objeto plugin. Además, el número de prioridad debe ser el mismo que el establecido desde el complemento.

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

Sin embargo, esto no elimina el

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

parte, porque eso se refleja en la crucial función de envoltorio del plugin head . Puedes intentar sobrescribir eso.

    
respondido por el Ogier Schelvis 27.01.2014 - 13:35
1

Para agregar a la respuesta de Ahmad, puedes eliminar todos los comentarios html con la misma cantidad de código, ya que Yoast no es el único complemento que hace eso.

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

Encontré un fragmento que elimina todos los comentarios de Yoast WordPress SEO de la parte delantera. También modifica el enfoque del búfer de salida que utilizan las respuestas de @ bryan-willis y @ ahmad-m.

Simplemente coloque el fragmento en su tema functions.php o en un archivo php de plugin / tema personalizado.

Lo dejaré aquí como referencia: el crédito se otorga al autor del fragmento

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

Esta es una versión modificada de @ ahmad-m Responder , al aplicar filtros, puede realizar múltiples cambios de contenido. a la cabecera 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));
}
    
respondido por el TarranJones 12.02.2016 - 17:30
-3

Ver la función flush_cache en wordpress-seo / frontend / class-frontend.php

Encuentra esta línea de código

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

Reemplazar con

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

Gracias al creador de este gran complemento.

    
respondido por el Wakanina 09.02.2015 - 07:26

Lea otras preguntas en las etiquetas