wake-up-neo.net

Entfernen Sie eine Aktion aus einer externen Klasse

Ich versuche hier etwas Ähnliches wie diese Frage zu machen: 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 aus dem 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-insert-yoast-message-in-page-headers? reply = 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 Klasse WPSEO_Frontend eine Funktion namens debug_marker, die dann von einer Funktion namens head aufgerufen wird, die dann zu wp_head in __Construct hinzugefügt wird.

Ich bin neu im Unterricht, habe aber einen Weg gefunden, den Kopf komplett zu entfernen

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

aber ich möchte nur den Teil debug_marker 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.

9
Brooke.

Eine einfache Möglichkeit, dies zu erreichen (jedoch ohne den Class-Ansatz), besteht darin, die Ausgabe des Aktions-Hooks wp_head mit dem Befehl output buffering zu filtern.

Schließen Sie in den header.php Ihres Themas den wp_head()-Aufruf mit ob_start($cb)- und ob_end_flush();-Funktionen wie den folgenden ein:

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

Deklarieren Sie nun in der Datei theme functions.php Ihre Ausgaberückruffunktion (in diesem Fall ad_filter_wp_head_output):

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 dies alles über den functions.php tun möchten, ohne die header.php-Datei zu bearbeiten, können Sie sich an die Aktions-Hooks get_header und wp_head binden, 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;
}
6
Ahmad M

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

Ich glaube nicht, dass Sie das mit remove_action machen können. Das Funktionsargument in remove_action hilft Ihnen nicht, da die debug_marker()-Funktion nicht die Funktion war, die im add_action()-Aufruf verwendet wurde.

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

Du könntest

  1. Bearbeiten Sie die Quelldatei von Yoast und entfernen Sie die Debug-Kommentarzeile.
  2. Erweitern Sie die Klasse WPSEO_Frontend und überladen Sie die Funktion debug_marker, um "" zurückzugeben. TBH, ich bin mir nicht sicher, wie dies in Bezug auf das Laden des Plugins WP funktionieren würde, könnte aber eine Untersuchung wert sein.
3
Steve Claridge

Wenn Sie diesen Thread gefunden haben, nachdem Sie an derselben Lösung wie die von Steve Claridge erwähnte gearbeitet haben, ist dies:

Erweitern Sie die Klasse WPSEO_Frontend und überladen Sie die Funktion debug_marker, um "" zurückzugeben.

Ich habe die folgenden Schritte detailliert beschrieben, obwohl ich im letzten Schritt nicht weiterkomme.


Erstellen Sie ein Anpassungs-Plugin

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

Also fuhr ich mit Erstellung meines ersten Plugins nach diesem Artikel von ElegantTheme fort.

Erweitern Sie die entsprechende Klasse.

Dann wurde es kompliziert. Ich habe Folgendes hinzugefügt, aber meine übergeordnete 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 '';
    }

}
2
Adrien Be

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 Action-Hook genommen, der direkt danach folgt, nämlich wp_enqueue_scripts, und dort habe ich eine Funktion eingebunden, die die debug_marker-Ausgabe entfernt. 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, weil das in der entscheidenden Wrapper-Funktion des Plugins wiedergegeben wird head . Sie könnten versuchen, das zu überschreiben.

1
Ogier Schelvis

So fügen Sie Antwort auf Ahmad konnte man nur alle HTML-Kommentare mit der gleichen Menge an Code entfernen, da Yoast nicht das einzige Plugin ist, die das 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);
1
Bryan Willis

Ich bin auf ein Snippet gestoßen, das alle Yoast WordPress SEO-Kommentare vom Frontend entfernt. Es ändert auch den Ansatz der Ausgabepufferung, den @ bryan-willis und @ ahmad-m für die Antworten verwenden.

Platzieren Sie das Snippet einfach auf dem functions.php Ihres Themes oder in einer benutzerdefinierten Plugin/Theme-PHP-Datei.

Ich lasse es hier als Referenz - Dank 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);
}
1

Dies ist eine modifizierte Version von @ ahmad-m Answer . Durch Anwenden von Filtern können Sie mehrere inhaltliche Änderungen an der HTML-Kopfzeile 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));
}
0
TarranJones