it-swarm.com.de

Wie Pingback vom Kopf entfernen?

Ich weiß, dass diese Frage 1000 Mal gestellt und beantwortet wurde. Ich habe jedoch nie wirklich eine Lösung gefunden, die das Pingback-Link-Tag von "wp_head" entfernt. Während es verschiedene Möglichkeiten gibt, xml-rcp/pingback/trackback von WordPress aus zu blockieren, versuche ich, dem etwas hinzuzufügen, indem ich es vom Kopf aus blockiere

Grundsätzlich möchte ich nicht, dass dies in dem gerenderten HTML-Code angezeigt wird:

Die nächstgelegene Lösung, die ich je gefunden habe, war folgende:

add_filter( 'bloginfo_url', 'pmg_kt_kill_pingback_url', 10, 2 );
function pmg_kt_kill_pingback_url( $output, $show ) {
    if( $show == 'pingback_url' ) {
        $output = '';
    }
    return $output;
}

Aber es zeigt sich immer noch so:

<link rel="pingback" href>

Ich weiß, das ist keine große Sache, es hat mich mehr als alles andere geärgert. Ich habe in den letzten Tagen das Lernen von Regex durcheinander gebracht und ich denke, ich habe die richtigen Muster, um Pingback vom Kopf zu entfernen.

Die folgenden zwei Muster entfernen alle Fälle (von dem, was ich von Pingback getestet habe):

/<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>/i

/<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>/i

Ich habe den Ausgabepuffer verwendet, um dies zu erreichen:

if (!is_admin()) {      
        function link_rel_buffer_callback($buffer) {
            $buffer = preg_replace('/<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>/i', '', $buffer);
            return $buffer;
        }
        function link_rel_buffer_start() {
            ob_start("link_rel_buffer_callback");
        }
        function link_rel_buffer_end() {
            ob_flush();
        }
        add_action('template_redirect', 'link_rel_buffer_start', -1);
        add_action('get_header', 'link_rel_buffer_start');
        add_action('wp_head', 'link_rel_buffer_end', 999);
    }

Wenn ich jedoch versuche, die beiden Regex-Muster zu kombinieren, funktioniert das nicht

if (!is_admin()) {      
        function link_rel_buffer_callback($buffer) {
            $buffer = preg_replace('/(?:<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i', '', $buffer);
            return $buffer;
        }
        function link_rel_buffer_start() {
            ob_start("link_rel_buffer_callback");
        }
        function link_rel_buffer_end() {
            ob_flush();
        }
        add_action('template_redirect', 'link_rel_buffer_start', -1);
        add_action('get_header', 'link_rel_buffer_start');
        add_action('wp_head', 'link_rel_buffer_end', 999);
    }

Ich denke, das Problem ist, dass ich preg_match verwenden muss. Ich habe versucht, dies zu überprüfen und es hat funktioniert:

function print_preg_match() {         
$pattern = '/(?:<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i';
$subject = '<link rel="pingback" href="http://example.com/xmlrpc.php">';
if (preg_match($pattern, $subject, $matches)) {
   echo 'You Got A Match';
   }
}
add_action('all_admin_notices', 'print_preg_match');

Ich weiß jedoch nicht, wie ich es in dieser Situation richtig verwenden soll. Dies mag eher eine Stapelüberlauf-Frage sein, da es sich um Regex handelt, aber ich dachte, da es spezifisch für WordPress war, habe ich es hier aufgestellt.

3
Bryan Willis

Es war nur ein Fehler, den ich gemacht hatte. Das oben Genannte würde so funktionieren:

$buffer = preg_replace('/(<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i', '', $buffer);

HIER ist die überarbeitete Antwort:

if (!is_admin()) {      
    function link_rel_buffer_callback($buffer) {
        $buffer = preg_replace('/(<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i', '', $buffer);
                return $buffer;
    }
    function link_rel_buffer_start() {
        ob_start("link_rel_buffer_callback");
    }
    function link_rel_buffer_end() {
        ob_flush();
    }
    add_action('template_redirect', 'link_rel_buffer_start', -1);
    add_action('get_header', 'link_rel_buffer_start');
    add_action('wp_head', 'link_rel_buffer_end', 999);
}


// Alternatively use this to just remove the url or use it together with the above
add_filter('bloginfo_url', function($output, $property){
    return ($property == 'pingback_url') ? null : $output;
}, 11, 2);

Dies entfernt programmgesteuert Pingback aus dem Quellcode Ihres Frontends.

Während die meisten Entwickler es wie folgt in den Header einfügen:

<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />

... es gibt viele Fälle, in denen es anders geschrieben und ausgeführt werden könnte

Wie zum Beispiel:

<link rel="pingback" href="http://www.example.com/xmlrpc.php" />
<link rel='pingback' href='http://example.com/xmlrpc.php' />
<link href='http://example.com/xmlrpc.php' rel='pingback'>

Für eine vollständige Lösung , die die ALL Funktionalität und den Zugriff auf XML-RPC-Pingback und -Trackback blockiert, beziehen Sie sich auf diese Antwort, die der richtigen Frage zugeordnet ist. Da diese Datei in letzter Zeit viele Exploits hatte, ist es ratsam, dies zu tun, wenn Sie keine Trackbacks/Pingbacks verwenden:

Gibt es eine Möglichkeit, Pingbacks/Trackbacks vollständig auszuschalten?

2
Bryan Willis

Hier ist meine Verbesserung mit weniger Code für die gleichen Ergebnisse:

add_action( 'plugins_loaded', 'wpse_158700_buffer' );

function wpse_158700_buffer() {
    # Enable output buffering
    ob_start( 'wpse_158700_pingback_url' );
}

function wpse_158700_pingback_url( $buffer ) {
    # If in the admin panel, don't run
    if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
        return $buffer;
    }
    $buffer = preg_replace( '/(<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i', '', $buffer );
    return $buffer;
}