Je sais que cette question a été posée et a répondu 1000 fois. Cependant, je n'ai jamais vraiment trouvé de solution qui supprime la balise de lien pingback de "wp_head". Bien qu'il y ait plusieurs façons de bloquer xml-rcp/pingback/trackback depuis wordpress, j'essaie d'ajouter à cela en le bloquant depuis la tête
Donc, fondamentalement, je ne veux pas que cela apparaisse dans le HTML rendu:
La solution la plus proche que j'ai jamais trouvée était la suivante:
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;
}
Mais ça se voit toujours comme ça:
<link rel="pingback" href>
Je sais que ce n'est pas vraiment grave, que cela m'ennuyait plus que tout. Cela fait quelques jours que je plaisante en apprenant regex et je pense avoir les bons modèles pour supprimer le pingback de la tête.
Les deux modèles suivants suppriment tous les cas (d'après ce que j'ai testé du pingback):
/<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>/i
/<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>/i
J'ai utilisé le tampon de sortie pour y parvenir:
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);
}
Cependant, si j'essaie de combiner les deux motifs regex, cela ne fonctionne pas.
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);
}
Je pense que le problème est que je dois utiliser preg_match. J'ai essayé de vérifier avec cela et cela a fonctionné:
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');
Cependant, je ne sais pas comment l'utiliser correctement dans cette situation. C’est peut-être plus une question de stackoverflow puisqu'il s’agit de regex, mais j’imaginais que c’était spécifique à WordPress, je l’ai mise ici.
C'était juste une erreur que j'avais faite, ce qui précède fonctionnerait comme ceci:
$buffer = preg_replace('/(<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i', '', $buffer);
ICI est la réponse révisée:
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);
Ceci supprime le pingback du code source sur votre frontend par programme.
Alors que la plupart des développeurs l'incluent dans l'en-tête comme ceci:
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
... il existe de nombreux cas où il pourrait être écrit et exécuté différemment
Tels que:
<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'>
Pour une solution complète qui bloque la fonctionnalité ALL et l'accès au pingback et au rétrolien XML-RPC, reportez-vous à cette réponse associée à la bonne question. De nombreux exploits récents de ce fichier, il est donc sage de le faire si vous n'utilisez pas de rétroliens/pingbacks:
Y a-t-il un moyen de désactiver complètement les Pingbacks/Trackbacks?
Voici mon amélioration avec moins de code pour les mêmes résultats:
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;
}