如何去除头上的指甲?

时间:2014-08-21 作者:Bryan Willis

我知道这个问题已经被问了1000次,回答了1000次。然而,我从未真正找到从“wp\\U头”中删除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>
我知道这没什么大不了的,这比什么都让我恼火。过去几天我一直在混乱地学习regex,我想我找到了正确的模式来消除头部的pingback。

以下两种模式删除了所有案例(从我测试的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);
    }
然而,如果我尝试将这两种正则表达式模式结合起来,它将不起作用

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\\u 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\');
然而,我不知道如何在这种情况下正确使用它。这可能更像是一个stackoverflow问题,因为它处理的是regex,但我想,因为它是针对wordpress的,所以我把它放在这里。

2 个回复
最合适的回答,由SO网友:Bryan Willis 整理而成

这只是我犯的一个错误,上面的操作如下:

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

HERE is the revised answer:

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

This removes pingback from the source code on your frontend programmatically.

虽然大多数开发人员都会将其包含在标题中,如下所示:

<link rel="pingback" href="<?php bloginfo( \'pingback_url\' ); ?>" />
。。。在许多情况下,它的编写和执行可能会有所不同

Such as:

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

对于complete solution 阻止所有功能和对XML-RPC pingback和trackback的访问请参考与正确问题相关的此答案。最近有很多人利用此文件进行攻击,因此,如果您不使用trackback/pingback,那么这样做是明智的:

Is There a Way to Completely Turn Off Pingbacks/Trackbacks?

SO网友:Ethan O\'Sullivan

以下是我对它的改进,使用更少的代码可以获得相同的结果:

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

结束

相关推荐

pingbacks testing

关于新wp安装(3.0.4)中PBs的功能测试,我有几个问题:发布帖子时是立即发送pingback,还是将其安排为cron作业?如果后者正确,作业多久运行一次,我可以手动触发它吗?除了将“尝试通知文章中链接到的任何博客”设置为“开”,当然还有帖子内容中指向另一个博客的链接之外,还有其他关于发送PBs的术语吗?(例如,发件人的帖子应该是公开的而不是私有的吗?博客应该是非私有的吗?)出站链接应该放在帖子内容中,还是可以放在帖子的自定义字段中,以便发送PB?如果我的博客中没有发送或接收PBs,那么调试和检测问题