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.

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

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

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.

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

}

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.


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

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

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

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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.