Intereting Posts
Правильный способ загрузки одного сообщения через Ajax? бесконечная прокрутка не работает при выходе из системы Как мы ограничиваем пользователя видеть поле в сообщении без регистрации, Добавление нового параметра с использованием Kirki или WP customizer с помощью оператора if Добавить URL Rewrite Rule в WordPress Выполнение действия POST на главной странице отправляется на страницу сообщений Добавить обновление или удаление записей базы данных с использованием настраиваемого типа сообщений Личный кабинет: 10 Последний черновик и 10 последних ожидающих страниц обзора (metabox) Как предполагается использовать шаблон cart.php WooCommerce? Можно ли вставлять необработанную строку CSS непосредственно из файла шаблона? Отображать вложения по ID в фрейме wp.media Есть ли действие, подобное «after_register_custom_post_type»? Как добавить пользовательский JS в tinymce в wordpress add_rewrite_endpoint не работает Пользовательский тип сообщения, постоянные ссылки и разбивка на страницы, неправильное

Ссылка на регулярное выражение String вместо роли 'contributor'

в настоящее время я использую приведенный ниже код, чтобы добавить rel=nofollow и target=_blank ко всем внешним ссылкам содержимого моего сайта, но я хотел бы, чтобы это произошло только на страницах Contributors. IE, авторы сообщений и выше не имеют правил перезаписи.

 <?php add_filter( 'the_content', 'cn_nf_url_parse'); function cn_nf_url_parse( $content ) { $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>"; if(preg_match_all("/$regexp/siU", $content, $matches, PREG_SET_ORDER)) { if( !empty($matches) ) { $srcUrl = get_option('siteurl'); for ($i=0; $i < count($matches); $i++) { $tag = $matches[$i][0]; $tag2 = $matches[$i][0]; $url = $matches[$i][0]; $noFollow = ''; $pattern = '/target\s*=\s*"\s*_blank\s*"/'; preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE); if( count($match) < 1 ) $noFollow .= ' target="_blank" '; $pattern = '/rel\s*=\s*"\s*[n|d]ofollow\s*"/'; preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE); if( count($match) < 1 ) $noFollow .= ' rel="nofollow" '; $pos = strpos($url,$srcUrl); if ($pos === false) { $tag = rtrim ($tag,'>'); $tag .= $noFollow.'>'; $content = str_replace($tag2,$tag,$content); } } } } $content = str_replace(']]>', ']]&gt;', $content); return $content; } 

Solutions Collecting From Web of "Ссылка на регулярное выражение String вместо роли 'contributor'"

Для этого есть author_can() :

 add_action( 'loop_start', 'wpse105294_nofollow_author' ); function wpse105294_nofollow_author() { ! author_can( $GLOBALS['post']->ID, 'edit_others_posts' ) AND add_filter( 'the_content', 'cn_nf_url_parse'); } 

Поэтому вы добавляете только этот обратный вызов фильтра для авторов и других ролей, у которых нет возможности edit_others_posts . По умолчанию это Subscriber и Author . Для получения дополнительной информации ознакомьтесь с статьей Кодекса о ролях и возможностях .

редактировать

Поскольку я в последнее время сделал некоторые вещи с PHP HTML DOM Parser, я подумал, что лучше использовать этот. Для легкости вещей код был в основном сделан из ответа @Alex на SO .

 add_filter( 'the_content', 'cn_nf_url_parse'); function wpse_105294_Content_Parser( $content ) { $dom = new DOMDocument; $dom->loadHTML( $content ); // DOMXPath() might be just too much $anchors = $dom->getElementByTagName( 'a' ); foreach ( $anchors as $a ) { if ( ! $a->hasAttribute( 'rel' ) OR '' === ( $rel = trim( $a->getAttribute( 'rel' ) ) ) ) continue; $rel = preg_split( '/\s+/', $rel ); if ( in_array( 'nofollow', $rel ) ) continue; $rel[] = 'nofollow'; $anchor->setAttribute( 'rel', implode( ' ', $rel ) ); } $html = ''; // Remove `html\body` before returning foreach ( $dom->getElementsByTagName( 'body' )->item(0)->childNodes as $el ) $html .= $dom->saveXML( $el, LIBXML_NOEMPTYTAG ); return $html; }