programing

Word후크/필터를 눌러 게시물 내부의 링크를 처리합니다.

batch 2023. 3. 2. 22:06
반응형

Word후크/필터를 눌러 게시물 내부의 링크를 처리합니다.

WordPress 투고에 추가할 링크를 처리하기 위한 후크/필터가 있습니까?

아래 버튼을 사용하여 포스트에 삽입된 링크를 전처리하고 서드파티 API like bit를 사용하여 단축하는 것이 목표입니다.

내부 링크와 외부 링크 모두에 대해 이 작업을 수행합니다.

TinyMCE add link 버튼

제가 생각하는 해결책하나는 에디터에 이 기능을 하는 버튼을 추가하는 것입니다만, 작업을 하는 후크/필터를 사용하는 것이 좋습니다.그렇게 하면 더 깨끗해질 것입니다(WordPress를 업그레이드 할 수 있도록 함으로써).

WordPress 문서를 훑어보고 다음 후크/필터를 훑어봤지만 소용없었다.

  1. https://developer.wordpress.org/reference/hooks/add_link/

  2. https://developer.wordpress.org/reference/hooks/post_link/

  3. 여기에 나열된 대부분의 항목은 https://developer.wordpress.org/?s=link입니다.

업데이트 1: TinyMCE 에디터 링크 플러그인에 의해 외부 URL이 포스트 콘텐츠에 삽입되는 것으로 알고 있습니다.PHP는 아무것도 하지 않습니다.

WordPress에는 다음 위치에 두 개의 플러그인이 있습니다.wp-includes/js/wplink.js그리고.wp-includes/js/tinymce/plugins/wplink/plugin.js에 없는 경우는 주의해 주세요.SCRIPT_DEBUG모드가 있습니다..min서픽스

  1. wp-syslog/syslog/wplink.syslog는 다음 대화상자를 처리합니다.

wplink 대화 상자 1

이 대화 상자를 통해 삽입된 URL을 필터링하려면 재정의해야 합니다.wpLink.getAttrs방법.예를 들어,so39115564모든 URL에 문자열 지정:

jQuery(document).ready(function($) {
  wpLink.getAttrs = function() {
    wpLink.correctURL();
    return {
      href: $.trim( $("#wp-link-url").val() + "so39115564" ),
      target: $("#wp-link-target").prop("checked") ? "_blank" : ""
    };
  }
});

이 사진을 보시면wp-includes/js/wplink.js자세한 것은, 을 참조해 주세요.여기서 자세히 설명하기에는 너무 길다.

그리고 위의 스크립트는mylink.js큐잉 방법은 다음과 같습니다.

add_filter('admin_enqueue_scripts', function()
{
  // { Maybe some conditions for a valid screen here. }

  wp_enqueue_script('mylink', 'link/to/the/mylink.js', ['link'], '1.0', true);
}, 0, 0);
  1. wp-displays/displays/displaysmce/plugins/wplink/displays.displays는 다음 대화상자를 처리합니다.

wplink 대화상자 2

이번에는, 우리는 또한 이 모든 것을setURL의 방법tinymce.ui.WPLinkPreview그러나 이 스크립트를 등록 해제하고 수정 버전을 등록하지 않으면 거의 불가능합니다.그런 다음 WordPress에서 예측할 수 없는 변경으로 스크립트를 직접 관리하십시오.

이제, 현명하게 고르세요!외부 URL을 게시물에 붙여넣기 전에 단축하거나 WordPress TinyMCE 플러그인을 망치거나 다음 대화 상자를 사용합니다.wp-includes/js/wplink.js플러그 인.


Yes! WordPress는 다음을 통해 인라인 링크를 삽입합니다.wp_link_ajaxwp_buff_wp_link_buff() 함수에 의해 실행되는 액션입니다.

이 함수의 소스 코드에서 볼 수 있듯이$results에 의해 취득됩니다._WP_Editors::wp_link_query이 메서드를 체크하면 wp_link_query 필터가 나옵니다.이 필터에는 다음 두 개의 인수를 사용할 수 있습니다.$results ★★★★★★★★★★★★★★★★★」$query$results필터링을 해야 합니다.

를 들어, 를어,,, 가다다다다 for for이다를 붙여야 .so39115564다음 중 하나:

add_filter('wp_link_query', function(array $results, array $query)
{
  $results[0]['permalink'] = $results[0]['permalink'] . 'so39115564';

  return $results;
}, PHP_INT_MAX, 2);

자, 이제 어떻게 하는지 알아야지반드시 _WP_Editors::wp_link_query를 확인하여 필터 처리하십시오.$results보다 효율적입니다.

투고를 저장할 때까지 링크를 처리하지 않는 것을 고려해 본 적이 있습니까?워드프레스 플러그인 API에는 저장 시 트리거되는 "save_post"라는 작업이 있습니다.

"save_post"를 사용하면 게시물의 내용을 해석하고 URL 단축자를 사용하여 링크를 바꿀 수 있습니다.

https://codex.wordpress.org/Plugin_API/Action_Reference/save_post

이 경우 사용할 수 있는 플러그인이 있을 수 있지만, 이면에는 기본 로직이 있습니다.

첫 번째 방법 : 단축 URL도 DB에 저장합니다.

add_action( 'save_post', 'save_book_meta', 10, 3 );
function save_book_meta( $post_id, $post, $update ) {
    global $wpdb;
    $slug = 'event';

    // If this isn't a 'book' post, don't update it.
    if ( $slug != $post->post_type ) {
        return;
    }

    preg_match_all('|<a.*(?=href=\"([^\"]*)\")[^>]*>([^<]*)</a>|i', $post->post_content, $match);

    $new_content = $post->post_content;

    foreach($match[1] as $link){
        $url = 'https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyAnw98CCy5owhpgB2HvW3SkoXfm0MrLjks';

        $json_data = json_encode( array( 'longUrl' => $link ) );

        //open connection
        $ch = curl_init();

        //set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $result = curl_exec($ch);
        curl_close($ch);


        $result = json_decode($result);
        $new_content = str_replace($link, $result->id, $new_content);

    }

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'save_book_meta' );

    $post_new = array(
        'ID'       => $post_id,
        'post_content'  => $new_content
      );

    $post_id = wp_update_post( $post_new, true );                         
    if (is_wp_error($post_id)) {
        $errors = $post_id->get_error_messages();
        foreach ($errors as $error) {
            echo $error;
        }
    }
    add_action( 'save_post', 'save_book_meta' );

}

위의 작업을 수행하려면 다음 작업을 수행해야 합니다.

  • save_post저장 후 게시 내용을 가져오려면 후크를 누르십시오.
  • 이 훅에서는 어레이 내의 모든 외부 링크를 가져옵니다(요건에 따라 조건을 변경합니다).
  • Google API를 사용하여 URL을 단축합니다(키 필요).
  • Google API에서 응답을 받아 post_data를 데이터베이스에서도 업데이트합니다.
  • wp_update_post무한 루프를 피하기 위해 후크를 제거합니다.

두 번째 방법 : 프런트 엔드 사용자의 단축 URL 을 표시하려면 (데이터베이스에는 longUrl 이 있습니다만)

  • 대신 동일한 논리로 필터 후크를 사용하십시오.

제3의 방법 : 플러그인 사용 (개인적으로 사용되지 않음)

저는 TinyMCE를 여러 프로젝트에서 사용하지 않았기 때문에 TinyMCE에서는 완벽하지 않지만 javascript를 사용한 경험이 있기 때문에 TinyMCE 이벤트 api를 찾아 url을 짧게 만들 수 있습니다.WP 최신 버전과 TinyMCE 버전 4.x를 확인했습니다.또한 커스텀 콜백을 트리거하기 위한 적절한 API를 찾을 수 있습니다.

tinymce가 워드프레스 에디터에서 초기화되기 전에 wordpress hook tiny_mce_before_init를 사용하여 설정 함수를 초기화합니다.

add_filter( 'tiny_mce_before_init', 'my_plugin_tiny_mce_before_init' );
function my_plugin_tiny_mce_before_init( $in ){
  $in['setup'] = 'myplugin_tinymce_setup'; // javascript callback 
  return $in;   
}

   add_action( 'admin_footer', 'add_admin_footer' );

관리자 바닥글에 javascript 콜백을 추가한 후.이 해결에는 두 가지 방법이 있습니다.

#1 방법

function add_admin_footer(){
 ?>
  <script type="text/javascript">
    var counter = 1, insert_url, shorten_url;

    function myplugin_tinymce_setup( editor ){

     editor.onNodeChange.add(function(ed, cm, e) {
          // Activates the link button when the caret is placed in a anchor element
          if (e.nodeName.toLowerCase() == 'a'){
            var element = jQuery(e).not('a[href="_wp_link_placeholder"],a[data-wplink-edit="true"]');
            if( element.length ){
              if( is_shorten = getShortenUrl( element.attr( 'href') ) ){ 
               element.attr( 'href', is_shorten );
               element.attr( 'data-mce-href', is_shorten );
              }
            }
          }

      });

 var hostname = new RegExp(location.host);
    var shorten_host = new RegExp('http://www.example.com'); // enter your short url generate host name
    function getShortenUrl( url ){
        // add more condition here...
        // Add here ajax or shorten javascript api etc.
        // filter and return short url
        if( hostname.test( url ) ){
           // internal link  
           // Return internal url with shorten
           return 'http://www.example.com/Internal/'+counter++;     

        }else if( shorten_host.test( url ) ){
          // not update already update with shorten url
          return false; 

        }else{
          // Return external url with shorten
          return 'http://www.example.com/External/'+counter++;  
        }

    }
</script>
 <?php  

편집기에서 WP 링크 단축

#2 방법

function add_admin_footer(){
 ?>
  <script type="text/javascript">
    var counter = 1, insert_url, shorten_url;

    function myplugin_tinymce_setup( editor ){

        editor.on('ExecCommand', function(e) {

            // Eexcute command when click on button apply on insert/edit link
           if( e.command == 'wp_link_apply' ){

              if( editor.selection.getContent() ){
                element = tinymce.$(editor.selection.getContent()); // Create new link 
              }else{
                element = tinymce.$(editor.selection.getNode()); // Edit link option 
              }
              if( element.prop('tagName').toLowerCase() == 'a' ){
                  current_link_url = element.attr('href'); // Real url added in editor.
                  // and also check current_link_url is not shorten url
                  // add more logic here. Get short url using ajax or bitly javascript api. 
                  if( is_shorten_url = getShortenUrl( element.attr('href')) ){
                    editor.execCommand('mceInsertLink',false,{ href: is_shorten_url });  
                  }

              }
           }

        });
    }

    var hostname = new RegExp(location.host);
    var shorten_host = new RegExp('http://www.example.com'); // enter your short url generate host name
    function getShortenUrl( url ){
        // add more condition here...
        // Add here ajax or shorten javascript api etc.
        // filter and return short url
        if( hostname.test( url ) ){
           // internal link  
           // Return internal url with shorten
           return 'http://www.example.com/Internal/'+counter++;     

        }else if( shorten_host.test( url ) ){
          // not update already update with shorten url
          return false; 

        }else{
          // Return external url with shorten
          return 'http://www.example.com/External/'+counter++;  
        }

    }

  </script>
 <?php  

}

행운을 빈다 :)

언급URL : https://stackoverflow.com/questions/39115564/wordpress-hook-filter-to-process-link-inside-a-post

반응형