WordPress 实现自动中文排版纠正,中英文之间添加空格补正

我这里使用的是 jxlwqq 的 chinese-typesetting 项目,Github页:https://github.com/jxlwqq/chinese-typesetting

可以给文章中的英文单词左右添加空格,以及对专有名词替换正确的大小写、清除空标签等。具体可以看项目的说明。

其他类似的项目也有,用法都类似,只是这个项目支持的比较广泛所以我用这个。具体怎样的排版格式是正确的,网上的“学究”们争议也很多,但是不重要,咱们的目的是提升网页的美观和易读。


然后这里需要说一下使用这个库的注意事项,其实就一点,而且还有点烦,就是这个库内部的方法不会分析一些 HTML 标签,比如 img 标签。

会导致一些问题,例如文章中有一个图片:

<img src="http://example.com/图片.jpg" />

会被这个库修正为:

<img src="http://example.com/ 图片.jpg" />

这样肯定是不行的,避免的方法是把文章的文件或者图片的文件名改成英文的格式的。

比如 pic.jpg ,或者对中文的部分增加下划线,比如 pic_图片名.jpg 这样子。

就不会被这个库当作错误排版纠正了。


接下来我们来把这个项目应用到 WordPress 上,Composer 安装的过程这里就跳过了,和往常一样,直接上 DEMO 。

//添加钩子
add_action('save_post', 'aya_save_formatting');
//循环方法
function aya_save_formatting($post_id)
{
    //检查是否为自动保存
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    //检查用户权限
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    //防止进入递归,先注销钩子
    remove_action('save_post', 'aya_save_formatting');
    //获取文章内容
    $post_content = get_post_field('post_content', $post_id);
    //对文章内容进行格式化处理
    $formatted_content = aya_chinese_type_setting($post_content);
    //更新文章内容
    wp_update_post(
        array(
            'ID' => $post_id,
            'post_content' => $formatted_content,
        )
    );
    //恢复钩子
    add_action('save_post', 'aya_save_formatting');
}
//加载预定义类
use Jxlwqq\ChineseTypesetting\ChineseTypesetting;
//应用中文格式化实例
function aya_chinese_type_setting($content)
{
    $typesetting = new ChineseTypesetting();
    $formatted_content = $typesetting->correct($content, ['insertSpace', 'removeSpace', 'full2Half', 'fixPunctuation', 'properNoun']);
    //返回格式化后的内容
    return $formatted_content;
}

 

然后是一些说明:

如果你不想使用 Composer 的话,直接下载这个库的 ChineseTypesetting.php 然后 include 也是一样的,就这一个文件。

这里把实例添加到了save_post 这个动作钩子上,这个钩子其实是用来在保存文章的时候进行一些别的操作的,比如创建 meta 参数之类的。

但是我在里面用到了 wp_update_post() 方法,这样调用其实是不正规的,因为这个钩子本身就是在这个方法里面的。

所以,如果像 DEMO 这样子使用,必须先取消自己的钩子然后再恢复,不然就会因为一直进入 wp_update_post() 方法导致无限递归。

比较正规的方法是操作WP的核心钩子,例如在 wp_insert_post_data 上操作,但是核心钩子上的参数太多比较麻烦,直接这样更省事。

另外可以直接把 DEMO 中的 aya_chinese_type_setting() 方法挂载到 the_content 钩子上效果会是一样的,但是排版纠正没必要在每次加载时候都执行,在文章保存时候执行一次更加合理。

THE END
夜华子酱我知道你很急,但你先别急