WordPressの記事投稿時に正規表現でダブルクォートを含む本文を置換する

関連記事

Search Regexでよく使う正規表現をまとめたはいいのですが、Spreadsheetからコピペする度に実行するのに疲れました。

記事投稿時のfilterに関数をhookして処理をするようにします。

wp_insert_post_dataが受け取るpost_contentはダブルクォートがエスケープされている

かなりハマったのですが、フィルターwp_insert_post_dataが受け取る配列引数の中のpost_contentはなぜかダブルクォートの前にバックスラッシュを付けてきます。

var_dumpするとこんな感じ→『”』

なのでまずはバックスラッシュを消して普通のダブルクォートに置換しないとダブルクォートを含む正規表現が通りません。

functions.php

add_filter('wp_insert_post_data', 'modifyPostData');

function modifyPostData($data)
{
    $data['post_content'] = preg_replace('/"/', '"', $data['post_content']);
    $data['post_content'] = preg_replace('/<td data-[^>]+?>/', '<td>', $data['post_content']);
    $data['post_content'] = preg_replace('#<a class="in-cell-link"[^>]+?href="([^>]+?)"[^>]+?">#', '<a href="$1">', $data['post_content']);
    $data['post_content'] = preg_replace('#<span]+?">([sS]+?)</span>#', '$1', $data['post_content']);
    $data['post_content'] = preg_replace('#<strong]+?">([sS]+?)</strong>#', '<strong>$1</strong>', $data['post_content']);
    $data['post_content'] = preg_replace('/<a]+?" /', '<a ', $data['post_content']);

    return $data;
}
$data['post_content'] = preg_replace('/"/', '"', $data['post_content']);

でエスケープされたダブルクォートを普通のダブルクォートに置換しているので、後は通常通りpreg_replaceなりなんなりしておけば大丈夫です。
投稿データを書き換えるので、最初に試す時は記事のバックアップを忘れないようにしてください。

関連記事

SNSでシェアする