插入的内部链接的HTML是由Javascript生成的,所以我不知道有什么简单的方法可以更改它。
HTML生成由wpLink.htmlUpdate
方法(HTML模式)和wpLink.mceUpdate
方法(TinyMCE模式),在/wp-includes/js/wplink.js
文件
以下是一些想法:
向插入的链接添加查询参数:
我们可以向插入链接的url添加包含帖子ID信息的查询参数,例如:
http://example.dev/hello-world/?wpse_pid=475
具有以下功能:
/**
* Append the wpse_pid query argument to inserted links
*
* @see http://wordpress.stackexchange.com/a/170836/26350
*/
add_filter( \'wp_link_query_args\', function( $query ) {
add_filter( \'post_link\', \'wpse_post_link\', 10, 2 );
return $query;
});
add_filter( \'wp_link_query\', function( $query ) {
remove_filter( \'post_link\', \'wpse_post_link\', 10 );
return $query;
});
function wpse_post_link( $permalink, $post )
{
if( false === stripos( $permalink, \'?p=\' ) )
$permalink = add_query_arg( array( \'wpse_pid\' => $post->ID ), $permalink );
return $permalink;
}
下面的屏幕截图显示了这一点:
覆盖wpLink.mceUpdate
方法:
以下黑客只是为了好玩,因为这种方法将来可能会改变。
这是对上述代码段的补充。
/**
* Override the wpLink.mceUpdate method to modify the inserted link HTML.
*
* @see http://wordpress.stackexchange.com/a/170836/26350
*/
add_action( \'admin_footer-post.php\', function(){
?>
<script>
jQuery( document ).ready( function( $ ){
wpLink.mceUpdate = function(){
var link,
attrs = wpLink.getAttrs(),
editor = tinyMCE.activeEditor;
wpLink.close();
editor.focus();
if ( tinymce.isIE ) {
editor.selection.moveToBookmark( editor.windowManager.bookmark );
}
link = editor.dom.getParent( editor.selection.getNode(), \'a[href]\' );
// If the values are empty, unlink and return
if ( ! attrs.href || attrs.href == \'http://\' ) {
editor.execCommand( \'unlink\' );
return;
}
// Set the class attribute.
attrs.class = \'wpse_pid\';
// Grab the value of the wpse_pid parameter and use as id attribute.
// Modified version of http://www.sitepoint.com/url-parameters-jquery/
var results = new RegExp(\'[\\?&]wpse_pid=([^&#]*)\').exec( attrs.href );
attrs.id = ( results != null ) ? \'wpse_pid_\' + results[1] : \'\'
// Remove the ?wpse_pid=* part
// Modified version of http://stackoverflow.com/a/7126657/2078474
attrs.href = attrs.href.replace(/[\\?&]?wpse_pid=([^&]$|[^&]*)/i, "");
if ( link ) {
editor.dom.setAttribs( link, attrs );
} else {
editor.execCommand( \'mceInsertLink\', false, attrs );
}
// Move the cursor to the end of the selection
editor.selection.collapse();
}
});
</script>
<?php
}, 99 );
插入链接的HTML现在具有以下格式:
<a id="wpse_pid_475"
class="wpse_pid"
title="Hello World"
href="http://example.dev/hello-world/">Hello World</a>
其中未修改的链接为:
<a title="Hello World"
href="http://example.dev/hello-world/">Hello World</a>
这里我用了
class
和id属性,因为它们似乎是tinyMCE编辑器支持的属性。我试过了
attrs.data
但那没用。你可能想更深入地了解这一点。
它应该类似于覆盖wpLink.htmlUpdate
方法但这只是概念的证明;-)
另一个想法是在更新期间扫描帖子内容的链接,并使用一些巧妙的regexp替换或一些PHP-DOM修改来修改它们。
希望您可以进一步了解这一点,并根据您的需要进行修改。