WP+highlight.js实现实现代码高亮+一键复制代码(无插件实现和用插件实现)

一、背景

作为一个还拥有独立博客,用来记录开发文章,且是wordPress坚定的拥趸者,肯定需要代码高亮。

之前我用的是高亮插件,但是因为安全问题,我禁用了,得手动配置和启用代码高亮。

也在网上查过是否有可替代方案,但是查了查,还是决定就直接用通用的highlight-js来实现代码的高亮。

这样干净,无侵入,更重要的是安全无害,且也很容易实现。

二、为什么选择highlight.js

在很久之前就已经使用过这款强大的代码高亮JS库,而且wp很多代码高亮插件底层也用的是它。

更重要的是它完全可按需配置,最少只需要3行代码,非常轻量化。

而且它发布了各个平台的版本,支持ES6的import方式,也支持nodejs环境或者浏览器直接引入使用。

具体见官网的描述:

The Internet's favorite JavaScript syntax highlighter supporting Node.js and the web.

192 languages and 498 themes
Automatic language detection
Works with any HTML markup
Zero dependencies
Compatible with any JS framework
Supports Node.js and Deno
Current release: 11.9.0

https://highlightjs.org

二、实现方案

1、代码高亮

大体思路就是,在WordPress的主题下的single.php中新增如下3行代码即可。

1、新增CSS
<link rel="stylesheet" href="https://unpkg.com/@highlightjs/cdn-assets@10.7.3/styles/a11y-dark.min.css?ver=10.7.3" type="text/css" media="all">
2、新增JS
<script src="https://unpkg.com/@highlightjs/cdn-assets@10.7.3/highlight.min.js?ver=10.7.3" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
3、调用
<script>
     hljs.highlightAll(); 
    // 如果用的是highlightjs低于10的版本,需要用下面这个方法调用
    hljs.initHighlightingOnLoad();
</script>    

我用的是国外的CDN服务商unpkg,在国内速度也是非常快,但国内已经不能直接访问jsdelivr.net。其他备选CDN是cloudflare.com

最佳实践建议,CSS样式放在WP主题的header.php中,其他的JS和调用放在footer.php中。

而且如果你只是想在single.php中生效,那么可以添加判断条件:

<?php if ( is_singular() ){ ?>
        <script src="https://unpkg.com/@highlightjs/cdn-assets@10.7.3/highlight.min.js?ver=10.7.3" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
        <script>
            hljs.highlightAll(); 
        </script>
<?php } ?>            

效果:

image-20250416155644933

2、实现一键复制功能(可选)

为了增加用户体验,我需要在pre>code中新增一键复制功能,而且打算用纯JS实现。以下是实现代码,你只需要将该代码,放在:

<script>
   hljs.highlightAll();
   //以下是一键复制的代码
</script>

即可:

// 详情页,代码quote添加复制按钮
document.addEventListener('DOMContentLoaded', function () {
   const blocks = document.querySelectorAll('pre > code');

   blocks.forEach((codeBlock) => {
       const pre = codeBlock.parentElement;
       // 创建复制按钮-我的主题用的是bootstrap,所以,按钮class为bootstrap的按钮风格
       const button = document.createElement('button');
       button.innerText = '复制';
       button.className = 'btn btn-info btn-sm';

       // 设置按钮样式
       Object.assign(button.style, {
           position: 'absolute',
           fontFamily: 'initial',
           top: '8px',
           right: '8px',
           zIndex: 10
      });

       // 设置 为 relative 定位
       pre.style.position = 'relative';

       // 插入按钮
       pre.appendChild(button);

       // 绑定复制事件
       button.addEventListener('click', () => {
           const text = codeBlock.innerText;
           const textarea = document.createElement('textarea');
           textarea.value = text;
           document.body.appendChild(textarea);
           textarea.select();
           document.execCommand('copy');
           document.body.removeChild(textarea);

           button.innerText = '已复制';
           setTimeout(() => {
               button.innerText = '复制';
          }, 1500);
      });
  });
});

最终效果:

image-20250416160456373

3、遇到的问题:

我用highlightjs@11.1.1时,发现代码没有保持格式化,而是挤到一行了:

image-20250417133953572

问题解决:

降级到highlightjs@10.7.3,恢复正常,怀疑是highlightjs@1.11.1这个版本的JS在格式化代码时,应该要使用 textContent 而不是 innerText

image-20250417134115402

三、插件版代码高亮(自制版)

如果你实在不知道怎么修改自己的wp主题代码,我也制作了一份插件,代码跟上面一致,主题为默认色,直接下载下面的压缩包,然后在WordPress的后台-插件,上传并且启用即可。

image-20250416165242266

插件下载链接: https://pan.baidu.com/s/1UcC6yJOZnz5mg6rRTzaciQ?pwd=scqr 提取码: scqr

三、相关链接

1、hightlight.js官网:https://highlightjs.org/

2、cloudflare CDN:https://cdnjs.com/libraries/highlight.js

3、代码预览效果:https://www.imqd.cn/use-object-keys.html

4、下载链接: https://pan.baidu.com/s/1UcC6yJOZnz5mg6rRTzaciQ?pwd=scqr 提取码: scqr

除特别声明外, 本站所有内容皆为原创,未经许可,禁止转载。转载时请务必以超链接形式标明文章出处和作者信息
  • 39
(0)
打赏 微信扫一扫 微信扫一扫
                       

关于作者:

web前端老罗

贡献:已经在WEB前端圈发表92篇文章了

简介:前端老罗是一位拥有多年web前端开发经验、管理经验、教学经验的实战派全栈工程师。目前在某名企任职WEB前端技术教官。加我微信:imqdcnn可提供开发、技术咨询、答疑、直播讲座等服务

Ta的专栏 | Ta的站点 | 其他SNS

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关于WEB前端圈

我是前端人(imqd.cn)愿景是不管你是想学习前端还是一名专业的WEB前端工程师在这里都能找到你想要的物料。定位为前端人学习进步的一个平台。在这里你能找到前端学习笔记、教学视频资源、案例、前后端分离、前端框架、低代码平台、可视化数据、多端开发、全栈开发等跟前端有关的一切资源!

关于站长:WEB前端老罗(罗老师)是一位拥有多年web前端开发经验、管理经验、IT培训教学经验的实战派全栈工程师。目前在某名企任职WEB前端技术教官。右边加我微信可提供开发、技术咨询、答疑、直播讲座等服务

WEB前端圈二维码

右边添加老罗微信一对一免费私聊
拉你加入官方微信答疑群

To top