IT

워드프레스:게시물의 특정 URL 자동 변경

itgroup 2023. 11. 4. 10:34
반응형

워드프레스:게시물의 특정 URL 자동 변경

제 워드프레스 테마에서 링크를 변경할 수 있는 해결책을 찾았지만 내용의 링크는 변경할 수 없었습니다.컨텐츠에 있는 URL을 어떻게 얻을 수 있는데 변경도 가능합니까?

사용할 필요가 있습니다.the content거름망을 치다그런데 어떻게 apple.com/test/ apple.com/test-123/, apple.com, microsoft.com, microsoft.com/test/ 같은 URL을 바꿀 수 있을까요?또한 이 기능은 컨텐츠에 일치하는 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; 
}

내가 당신을 제대로 이해했다면, 그것이 당신에게 필요한 것입니다.

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;
}

이거 되는 것 같아요.작성된 대로 모든 "apple", "dell." 및 "microsoft." 링크는 게시물, 페이지, 발췌물, 많은 사용자 지정 게시물 유형 등 콘텐츠 필터를 사용하는 모든 유형의 콘텐츠와 일치합니다. 따라서, 만약 여러분이 그것을 정말 원하지 않고, 잘 원하지 않을 수도 있다면, 주 대체 기능은 조건부화되어야 하고, regex 기능은 조건부화되어야 합니다.더 정확하게 목표물로 삼으면 복잡해질 수 있습니다

(그리고 생각해보니, 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 ) ; 

}

반환(참고: 인코딩 전 "raw URL"에서 따옴표를 자르기 전 예):

Converted Links

...원본(포스트 에디터) 콘텐츠에서 다음과 같은 내용이 제공됩니다.

enter image description here

다음과 같은 것을 사용해 볼 수도 있습니다.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/

언급URL : https://stackoverflow.com/questions/60829912/wordpress-automatically-change-specific-urls-in-posts

반응형