web-dev-qa-db-ja.com

頭からpingbackを削除する方法?

私はこの質問が1000回寄せられたことを知っています。しかし、 "wp_head"からpingbackリンクタグを削除する解決策を本当に見つけたことはありません。 wordpressからxml-rcp/pingback/trackbackをブロックするにはいくつかの方法がありますが、頭からブロックしてそれに追加しようとしています。

したがって、基本的に、レンダリングされたHTMLにこれが表示されないようにします。

私が今までに見つけた最も近い解決策はこれでした:

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

しかし、それでもまだこのように表示されます。

<link rel="pingback" href>

私はこれが本当に大したことではないことを知っています、それは何よりも私をもっといらいらさせました。私はこの数日間、正規表現の学習をいじっていて、頭からpingbackを削除するための正しいパターンを得たと思います。

次の2つのパターンは(私がpingbackでテストしたものから)すべてのケースを削除します。

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

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

これを実現するために出力バッファを使用しました。

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

しかし、2つの正規表現パターンを組み合わせようとするとうまくいきません。

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

問題は、preg_matchを使用する必要があることだと思います。これをチェックしてみましたが、うまくいきました。

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');

しかし、この状況で正しく使用する方法がわかりません。正規表現を扱っているので、これはより多くのスタックオーバーフローの問題になるかもしれませんが、私がここで述べたのはwordpressに固有のものだったので考えました。

3
Bryan Willis

それは私がしたただの過ちでした、上記はこのように働くでしょう:

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

ここは修正された答えです:

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

これはフロントエンドのソースコードからプログラム的にpingbackを取り除きます。

ほとんどの開発者はこのようにヘッダーにそれを含めますが:

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

...それが異なって書かれて実行される可能性がある多くの場合があります

といった:

<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'>

ALL機能をブロックする_完全な解決策については、XML-RPCのpingbackおよびtrackbackへのアクセスを参照してください。あなたがトラックバック/ピングバックを使用していないならこれをするために:

ピングバック/トラックバックを完全にオフにする方法はありますか?

2
Bryan Willis

これは、同じ結果を得るためのコードを減らして改良したものです。

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