web-dev-qa-db-fra.com

Supprimer une action d'une classe externe

J'essaie de faire quelque chose de similaire à cette question ici: remove_action ou remove_filter avec des classes externes?

J'essaie d'enlever le

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

message du plugin.

Et avant de crier après moi à quel point cela peut être contraire à l'éthique, l'auteur dit qu'il est acceptable de le faire ici: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove -dangerous-insert-yoast-message-in-en-têtes? replies = 29 # post-2503475

J'ai trouvé la classe qui ajoute le commentaire ici: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Fondamentalement, la classe WPSEO_Frontend a une fonction nommée debug_marker qui est ensuite appelée par une fonction nommée head qui est ensuite ajoutée à wp_head dans __Construct

Je suis nouveau en classe, mais j'ai trouvé un moyen de retirer complètement la tête en faisant

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

mais je veux seulement enlever la partie debug_marker. J'ai essayé ça mais ça ne marche pas remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Comme je l'ai dit, je suis nouveau en classe, alors toute aide serait la bienvenue.

9
Brooke.

Un moyen simple d'y parvenir (mais sans l'approche Class) consiste à filtrer la sortie du hook wp_head à l'aide de output buffering .

Dans le header.php de votre thème, encapsulez l'appel wp_head() avec les fonctions ob_start($cb) et ob_end_flush(); telles que:

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

Maintenant, dans le fichier thème functions.php, déclarez votre fonction de rappel en sortie (ad_filter_wp_head_output dans ce cas):

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 vous voulez faire tout cela à travers le fichier functions.php sans éditer le fichier header.php, vous pouvez vous connecter aux hooks d'action get_header et wp_head pour définir la session de mise en mémoire tampon de sortie:

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;
}
6
Ahmad M

Merci pour toute votre aide, je l'ai finalement résolu. J'ai créé un functions.php pour mon thème enfant, puis ajoutez

// 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 );
4
Mike Lecomte

Je ne pense pas que vous allez pouvoir le faire en utilisant remove_action. L'argument de la fonction dans remove_action ne vous aidera pas, car la fonction debug_marker() n'était pas la fonction utilisée dans l'appel add_action().

Yoast a probablement quelque chose comme add_action( "wp_head", "head" ) dans son code. Vous pouvez donc supprimer la fonction "head", mais debug_marker n'a pas été explicitement ajouté en tant qu'action.

Vous pourriez

  1. Editez le fichier source de Yoast et supprimez la ligne de commentaire de débogage.
  2. Étendez la classe WPSEO_Frontend et surchargez la fonction debug_marker pour renvoyer "". TBH, je ne suis pas sûr de savoir comment cela fonctionnerait en termes de WP charger le plugin, mais cela pourrait valoir la peine d’être étudié.
3
Steve Claridge

Trouver ce fil après avoir travaillé sur la même solution que celle mentionnée par Steve Claridge , c'est-à-dire:

Étendre la classe WPSEO_Frontend et surcharger la fonction debug_marker pour renvoyer ""

J'ai détaillé les étapes ci-dessous, même si je suis coincé dans la dernière étape.


Créer un plugin de personnalisation

Comme mentionné dans cet article de WP Tavern , "le moyen le plus simple d'y parvenir est de créer un plugin de fonctionnalité qui s'exécutera à côté de celui-ci".

Je suis donc allé à créant mon premier plugin à la suite de cet article de ElegantTheme .

Étendre la classe pertinente.

C'est à ce moment que les choses se sont compliquées. J'ai ajouté ce qui suit, mais ma fonction prioritaire n'est toujours pas déclenchée pour une raison quelconque.

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

}
2
Adrien Be

J'ai constaté que vous pouvez supprimer l'action debug_marker dans functions.php. Le plug-in Yoast est exécuté dans l'action wp_head. Je viens de prendre le hook d’action qui suit directement après cela, à savoir wp_enqueue_scripts et j’y ai accroché une fonction qui a supprimé la sortie debug_marker. Pour cela, vous devez également passer l'objet plugin. De plus, le numéro de priorité doit être identique à celui défini dans le 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');

Cependant, cela ne supprime pas le

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

partie, parce que cela se répercute dans la fonction d’emballage cruciale du plugin head . Vous pouvez essayer d'écraser cela.

1
Ogier Schelvis

Pour ajouter à la réponse d'Ahmad, vous pouvez simplement supprimer tous les commentaires html avec la même quantité de code, car Yoast n'est pas le seul plug-in à le faire.

   <?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
Bryan Willis

Je suis tombé sur un extrait qui supprime tous les commentaires Yoast WordPress SEO du début à la fin. Il modifie également l'approche de mise en mémoire tampon de sortie utilisée par les réponses de @ bryan-willis et de @ ahmad-m.

Placez simplement l'extrait de code sur le functions.php de votre thème ou sur un fichier php de plugin/thème personnalisé.

Je le laisse ici comme référence - le mérite revient à l'auteur de l'extrait de code

/**
 * 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);
}
1
Adriano Monecchi

Ceci est une version modifiée de @ ahmad-m Answer , en appliquant des filtres, vous pouvez apporter plusieurs modifications au contenu de l'en-tête 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
TarranJones