Entfernen Sie eine Aktion aus einer externen Klasse

8

Ich versuche hier etwas Ähnliches wie diese Frage zu tun: remove_action oder remove_filter mit externen Klassen?

Ich versuche das zu entfernen

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

Nachricht vom Plugin.

Und bevor Sie mich anschreien, wie unethisch dies sein könnte, sagt der Autor, dass es in Ordnung ist, dies hier zu tun: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-yoast-message-in-page-headers? replies = 29 # post-2503475

Ich habe die Klasse gefunden, die den Kommentar hier hinzufügt: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Grundsätzlich hat die WPSEO_FrontendKlasse eine Funktion namens, debug_markerdie dann von einer Funktion namens benannt wird, headdie dann zu wp_headin hinzugefügt wird__Construct

Ich bin neu im Unterricht, aber ich habe einen Weg gefunden, den Kopf dadurch vollständig zu entfernen

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

aber ich möchte nur das debug_markerTeil daraus entfernen . Ich habe es versucht, aber es funktioniert nicht remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Wie gesagt, ich bin neu im Unterricht, daher wäre jede Hilfe großartig.

Brooke.
quelle

Antworten:

5

Eine einfache Möglichkeit, dies zu erreichen (jedoch ohne den Class-Ansatz), besteht darin, die Ausgabe des wp_headAktionshakens mithilfe der Ausgabepufferung zu filtern .

header.phpSchließen Sie den wp_head()Anruf in Ihr Thema ein ob_start($cb)und ob_end_flush();funktionieren Sie wie folgt:

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

functions.phpDeklarieren Sie jetzt in der Themendatei Ihre Ausgabe-Rückruffunktion ( ad_filter_wp_head_outputin diesem Fall):

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

Wenn Sie all dies über die Datei functions.phpohne Bearbeitung header.phpausführen möchten , können Sie Hooks get_headerund wp_headAction-Hooks einbinden, um die Ausgabepuffersitzung zu definieren:

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.
quelle
Ich habe mich für die Hook-Methode entschieden, damit ich header.php nicht bearbeiten muss. Vielen Dank.
Brooke.
4

Vielen Dank für all Ihre Hilfe, ich habe es endlich gelöst. Ich habe eine functions.php für mein untergeordnetes Thema erstellt und dann hinzugefügt

// 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
quelle
Dies ist die beste Antwort
sMyles
Wenn Sie keinen Zugriff auf das Klassenobjekt erhalten, können Sie mit my remove_class_actiondie Aktion / den Filter gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles
3

Ich glaube nicht, dass Sie dazu in der Lage sein werden remove_action. Das Funktionsargument in remove_actionhilft Ihnen nicht, da die debug_marker()Funktion nicht die Funktion war, die im add_action()Aufruf verwendet wurde.

Yoast hat vermutlich so etwas add_action( "wp_head", "head" )in seinem Code. Sie können also die "Kopf" -Funktion entfernen, die jedoch debug_markernicht explizit als Aktion hinzugefügt wurde.

Du könntest

  1. Bearbeiten Sie die Quelldatei von Yoast und entfernen Sie die Debug-Kommentarzeile.
  2. Erweitern Sie die WPSEO_FrontendKlasse und überladen Sie die debug_markerFunktion, um "" zurückzugeben. TBH, ich bin mir nicht sicher, wie dies in Bezug auf das Laden des Plugins durch WP funktionieren würde, könnte aber eine Untersuchung wert sein.
Steve Claridge
quelle
Danke, ich möchte die Datei wirklich nicht bearbeiten. Ich würde gerne lernen, wie man die Klasse erweitert, aber das liegt etwas außerhalb meines Wissens.
Brooke.
Steve, ich habe Lösung 2 ausprobiert, bevor ich auf deinen Beitrag gestoßen bin. Obwohl ich Probleme hatte, dies zu vervollständigen. Ich habe meinen Fortschritt als Antwort auf dieser Seite veröffentlicht. wordpress.stackexchange.com/a/209800/84030 Ihre Hilfe wäre dankbar, wenn Sie eine Idee hätten, wie ich das lösen könnte.
Adrien Be
2

Finden dieses Threads nach der Arbeit an derselben Lösung wie der vonSteve Claridge , das heißt:

Erweitern Sie die WPSEO_FrontendKlasse und überladen Sie die debug_markerFunktion, um "" zurückzugeben.

Ich habe die folgenden Schritte detailliert beschrieben, obwohl ich im letzten Schritt stecken bleibe.


Erstellen Sie ein Anpassungs-Plugin

Wie in diesem Artikel von WP Tavern erwähnt , "besteht der einfachste Weg, dies zu erreichen, darin, ein Funktions-Plugin zu erstellen, das daneben ausgeführt wird".

Also habe ich mein erstes Plugin nach diesem Artikel von ElegantTheme erstellt .

Erweitern Sie die entsprechende Klasse.

Dann wurde es kompliziert. Ich habe Folgendes hinzugefügt, aber meine überschreibende Funktion wird aus irgendeinem Grund immer noch nicht ausgelöst.

//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
quelle
1
Oh, danke, dass du darauf hingewiesen hast! Yoast WordPress Seo verfügt über eine Reihe von Aktionen und Filtern, mit denen wir nur teilweise Änderungen an seinen Klassen vornehmen können. Der Ansatz der Klassenerweiterung kann mir dabei helfen, einige Dinge in bestimmten Kontexten loszuwerden.
Adriano Monecchi
1

Ich habe festgestellt, dass Sie die Aktion debug_marker in functions.php entfernen können. Das Yoast-Plugin wird in der Aktion wp_head ausgeführt. Ich habe gerade den direkt darauf folgenden Action-Hook genommen, nämlich wp_enqueue_scripts, und dort eine Funktion eingebunden, die die debug_marker-Ausgabe entfernt hat. Dazu müssen Sie auch das Plugin-Objekt übergeben. Außerdem muss die Prioritätsnummer mit der im Plugin festgelegten übereinstimmen.

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

Dies entfernt jedoch nicht die

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

Teil, denn das ist in der Plugin-entscheidenden Wrapper - Funktion Echo Kopf . Sie könnten versuchen, das zu überschreiben.

Ogier Schelvis
quelle
1

Um Ahmads Antwort zu ergänzen, können Sie einfach alle HTML-Kommentare mit der gleichen Menge Code entfernen, da Yoast nicht das einzige Plugin ist, das dies tut.

   <?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
quelle
1
+1 für den generischen Ansatz. Es kann eine Weile dauern, bis der Yoast SEO-Kommentar entfernt ist, um festzustellen, dass nach der Installation eines anderen Plugins ein weiterer Kommentar angezeigt wird.
Adrien Be
Ja, ich hasse es, wenn Plugins dies tun. Yoast, Revslider, W3 Total Cache und die meisten anderen Cache / Minification-Plugins und eine Menge andere tun dies.
Bryan Willis
1

Ich bin auf einen Ausschnitt gestoßen, der alle SEO-Kommentare von Yoast WordPress aus dem Frontend entfernt. Es ändert auch den Ansatz der Ausgabepufferung, den die Antworten von @ bryan-willis und @ ahmad-m verwenden.

Platzieren Sie das Snippet einfach auf Ihrem Thema functions.phpoder einer benutzerdefinierten Plugin / Theme-PHP-Datei.

Ich werde es hier als Referenz belassen - die Gutschrift geht an den Autor des Snippets

/**
 * 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
quelle
0

Dies ist eine modifizierte Version von @ ahmad-m Answer . Durch Anwenden von Filtern können Sie mehrere Inhaltsänderungen am Header-HTML vornehmen.

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
quelle
0

Es wurde eine ähnliche Lösung gefunden, für functions.phpdie keine fest codierte Priorität verwendet wird, 2sondern die Priorität von Yoast dynamisch gelesen und verwendet wird 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
quelle
-3

Siehe die Funktion flush_cache in der Datei wordpress-seo / frontend / class-frontend.php

Suchen Sie diese Codezeile

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

Ersetzen mit

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

Vielen Dank an den Schöpfer dieses großartigen Plugins.

Wakanina
quelle
Ändern Sie niemals eine Datei in einem Thema, Plugin oder Core, wenn Sie nicht der Autor sind. Bitte benutzen Sie diese Seite auch nicht aus Werbegründen.
Pieter Goosen
Entschuldigung, ich mache keine Promotion. Ich biete nur eine andere Lösung. Vielleicht nicht das Beste.
Wakanina
Wenn Sie eine Spende als Beförderung betrachten, profitieren Sie entweder direkt oder indirekt von dieser Finanzierung
Pieter Goosen