我知道这个问题已经被问了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的,所以我把它放在这里。
最合适的回答,由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?