Supprimer une action d'une classe externe

8

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

J'essaie de supprimer 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 me crier sur la façon dont cela peut être contraire à l'éthique, l'auteur dit que c'est correct de le faire ici: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -insert-yoast-message-in-page-headers? 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 WPSEO_Frontendclasse a une fonction nommée debug_markerqui est ensuite appelée par une fonction nommée headqui est ensuite ajoutée à wp_headdans__Construct

Je suis nouveau dans les cours 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 en retirer la debug_markerpièce. J'ai essayé 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, donc toute aide serait formidable.

Brooke.
la source

Réponses:

5

Un moyen simple d'y parvenir (mais sans l'approche Class) consiste à filtrer la sortie du wp_headhook d'action à l'aide de la mise en mémoire tampon de sortie .

Dans votre thème header.php, encapsulez l' wp_head()appel avec ob_start($cb)et des ob_end_flush();fonctions comme:

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

Maintenant, dans le functions.phpfichier de thème , déclarez votre fonction de rappel de sortie ( ad_filter_wp_head_outputdans 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.phpsans modification header.php, vous pouvez vous accrocher à get_headeret wp_headcrochets d'action 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;
}
Ahmad M
la source
J'ai choisi la méthode hook pour ne pas avoir à modifier header.php. Merci.
Brooke.
4

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

// 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
la source
Ceci est la meilleure réponse
sMyles
Si vous ne pouvez pas accéder à l'objet de classe, vous pouvez utiliser my remove_class_actionpour supprimer l'action / le filtre gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles
3

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

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

Vous pourriez

  1. Modifiez le fichier source de Yoast et supprimez la ligne de commentaire de débogage.
  2. Étendez la WPSEO_Frontendclasse et surchargez la debug_markerfonction pour retourner "". TBH, je ne sais pas comment cela fonctionnerait en termes de chargement de WP par le plugin, mais cela pourrait valoir la peine d'être étudié.
Steve Claridge
la source
Merci, je ne veux vraiment pas modifier le fichier. Je serais intéressé à apprendre comment prolonger la classe mais c'est un peu hors de mes connaissances.
Brooke.
Steve, j'essayais la solution 2 avant de tomber sur votre message. Même si j'avais du mal à terminer cela. J'ai posté ma progression comme réponse dans cette page. wordpress.stackexchange.com/a/209800/84030 Votre aide serait appréciée si vous avez une idée de la façon dont je pourrais résoudre ce problème.
Adrien Be
2

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

Étendez la WPSEO_Frontendclasse et surchargez la debug_markerfonction pour retourner ""

J'ai détaillé les étapes ci-dessous, bien que je sois coincé dans la dernière étape.


Créer un plugin de personnalisation

Comme mentionné dans cet article de WP Tavern , "la façon la plus simple d'y parvenir est de créer un plugin de fonctionnalité qui fonctionnera à côté".

J'ai donc continué à créer mon premier plugin suite à cet article de ElegantTheme .

Étendez la classe appropriée.

C'est alors 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 '';
    }

}
Adrien Be
la source
1
Oh, merci de l'avoir signalé! Yoast WordPress Seo a un tas d'actions et de filtres qui nous permettent de n'apporter que des modifications partielles à ses classes, l'approche d'extension de classe pourrait m'aider à me débarrasser de certaines choses dans des contextes spécifiques.
Adriano Monecchi
1

J'ai trouvé que vous pouvez supprimer l'action debug_marker dans functions.php. Le plugin Yoast est exécuté dans l'action wp_head. Je viens de prendre le crochet d'action qui suit directement après cela, à savoir wp_enqueue_scripts et là j'ai accroché une fonction qui a supprimé la sortie debug_marker. Pour cela, vous devez également passer l'objet plugin. Le numéro de priorité doit également être le même que celui défini à partir du plugin.

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 est répercuté dans la tête de fonction d'enveloppe cruciale du plugin . Vous pouvez essayer d'écraser cela.

Ogier Schelvis
la source
1

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 plugin à 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);
Bryan Willis
la source
1
+1 pour l'approche générique. On pourrait prendre un certain temps pour supprimer le commentaire SEO de Yoast pour découvrir seulement qu'il y en a un autre après avoir installé un autre plugin.
Adrien Be
Oui, je déteste les plugins faire ça. Yoast, revslider, w3 total cache et la plupart des autres plugins de cache / minification, et une tonne d'autres le font.
Bryan Willis
1

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

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

Je vais le laisser 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);
}
Adriano Monecchi
la source
0

Il s'agit d'une version modifiée de @ ahmad-m Answer , en appliquant des filtres, vous pouvez apporter plusieurs modifications de contenu à 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));
}
TarranJones
la source
0

Trouvé une solution similaire pour functions.phplaquelle n'utilise pas la priorité codée en dur 2mais lit et utilise dynamiquement la priorité 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
la source
-3

Voir la fonction flush_cache dans wordpress-seo / frontend / class-frontend.php

Trouvez cette ligne de code

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

Remplacer par

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

Merci au créateur de ce super plugin.

Wakanina
la source
Ne modifiez jamais un fichier dans un thème, un plugin ou un noyau si vous n'êtes pas l'auteur. Aussi, veuillez ne pas utiliser ce site pour des raisons promotionnelles.
Pieter Goosen,
Désolé, je ne fais pas de promotion. Je fournis juste une autre solution. Peut-être pas le meilleur.
Wakanina
envisager de faire un don est une promotion, vous bénéficiez directement ou indirectement de ce financement
Pieter Goosen