Word후크/필터를 눌러 게시물 내부의 링크를 처리합니다.
WordPress 투고에 추가할 링크를 처리하기 위한 후크/필터가 있습니까?
아래 버튼을 사용하여 포스트에 삽입된 링크를 전처리하고 서드파티 API like bit를 사용하여 단축하는 것이 목표입니다.리
내부 링크와 외부 링크 모두에 대해 이 작업을 수행합니다.
제가 생각하는 해결책 중 하나는 에디터에 이 기능을 하는 버튼을 추가하는 것입니다만, 작업을 하는 후크/필터를 사용하는 것이 좋습니다.그렇게 하면 더 깨끗해질 것입니다(WordPress를 업그레이드 할 수 있도록 함으로써).
WordPress 문서를 훑어보고 다음 후크/필터를 훑어봤지만 소용없었다.
여기에 나열된 대부분의 항목은 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
서픽스
wp-syslog/syslog/wplink.syslog는 다음 대화상자를 처리합니다.
이 대화 상자를 통해 삽입된 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);
wp-displays/displays/displaysmce/plugins/wplink/displays.displays는 다음 대화상자를 처리합니다.
이번에는, 우리는 또한 이 모든 것을setURL
의 방법tinymce.ui.WPLinkPreview
그러나 이 스크립트를 등록 해제하고 수정 버전을 등록하지 않으면 거의 불가능합니다.그런 다음 WordPress에서 예측할 수 없는 변경으로 스크립트를 직접 관리하십시오.
이제, 현명하게 고르세요!외부 URL을 게시물에 붙여넣기 전에 단축하거나 WordPress TinyMCE 플러그인을 망치거나 다음 대화 상자를 사용합니다.wp-includes/js/wplink.js
플러그 인.
Yes! WordPress는 다음을 통해 인라인 링크를 삽입합니다.wp_link_ajax
wp_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
#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
'programing' 카테고리의 다른 글
Jersey JSON POJO 지원 사용방법 (0) | 2023.03.02 |
---|---|
Windows 서비스로 MongoDB를 실행하려면 어떻게 해야 하나요? (0) | 2023.03.02 |
잭슨:Json 구성 값 무시 (0) | 2023.03.02 |
Http로부터의 JSON 해석URL연결 오브젝트 (0) | 2023.03.02 |
각도 테이블 행 지시문이 테이블 내부에 렌더링되지 않음 (0) | 2023.03.02 |