最初发布于 2014 年 2 月,现已更新/更正/扩展。
因此,您已安装 WordPress 并希望撰写关于代码的博客。太棒了!您是一位英雄,我代表我自己和所有程序员表示感谢。以下是在您实际发布代码块时需要执行的操作和需要考虑的事项。
“代码块”的 HTML
有一个专门用于代码的元素:<code>
。我认为语义上正确的方法是将所有代码都用它包装起来。浏览器的默认样式表将其作为内联元素,我建议您保持这种方式,以便您可以在句子中使用它,就像我在上一句中所做的那样。
但是您需要使用块级元素来包装代码块。<pre>
是完美的元素,因为它可以自然地保留空白字符。“Pre”代表“预格式化文本”。多个空格将呈现为多个空格,而不是像 HTML 中通常那样折叠成单个空格。这对于代码来说非常完美,因为您可能希望在代码块中使用缩进,并且您不希望诉诸任何
的花招。
所以
<pre><code>Your
block
of
code
here.</code></pre>
关闭“视觉”编辑器
默认情况下,WordPress 允许您在编辑器中切换“视觉”和“文本”选项卡。

对于您来说,必须关闭视觉编辑器。您永远不会使用它。您希望完全控制您正在编写的文本,并希望在保存时保持其原样。
在**用户 > 个人资料**下关闭它。

您是否要使用 Markdown 撰写博客?
在 CSS-Tricks 上,我不使用 Markdown,但如果我能回到过去,我可能会使用。在我之后创建的大多数博客中,我都使用了 Markdown 并更喜欢它。如果您打算使用 Markdown,我建议您使用 Jetpack 的 Markdown 功能。
要在 Markdown 中发布代码块,一种方法是在每一行的开头缩进四个空格,如下所示
Yadda yadda yadda. I'm a *paragraph* in Markdown. Here's a [link to Google](http://google.com). Here's a block of code:
<div>
<p>I'm some code.</p>
<div>
Another paragraph here.
手动执行此操作很快就会变得很麻烦。因此,您需要将编辑器按钮替换为 Markdown 按钮。看起来插件 Markdown Quicktags 可以做到这一点。

使用 Markdown 的好处是您不必担心转义代码。因此,这些尖括号不会构成渲染威胁,Markdown 会为您转义它们。换句话说,上面 HTML 示例中的所有尖括号 (<
) 将转换为 <
,从而在屏幕上显示为尖括号,而不是让浏览器误以为 HTML 标签即将出现。
在发送到浏览器之前,上面的 Markdown 示例将转换为以下内容
<p>Yadda yadda yadda. I'm a <em>paragraph</em> in Markdown. Here's a <a href="http://google.com">link to Google</a>. Here's a block of code:</p> <pre><code><div> <p>I'm some code.</p> <div></code></pre> <p>Another paragraph here.</p>
如果您有兴趣使用 Markdown 撰写博客,您可以选择一些方法。Automattic 创建并维护的插件 Jetpack,现在将其作为其众多产品的一部分提供。目前,我在 CSS-Tricks 上使用 WP-Markdown(我知道我说过我不使用 Markdown,但我确实在论坛和评论中使用,而不是博客)。
我个人没有尝试过的两个插件是 Typewriter 和 Markdown on Saved Improved。
但是,这里有一个相当大的限制。请注意,四个空格的缩进转换为 <pre><code>
块,但此处没有机会向这些标签添加属性。属性(如类和 data-* 属性)是一种常见需求。您可能希望使用语法高亮显示器(我们稍后将讨论这些内容),它需要一些属性才能发挥作用。或者,您可能希望以某种方式通过语言标识代码块。
与缩进相比,更方便的是,许多 Markdown 的“风格”(包括 Jetpack 版本)支持代码围栏,即将代码块放在三个反引号中
```
<div>
<p>I'm some code.</p>
<div>
```
我会称之为直接改进。在编写时跳入代码块更容易,而不必担心缩进问题。此外,代码本身有自己的缩进,因此从左对齐开始很好。
您还可以直接在 Markdown 语法中指定语言。因此,我们的示例可以是
```html
<div>
<p>I'm some code.</p>
<div>
```
这将得到
<pre><code class="html"><div> <p>I'm some code.</p> <div> </code></pre>
如果您不使用 Markdown,则需要转义代码。
CSS 代码块很少需要转义,但 HTML 肯定需要转义,JavaScript 有时包含 HTML(以及几乎所有后端语言),因此您不妨假设所有代码都需要转义。
您可以手动将所有 < 转换为 <,但这会让您感到疯狂。您可以使用 Postable 等工具复制粘贴要转义的代码块,但这也很慢且繁琐。
我更喜欢使用名为 Code Markup 的插件来实现此目的。它会自动转义在 <code>
标签中找到的任何内容,因此您永远不必考虑它。
因为我在此站点上使用了该插件,所以我可以执行以下操作
<pre data-lang="HTML"><code class="language-markup"><div>
<p>I'm some code.</p>
<div></code></pre>
并且效果很好。无需转义。完全控制属性。
处理语法高亮显示
请记住,语法高亮显示代码块的一种选择是不进行语法高亮显示。当然,这将是最快和最简单的方法。但您可能希望进行高亮显示。我个人喜欢它。我喜欢它看起来的样子。以下是一些选择。
任何语法高亮显示器实际上发生的事情是,代码片段最终会被包装在 <span>
中,并带有类名称,您可以使用 CSS 对其进行着色。选择取决于功能。
Prism.js
在 CSS-Tricks 上,我使用(并推荐)Lea Verou 的 Prism,因为它可以开箱即用。它体积小、速度快,并且(我最喜欢的)具有用于样式设置的合理类名。在下载时,您可以选择要支持的语言。
我还使用了该转义插件,这意味着我无需转义代码标签内的 HTML,因此它看起来像这样
<pre><code markup="tt" class="language-markup"><div>
<p>I'm some code.</p>
<div></code></pre>
代码标签上的 class="language-markup"
是 Prism 用于语法高亮显示的内容。默认情况下,它会自动处理找到的所有具有该类名模式的代码,但如果您想自己处理,则可以使用 API。
Prettify
一个非常流行的工具是 google-code-prettify。要语法高亮显示代码块,请在代码或 pre 标签上添加 class="prettyprint"
。
它的文件大小比 Prism 大,但一个优点是它可以自动检测语言(并支持大量语言),因此它应该适用于几乎所有内容,而无需您指定。
其他
稍微深入研究一下,还有很多我无法保证但似乎也能解决问题的工具:Rainbow、SyntaxHighlighter、Chili(jQuery)、JSHighlighter、jQuery.Syntax(jQuery)、GeSHi、Lighter(MooTools)、highlight.js、SHJS 和 Pygments(Python)。
决定
为了在这些选项中做出选择,你可以考虑以下几点
- 我主要需要支持哪些语言?
- 我是否需要显示行号?
- 我是否需要在代码中插入链接?
- 我是否希望能够突出显示代码的某些部分或行?
- 我是否有需要支持的遗留代码块?它们的格式是什么?
- 代码是否易于复制和粘贴?我是否希望添加一些辅助功能?
- 客户端语法高亮是否可以,或者我是否希望它在服务器端进行?
视觉上识别代码块
我认为能够一目了然地看出代码块是什么类型是一个不错的功能。在这个网站上,我通过代码块本身的一个属性来实现这一点,然后将该属性的值作为显示的一部分进行样式设置。你可以在此处显示的大多数代码块中看到它的实际效果(假设你正在查看网站本身,而不是在其他地方阅读其联合内容)。
以下是如何在代码块上视觉显示特定属性的方法(样式完全由你决定!)
pre[data-language-display]:before {
content: attr(data-language-display);
}
处理遗留代码
如果你在一个网站上已经有一堆代码块,我仍然建议选择一个你喜欢的并且具有所需功能的语法高亮器,以便当前和将来使用。然后找到一种方法使其适用于旧的代码块。
例如,假设我有一个像这样标记的遗留代码块
<pre><code class="javascript">
var thing = document.getElementById("thing");
</code></pre>
这不是 Prism 正确的类名。因此,我可能会使用 jQuery 执行类似的操作
$("code.javascript")
.removeClass("javascript")
.addClass("language-javascript");
并确保该 JavaScript 在 Prism 之前运行。我还可以借此机会使用 $.trim() 修剪代码,因为如上所述,顶部和底部有一个额外的换行符,这可能会影响代码块的样式。
我只是举个例子。总的来说,意思是:你可以根据需要操作遗留代码块以适应新的格式。
使用插件
有很多 插件 可以做到这一点。这篇文章主要针对自己处理代码高亮,因为这通常是我喜欢的控制方式。但我相信有很多优秀的插件可以做到这一点。我不敢推荐任何一个,但我会寻找以下几点
- 良好的评价/评分/看起来像是更新过的
- 不会让你对代码块做任何奇怪/专有的操作。例如,使用[shortcode]。这将使你永远绑定到该插件。
- 支持你需要的语言和功能(并且只支持你需要的功能,不会加载所有东西)。
第三方帮助
在 CodePen 创建 嵌入式笔 功能时,我们知道在博文中显示演示和代码有点麻烦,因此我们着手简化这一过程。
这是一个嵌入式笔的示例,默认显示 CSS 代码
查看笔 使用 动态图像着色 由 Noah Blon (@noahblon) 在 CodePen 上。
我不需要担心语法高亮、转义或任何其他事情,并且可以获得显示渲染演示的额外好处。
许多其他代码编辑器网站也提供嵌入式代码,例如 JSFiddle 和 JSBin。 GitHub Gists 也可用于此目的。我可能最喜欢使用第三方工具的原因是,你可以去那里更新演示,而博客文章会自动包含新的代码。你无需在两个地方更新内容。
你是否有自己处理 WordPress 网站上代码块的方法?欢迎分享。
不错的文章,Chris。需要注意的是,Jetpack 的 Markdown 模块也是 GitHub 风格的,因此你可以使用反引号将其中的代码括起来。这是 WordPress.com Markdown 支持的原始文章。Jetpack 使用的是同一个模块。
我目前在我的网站上使用 Crayon,但我有点担心它插入的 JS/CSS 代码量。它还会删除
<code>
标签,这让我有点恼火。@briankrosgard – 这些信息太棒了,我不知道 Jetpack 还能支持 GitHub 风格的 MD,非常有用 :)
我也是,我刚刚(再次)开始了一个新的博客,我也在使用 Crayon。虽然我喜欢它的外观,但它在功能和选项方面过于复杂了。我认为我很快就会切换到更轻量级的解决方案,趁现在还来得及。
如果你们正在寻找一个轻量级、设计精美的代码片段插件,可以看看我的插件:http://wordpress.org/plugins/jsj-code-highlight/。
它基本上遵循文章中指定的相同工作流程,并使用 jQuery 添加一些 div。
在意识到所有 WordPress 代码插件(在我看来)都不太好的情况下,我写了这个插件!
真是太及时了。我很久以前就想了解更多关于这方面的信息。非常感谢你分享这些,Chris!
另一种解决方案是使用自定义元字段。你可以使用 Simple Fields 或 Advanced Custom Fields 等插件来创建你的“代码容器”。然后,你可以在文章中使用短代码插入它们。这是一个非常简洁的解决方案。
我一直在寻找一个好的语法高亮解决方案,看来 Lea 的 Prism 可以胜任这项工作。感谢你,Chris :)
我昨天才在 Twitter 上问了你这个问题 :) 我花了一点时间,但最终还是发现你在你的网站上使用了 prismjs。我目前正在编写一个插件来实现这个功能(现有的 Prism 插件都不太好)。
非常感谢你的分享!
嗨 Chris,文章不错,我有一个相关的问题,如何在 CodePen 上转义 HTML 和 JS 代码,你只使用
sanitize_text_field
吗?能否给出一个清晰的答案,谢谢嗨 Chris,
文章很棒。
实际上我正想问你,在这个博客上你使用什么进行语法高亮。我最终在一个项目中使用了 prettify。我不喜欢 prettify 的一点是样式有限,而且有些代码无法正确高亮显示。我现在正在尝试 prism,感谢你的提示!
嗨 Chris,我是 css-tricks 的常客,现在是时候感谢你在 Web 开发方面的努力了。真的非常感谢你帮助像我这样的年轻人……再次感谢,并期待你继续创作优秀的作品。
好文章!只想让你知道,你可能忘记在一个代码块中关闭
<code>
和<pre>
标签了(紧跟在“上面那个 Markdown 示例会在到达浏览器之前转换为以下内容:”之后的那个)。几个月前,我还在使用手动代码提取(HTML、CS 和 JavaScript 各一个),现在所有内容都使用 Codepen 嵌入。方便多了。也喜欢它提供的样式选项,可以很好地融入网站。干得漂亮!
我不确定我是否做对了,但这是我在我的博客上所做的。
对于内联代码
为了转义 HTML,我通常将代码块复制粘贴到文本编辑器中,按下 Ctrl+H(查找并替换),并将所有
<
替换为<
,>
也一样(替换为>
),以及&
(替换为&
)。在博客文章中显示演示和代码时(可以被使用或不会影响内容的流畅性),你应该将
<pre><code>...</code></pre>
包装在一个<figure>
中(并带有一个可选的<figcaption>
)。http://www.w3.org/TR/html5/grouping-content.html#the-figure-element
我们刚刚开始在我们的博客上使用 CodePens,在发现你的新 WP 插件之前,我们创建了自己的短代码。每个开发人员都有一个与他们的用户帐户关联的 Codepen 个人资料,因此短代码只需获取 slug 即可。
短代码 PHP 代码片段
我们添加了一些其他可选参数,用于设置高度和选择除文章作者之外的其他用户。
这确保了我们在整个网站上始终保持相同的 Codepen 主题。对于 Codepen 来说,如果有一些组织帐户或一种更直接创建和保存主题的方式会很棒,但目前这对我们来说效果很好。
我使用 Prism,但遇到一个问题,即我的 JavaScript 示例中删除了空行。
有什么想法吗?
Crowd Favorite 的 Capsule 主题是一个简洁的前端 Github 风格的 Markdown 编辑器。
我最近安装它来替换 Gistbox(通过 Gists)和 Pastebin 的功能。所以我有我自己的托管代码片段库,例如 code.damoncook.net
另外,您可以设置 Capsule Server 以拥有一个团队协作同步的代码片段库。
经过大量的测试和研究,我最终决定使用 SyntaxHighlighter Evolved 插件来 WordPress。它允许你将代码包装在 [php][/php] 标签内,这在后端非常简洁。
它在 http://www.epicwebs.co.uk 上运行得很好。
你也可以直接发布一个 Gist 就行了 :)
当然,这可能很棒。但请记住,订阅了你 RSS 订阅源的人(WordPress 会自动为你创建订阅源,这也是你可能一开始使用 WordPress 的原因之一)将看不到任何内容。
你好,
我尝试了你所有的 Markdown 建议,我发现唯一一个与 prism 和 wp-gfm 兼容的是 markdown-quicktags。
我想让你知道。
这正是我一直在努力解决的问题。谢谢!
感谢 Chris 简化了 WordPress 代码的使用。
我没有 WordPress 博客。在我的 CMS 上可以使用其他标准的高亮显示插件吗?有很多独立代码高亮显示器选项,我仍在研究哪一个最好。谢谢!
对我来说信息太多了……我正在寻找一个简单的解决方案来将 HTML 代码添加到我的帖子中。
我尝试了 Postable。它运行良好,但每次使用它都很繁琐,就像你说的那样。
谢谢
或者你可以使用推荐的方法
http://en.support.wordpress.com/code/posting-source-code/
那是针对 WordPress.com 的,底部只是简单地提到了一个插件。本文涵盖了这一点,以及你可能需要为自托管 WordPress 博客考虑的其他一些问题。
感谢您展示了在 WordPress 编辑器中使用 Pre 标签的确切方法。我将尝试一下,希望它能起作用。 :)
嗨,
不错的文章,但我无法在
<pre>
或<code>
中显示。它总是显示输入并破坏其余代码。问题出在哪里?
谢谢
如果你在网站上发布公共代码,为什么不使用 gist 呢?据我所知,WordPress 现在支持 gist 的 OEmbed,如果没有,它就像一个不到 10 行的插件,并且有以下好处
你不用自己动手编写
你有一个可以预期收到关于代码有意义反馈的地方,包括行引用、关于代码本身的评论、其他人可以 fork 的能力等。
页面上的代码将使用 gist 更新,因此你的用户不会看到过时的垃圾信息。
你可以像往常一样设置输出样式,因为它不是 iframe(正如我写给你的,CSS-Tricks 有一个 CSS 规则不够具体,导致我发布的一个 Gist 看起来很糟糕,不确定它在重新主题后是否已修复)。
这种用于元数据的数据属性的使用非常棒,我不知道 CSS 中的 attr() 函数。
这确保了我们在整个网站上始终保持相同的 Codepen 主题。对于 Codepen 来说,如果有一些组织帐户或一种更直接创建和保存主题的方式会很棒,但目前这对我们来说效果很好。