class-nofollow-link.php
2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
/**
* Executes the `Nofollow` action on Broken Links.
*
* @link https://wordpress.org/plugins/broken-link-checker/
* @since 2.1
*
* @author WPMUDEV (https://wpmudev.com)
* @package WPMUDEV_BLC\App\Broken_Links_Actions
*
* @copyright (c) 2022, Incsub (http://incsub.com)
*/
namespace WPMUDEV_BLC\App\Broken_Links_Actions\Processors;
// Abort if called directly.
defined( 'WPINC' ) || die;
use WPMUDEV_BLC\Core\Utils\Abstracts\Base;
/**
* Class Scan_Data
*
* @package WPMUDEV_BLC\App\Broken_Links_Actions\Processors
*/
class Nofollow_Link extends Base {
public function execute( string $content = '', string $link = '', string $new_link = '' ) {
if ( empty( $this->get_target_tags() ) ) {
return $content;
}
$link = untrailingslashit( trim( $link, '\'"' ) );
$replacements = array();
foreach ( $this->get_target_tags() as $tag_name => $tag_atts ) {
if ( ! empty( $tag_atts ) ) {
foreach ( $tag_atts as $tag_att ) {
$regexp = "<{$tag_name}\s[^>]*{$tag_att}=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/{$tag_name}>";
if ( preg_match_all( "/$regexp/siU", $content, $matches ) ) {
if ( ! empty( $matches[0] ) ) {
foreach ( $matches[0] as $key => $markup ) {
$content_link = untrailingslashit( trim( $matches[2][ $key ], '\'"' ) );
if ( $content_link === $link ) {
$replacements[ $markup ] = $this->add_nofollow( $markup );
}
}
}
}
}
}
}
return empty( $replacements ) ? $content : str_replace( array_keys( $replacements ), array_values( $replacements ), $content );
}
public function add_nofollow( string $input = '' ) {
$dom = new \DOMDocument;
$dom->loadHTML( $input );
$anchors = $dom->getElementsByTagName( 'a' );
foreach ( $anchors as $anchor ) {
$rel = array();
if ( $anchor->hasAttribute( 'rel' ) && ( $rel_arr = $anchor->getAttribute( 'rel' ) ) !== '' ) {
$rel = preg_split( '/\s+/', trim( $rel_arr ) );
}
if ( in_array( 'nofollow', $rel ) ) {
continue;
}
$rel[] = 'nofollow';
$anchor->setAttribute( 'rel', implode( ' ', $rel ) );
}
$dom->saveHTML();
$html = '';
foreach ( $dom->getElementsByTagName( 'body' )->item( 0 )->childNodes as $element ) {
$html .= $dom->saveXML( $element, LIBXML_NOEMPTYTAG );
}
return $html;
}
public function get_target_tags() {
return apply_filters(
'wpmudev_blc_replace_target_tags',
array(
'a' => array( 'href' ),
)
);
}
}