class-activation.php
1 year ago
class-admin-menu-organizer.php
1 year ago
class-auto-publish-posts-with-missed-schedule.php
1 year ago
class-avif-upload.php
1 year ago
class-change-login-url.php
1 year ago
class-cleanup-admin-bar.php
1 year ago
class-common-methods.php
1 year ago
class-content-duplication.php
1 year ago
class-content-order.php
1 year ago
class-custom-admin-footer-text.php
1 year ago
class-custom-body-class.php
1 year ago
class-custom-css.php
1 year ago
class-custom-nav-menu-items-in-new-tab.php
1 year ago
class-deactivation.php
1 year ago
class-disable-comments.php
1 year ago
class-disable-dashboard-widgets.php
1 year ago
class-disable-feeds.php
1 year ago
class-disable-gutenberg.php
1 year ago
class-disable-rest-api.php
1 year ago
class-disable-smaller-components.php
1 year ago
class-disable-updates.php
1 year ago
class-disable-xml-rpc.php
1 year ago
class-display-system-summary.php
1 year ago
class-email-address-obfuscator.php
1 year ago
class-email-delivery.php
1 year ago
class-enhance-list-tables.php
1 year ago
class-external-permalinks.php
1 year ago
class-heartbeat-control.php
1 year ago
class-hide-admin-bar.php
1 year ago
class-hide-admin-notices.php
1 year ago
class-image-sizes-panel.php
1 year ago
class-image-upload-control.php
1 year ago
class-insert-head-body-footer-code.php
1 year ago
class-last-login-column.php
1 year ago
class-limit-login-attempts.php
1 year ago
class-login-id-type.php
1 year ago
class-login-logout-menu.php
1 year ago
class-maintenance-mode.php
1 year ago
class-manage-ads-appads-txt.php
1 year ago
class-manage-robots-txt.php
1 year ago
class-media-replacement.php
1 year ago
class-multiple-user-roles.php
1 year ago
class-obfuscate-author-slugs.php
1 year ago
class-open-external-links-in-new-tab.php
1 year ago
class-password-protection.php
1 year ago
class-redirect-after-login.php
1 year ago
class-redirect-after-logout.php
1 year ago
class-redirect-fourofour.php
1 year ago
class-revisions-control.php
1 year ago
class-search-engines-visibility.php
1 year ago
class-settings-fields-render.php
1 year ago
class-settings-sanitization.php
1 year ago
class-settings-sections-fields.php
1 year ago
class-show-custom-taxonomy-filters.php
1 year ago
class-site-identity-on-login-page.php
1 year ago
class-svg-upload.php
1 year ago
class-various-admin-ui-enhancements.php
1 year ago
class-view-admin-as-role.php
1 year ago
class-wider-admin-menu.php
1 year ago
class-wp-config-transformer.php
1 year ago
class-open-external-links-in-new-tab.php
78 lines
| 1 | <?php |
| 2 | |
| 3 | namespace ASENHA\Classes; |
| 4 | |
| 5 | /** |
| 6 | * Class for Open All External Links in New Tab module |
| 7 | * |
| 8 | * @since 6.9.5 |
| 9 | */ |
| 10 | class Open_External_Links_In_New_Tab { |
| 11 | |
| 12 | /** |
| 13 | * Parse links in content to add target="_blank" rel="noopener noreferrer nofollow" attributes |
| 14 | * |
| 15 | * @since 4.9.0 |
| 16 | */ |
| 17 | public function add_target_and_rel_atts_to_content_links( $content ) { |
| 18 | if ( ! empty( $content ) ) { |
| 19 | |
| 20 | // regex pattern for "a href" |
| 21 | $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>"; |
| 22 | |
| 23 | if ( preg_match_all( "/$regexp/siU", $content, $matches, PREG_SET_ORDER ) ) { |
| 24 | |
| 25 | // $matches might contain parts of $content that has links (a href) |
| 26 | preg_match_all( "/$regexp/siU", $content, $matches, PREG_SET_ORDER ); |
| 27 | |
| 28 | if ( is_array( $matches ) ) { |
| 29 | $i = 0; |
| 30 | |
| 31 | foreach ( $matches as $match ) { |
| 32 | |
| 33 | $original_tag = $match[0]; // e.g. <a title="Link Title" href="http://www.example.com/sit-quaerat"> |
| 34 | $tag = $match[0]; // Same value as $original_tag but for further processing |
| 35 | $url = $match[2]; // e.g. http://www.example.com/sit-quaerat |
| 36 | |
| 37 | if ( false !== strpos( $url, get_site_url() ) ) { |
| 38 | // Internal link. Do nothing. |
| 39 | } elseif ( false === strpos( $url, 'http' ) ) { |
| 40 | // Relative link to internal URL. Do nothing. |
| 41 | } else { |
| 42 | // External link. Let's do something. |
| 43 | // Regex pattern for target="_blank|parent|self|top" |
| 44 | $pattern = '/target\s*=\s*"\s*_(blank|parent|self|top)\s*"/'; |
| 45 | // If there's no 'target="_blank|parent|self|top"' in $tag, add target="blank" |
| 46 | if ( 0 === preg_match( $pattern, $tag ) ) { |
| 47 | // Replace closing > with ' target="_blank">' |
| 48 | $tag = substr_replace( $tag, ' target="_blank">', -1 ); |
| 49 | } |
| 50 | |
| 51 | // If there's no 'rel' attribute in $tag, add rel="noopener noreferrer nofollow" |
| 52 | $pattern = '/rel\s*=\s*\"[a-zA-Z0-9_\s]*\"/'; |
| 53 | if ( 0 === preg_match( $pattern, $tag ) ) { |
| 54 | // Replace closing > with ' rel="noopener noreferrer nofollow">' |
| 55 | $tag = substr_replace( $tag, ' rel="noopener noreferrer nofollow">', -1 ); |
| 56 | } else { |
| 57 | // replace rel="noopener" with rel="noopener noreferrer nofollow" |
| 58 | if ( false !== strpos( $tag, 'noopener' ) |
| 59 | && false === strpos( $tag, 'noreferrer' ) |
| 60 | && false === strpos( $tag, 'nofollow' ) |
| 61 | ) { |
| 62 | $tag = str_replace( 'noopener', 'noopener noreferrer nofollow', $tag ); |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | // Replace original a href tag with one containing target and rel attributes above |
| 67 | $content = str_replace( $original_tag, $tag, $content ); |
| 68 | } |
| 69 | $i++; |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | return $content; |
| 76 | } |
| 77 | |
| 78 | } |