Eliminar una acción de una clase externa

8

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 acerca de cómo esto puede ser poco ético, el autor dice que está bien hacerlo aquí: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-yoast-message-in-page-headers? replies = 29 # post-2503475

He encontrado la clase que agrega el comentario aquí: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Básicamente, la WPSEO_Frontendclase tiene una función llamada debug_markerque se llama entonces por una función llamada headque se añade a continuación a wp_headde__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 quitarle la debug_markerparte. Intenté esto pero no funciona remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

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

Brooke
fuente

Respuestas:

5

Una manera simple de lograr esto (pero sin el enfoque de Clase) es filtrando la salida del wp_headgancho de acción utilizando el búfer de salida .

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

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

Ahora en el functions.phparchivo de tema , declare su función de devolución de llamada de salida ( ad_filter_wp_head_outputen 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 functions.phpsin editar el header.phparchivo, puede enganchar get_headery wp_headenganchar acciones para definir la sesión de almacenamiento en 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;
}
Ahmad M
fuente
Seguí el método de enlace para no tener que editar header.php. Gracias.
Brooke
4

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

// 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
fuente
Esta es la mejor respuesta
sMyles
Si no puede obtener acceso al objeto de clase, puede usar my remove_class_actionpara eliminar la acción / filtro gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles
3

No creo que puedas hacer eso usando remove_action. El argumento de la función en remove_actionno le ayudará, ya que la debug_marker()función no era la función que se utilizó en la add_action()llamada.

Yoast presumiblemente tiene algo así como add_action( "wp_head", "head" )en su código. Por lo tanto, puede eliminar la función "head", pero debug_markerno se agregó explícitamente como una acción.

Tú podrías

  1. Edite el archivo fuente de Yoast y elimine la línea de comentario de depuración.
  2. Extienda la WPSEO_Frontendclase y sobrecargue la debug_markerfunción para devolver "". TBH, no estoy seguro de cómo funcionaría esto en términos de WP cargando el complemento, pero podría valer la pena investigarlo.
Steve Claridge
fuente
Gracias, realmente no quiero editar el archivo. Me interesaría aprender a extender la clase, pero esto está un poco fuera de mi conocimiento.
Brooke
Steve, estaba probando la solución 2 antes de toparte con tu publicación. Aunque estaba teniendo problemas para completar esto. Publiqué mi progreso como respuesta en esta página. wordpress.stackexchange.com/a/209800/84030 Le agradeceríamos su ayuda si tiene una idea de cómo podría resolver esto.
Adrien Be
2

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

Extienda la WPSEO_Frontendclase y sobrecargue la debug_markerfunción 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 junto a él".

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

Extiende la clase relevante.

Fue entonces cuando las cosas se complicaron. Agregué lo siguiente, pero mi función de anulación todavía no se activa 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 '';
    }

}
Adrien Be
fuente
1
¡Oh, gracias por señalar esto! Yoast WordPress Seo tiene un montón de acciones y filtros que nos permiten hacer cambios parciales en sus clases, el enfoque de extensión de clase podría ayudarme a deshacerme de algunas cosas en contextos específicos.
Adriano Monecchi
1

Descubrí que puedes eliminar la acción debug_marker en functions.php. El complemento Yoast se ejecuta en la acción wp_head. Acabo de tomar el gancho de acción que sigue directamente después de eso, es decir, wp_enqueue_scripts y allí conecté una función que eliminó la salida debug_marker. Para esto también debe pasar el objeto de complemento. 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 repite en la cabeza de la función de contenedor crucial del complemento . Podrías intentar sobrescribir eso.

Ogier Schelvis
fuente
1

Para agregar a la respuesta de Ahmad, puede 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);
Bryan Willis
fuente
1
+1 para el enfoque genérico. Uno podría tomar un tiempo para eliminar el comentario de Yoast SEO para descubrir que hay otro próximo después de instalar otro complemento.
Adrien Be
Sí, odio cuando los complementos hacen esto. Yoast, revslider, w3 total de caché y la mayoría de los otros complementos de caché / minificación, y muchos otros hacen esto.
Bryan Willis
1

Me encontré con un fragmento que elimina todos los comentarios SEO de Yoast WordPress del front-end. También modifica el enfoque de búfer de salida que utilizan las respuestas de @ bryan-willis y @ ahmad-m.

Simplemente coloque el fragmento en el functions.phparchivo php de su tema o de un complemento / tema personalizado.

Lo dejaré aquí como referencia: el crédito va 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);
}
Adriano Monecchi
fuente
0

Esta es una versión modificada de @ ahmad-m Answer , mediante la aplicación de filtros puede realizar múltiples cambios de contenido en el encabezado 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
fuente
0

Encontró una solución similar para la functions.phpque no utiliza la prioridad codificada, 2sino que lee y utiliza dinámicamente la prioridad de 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
fuente
-3

Vea 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.

Wakanina
fuente
Nunca cambie ningún archivo en ningún tema, complemento o núcleo si no es el autor. Además, no utilice este sitio por motivos promocionales.
Pieter Goosen
Lo siento, no estoy haciendo una promoción. Solo proporciono otra solución. Quizás no sea el mejor.
Wakanina
considere hacer una donación es promoción, o bien se beneficia directa o indirectamente de esta finansialy
Pieter Goosen