Wordpress: автоматическое изменение указанных c URL-адресов в сообщениях - PullRequest
6 голосов
/ 24 марта 2020

Я нашел решение изменить ссылки в моей теме WordPress, но не ссылки в контенте. Как можно получить URL в содержании, чтобы я также мог их изменить?

Мне нужно использовать фильтр the content. Но как можно изменить URL-адреса, например apple.com/test/ apple.com/test-123/, apple.com, microsoft.com, microsoft.com/test/? Функция также должна корректно изменять каждый соответствующий URL в контенте.

add_filter('the_content ', 'function_name');

Ответ на похожий вопрос , к сожалению, не работает.

Это моя работа решение изменить ссылки, но не ссылки в содержании.

add_filter('rh_post_offer_url_filter', 'link_change_custom');
function link_change_custom($offer_post_url){

$shops= array(
        array('shop'=>'apple.com','id'=>'1234'),
        array('shop'=>'microsoft.com','id'=>'5678'),
        array('shop'=>'dell.com','id'=>'9876'), 
    );
    foreach( $shops as $rule ) {
        if (!empty($offer_post_url) && strpos($offer_post_url, $rule['shop']) !== false) {      
            $offer_post_url = 'https://www.network.com/promotion/click/id='.$rule['id'].'-yxz?param0='.rawurlencode($offer_post_url);
}    
    }
$shops2= array(
        array('shop'=>'example.com','id'=>'1234'),
        array('shop'=>'domain2.com','id'=>'5678'),
        array('shop'=>'domain3','id'=>'9876'),  
    );
    foreach( $shops2 as $rule ) {
        if (!empty($offer_post_url) && strpos($offer_post_url, $rule['shop']) !== false) {      
            $offer_post_url = 'https://www.second-network.com/promotion/click/id='.$rule['id'].'-yxz?param0='.rawurlencode($offer_post_url);
}    
    }

        return $offer_post_url; 
}

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Если я вас правильно понял, это то, что вам нужно

add_filter( 'the_content', 'replace_links_by_promotions' );
function replace_links_by_promotions( $content ) {
    $shop_ids = array(
        'apple.com'     => '1234',
        'microsoft.com' => '5678',
        'dell.com'      => '9876',
    );

    preg_match_all( '/https?:\/\/(www\.)?([-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6})\b([-a-zA-Z0-9()@:%_\+.~#?&\/=]*)/', $content, $matches, PREG_OFFSET_CAPTURE );

    foreach ( $matches[2] as $index => $match ) {
        if ( ! isset( $shop_ids[ $match[0] ] ) ) {
            continue;
        }

        $offer_post_url = 'https://www.network.com/promotion/click/id=' . $shop_ids[ $match[0] ] . '-yxz?param0=' . rawurlencode( $matches[0][ $index ][0] );
        $content        = substr_replace( $content, $offer_post_url, $matches[0][ $index ][1], strlen( $matches[0][ $index ][0] ) );
    }

    return $content;
}
2 голосов
/ 01 апреля 2020

Я думаю, что это работает. Обратите внимание, что, как написано, он будет соответствовать каждому «apple.», «Dell.» И «microsoft». ссылки в каждом типе контента, который использует фильтр контента - посты, страницы, выдержки, множество пользовательских типов постов и т. д. c. - так что, если вы на самом деле этого не хотите, а вы вполне можете этого не делать, тогда необходимо заменить основную функцию замены, а функцию регулярного выражения - более точно нацелить ... и это может стать сложным.

(Кроме того, если подумать, я не уверен, что кавычки в тегах привязки, которые Regex найдет, потребуют специальной обработки. Если это не сработает, мы тоже можем посмотреть на это Или, может быть, переключиться на анализатор DOM, как, может быть, мне следовало начать с выполнения ...)

/** INITIATE FILTER FUNCTION **/
add_filter( 'the_content', 'wpso_change_urls' ) ;

/**
 * PREG CALLBACK FUNCTION
 * Match Matches to id #s
 * and return replacement urls enclosed in quotes (as found)
 */ 
function wpso_found_urls( $matches ) { 

  //someone else probably has a v clever parsimonious way to do this next part
  //but at least this makes what's happening easy to read
  if ( strpos( $matches[0], 'apple' ) ) {

      $id = '1234' ;

  } 

  if ( strpos( $matches[0], 'microsoft' ) ) {

      $id = '5678' ;

  } 

  if ( strpos( $matches[0], 'dell' ) ) {

      $id = '9876' ;

  } 

  $raw_url = trim( $matches[0], '"' ) ;

  return '"https://www.network.com/promotion/click/id='. $id .'-yxz?param0='.rawurlencode( $raw_url) . '"' ; 

}

/** ENDURING A DREADFUL FATE USING REGEX TO PARSE HTML **/
function wpso_change_urls( $content ) { 

    $find_urls = array( 
        '/"+(http|https)(\:\/\/\S*apple.\S*")/',
        '/"+(http|https)(\:\/\/\S*microsoft.\S*")/',
        '/"+(http|https)(\:\/\/\S*dell.\S*")/',
    );

    return preg_replace_callback( $find_urls, 'wpso_found_urls', $content ) ; 

}

Возврат (примечание: пример перед обрезкой кавычек из «сырого URL» перед кодированием):

Converted Links

... из оригинального (постредактор) контента, подобного этому:

enter image description here

0 голосов
/ 29 марта 2020

Возможно, для этого воспользуйтесь фильтром the_content:

add_filter('the_content', function($content){

  // filter $content and replace urls
  $content = str_replace('http://old-url', 'http://new-url', $content);

  return $content;
});

Подробнее: https://developer.wordpress.org/reference/hooks/the_content/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...