WordPress 网站的文章如果比较长,通过文章目录,可以方便用户阅读,对读者比较友好。而且锚点文章目录据说会被搜索引擎收录,对网站SEO有利。
为网站文章添加目录一般可以通过代码或者插件来实现,用插件的话就比较简单了,直接通过网站后台下载安装即可。常见的目录插件主要有Easy Table of Contents(简单的目录)、Table of Contents Plus 和 LuckyWP Table of Contents,如果想用国人开发的插件,可以试试WPJAM Basic。WPJAM Basic 插件是“我爱水煮鱼”开发的一款多功能合一的WordPress 全站优化插件,其中包含了文章目录功能。如果您嫌麻烦,小编推荐用这款插件。如果您只需要用目录功能,可以试试“我爱水煮鱼”早期提供的单独的目录插件——wpjam-toc。
wpjam-toc 下载
该插件大小只有8kb,可谓小巧强悍。
https://url26.ctfile.com/f/948726-515196904-501647?p=7890(访问密码:7890)
注:如果您网站设置了外链自动在新标签打开,就不要使用wpjam-toc 了,那样点击目录会打开新标签(正常应该在当前页跳转至目录对应位置),WPJAM Basic 没有这个问题。
当然,如果您不喜使用过多的插件,下面我们来看看如何用纯代码来实现为WordPress 网站文章添加目录。
纯代码方法
php功能代码
此代码复制到当前主题的functions.php文件中即可。
// 文章目录 add_filter('the_content', 'my_contents_table'); function my_contents_table($content) { $matches = array(); $ul_li = ''; $r = '/<h([2-6]).*?\>(.*?)<\/h[2-6]>/is'; // for SEO-friendly, contents table only identify <h2> ~ <h6> if (is_single() && preg_match_all($r, $content, $matches)) { $preValue = 2; $hStack = new SplStack(); foreach ($matches[1] as $key => $value) { $title = trim(strip_tags($matches[2][$key])); $content = str_replace($matches[0][$key], '<h' . $value . ' id="title-' . $key . '">' . $title . '</h'. $value . '>', $content); // The following part implements the hierarchy of contents table if(!$hStack->isEmpty()){ if($hStack->top() == $value){ $ul_li .= '<li><a href="#title-' . $key . '" title="' . $title . '">' . $title . "</a></li>\n"; } elseif($hStack->top() < $value){ $ul_li .= "<ul>\n" . '<li><a href="#title-' . $key . '" title="' . $title . '">' . $title . "</a></li>\n"; $hStack->push($value); } elseif($hStack->top() > $value){ while($hStack->top() > $value){ $ul_li .= "</ul>\n"; $hStack->pop(); } $ul_li .= '<li><a href="#title-' . $key . '" title="' . $title . '">' . $title . "</a></li>\n"; } } else{ $ul_li .= '<li><a href="#title-' . $key . '" title="' . $title . '">' . $title . "</a></li>\n"; $hStack->push($value); } } $content = "\n<div id=\"article-index\"> <div id=\"article-index-title\"><strong>文章目录</strong></div> <hr id=\"article-index-hr\" /> <div id=\"article-index-table\"><ul id=\"index-ul\">\n" . $ul_li . "</ul></div> </div>\n" . $content; } return $content; }
css样式代码
此代码放入当前主题的默认.css文件中即可。
#article-index { float: right; width: 250px; line-height: 23px; margin: 0px 0px 20px 20px; border-radius: 5px; border: 2px solid rgb(36, 40, 45); padding: 0 0 6px 0; } #article-index #article-index-title { margin: 5px 0 0 0; } #article-index #article-index-title strong { display: block; line-height: 30px; padding: 0 4px; text-align: center; } #article-index-hr { size: 1px; color: rgb(36, 40, 45); margin: 4px 20px; } #article-index-table { padding: 0 22px 0 20px; } #article-index ul { padding-left: 20px; } #article-index li { list-style-type: disc; } #index-ul { margin: 0; } #index-ul li { background: none repeat scroll 0 0 transparent; padding: 0; } #index-ul a { color: rgb(36, 40, 45); } #index-ul a:hover { color: rgb(61, 138, 125); }
到此就可以为文章添加文章目录功能了,如果您的主题设置支持自定义代码,上边的PHP代码和css代码也可以直接放到后台主题设置中,这样还省了升级主题后重新添加代码的麻烦~是不是也挺简单的呢?
不过此时目录显示位置为文章的右上角,且在modown主题中,不同层级的目录之间错位较厉害,看着不太舒服。如果想要文章目录在左侧边栏显示,并且调整一下不同层次标题之间的位置,就需要对css代码进行一些修改了,最终效果见下图:
自用css代码
适用于本站目前使用的Modown主题,其他主题未测试,可能仍需要进行适当修改。
/*目录效果*/ #article-index { position:fixed; left:5px; width: 210px; background-color:rgba(255,255,255,.55); border-radius: 0 3px 3px 0; box-shadow:0 0 2px #aaa } #article-index #article-index-title { margin: 5px 0 0 0; } #article-index #article-index-title strong { display: block; line-height: 30px; padding: 0 4px; text-align: center; } #article-index-hr { size: 1px; color: rgb(36, 40, 45); margin: 4px 20px; } #article-index-table { padding: 0 22px 0 20px; } #article-index ul { // padding-left: 20px; } #article-index li { list-style-type: disc; } #index-ul { margin: 0; } #index-ul li { background: none repeat scroll 0 0 transparent; padding: 0; } #index-ul a { color: rgb(36, 40, 45); } #index-ul a:hover { color: rgb(61, 138, 125); }
PS,文章目录调整到侧边栏后,在手机端会遮挡文章内容,因此我们还需要修改下PHP代码,在移动端不显示文章目录。
我们把上边的PHP代码的第一句
add_filter('the_content', 'my_contents_table');
改为
if ( !wp_is_mobile()){ add_filter('the_content', 'my_contents_table'); }
就可以了。
评论0