WordPress の投稿データを自動整形して DB に保存する方法です。
前回書いた、「ショートコード API を利用した href 属性の自動付与」に引き続き、少しでも記事の作成を簡略化するためにアレコレ検討中です。
その中で、ある特定のキーワードに対して手動で付けている strong 要素を自動化できないかと考えてみました。
これはリンクを貼るのと違ってそう面倒でもないけど、付け忘れも沢山あったりなのでどちらかと言うとフォーマットの統一目的です。
実装方法については以下で説明したいと思います。
スポンサーリンク
WordPressの投稿データをフックした後にDBに保存する
WordPress で投稿データをフックするポイントはいくつか存在するのですが、今回やりたい事は整形して表示させるのではなく整形後のデータを DB に保存する事です。
なので今回は、wp_insert_post_data を利用してみました。
あまり深く追ってないですが本文なら content_save_pre でフックさせても同様の処理ができます。
上記フックのトリガーはボタンを押した時なので、過去の全データに一括適用したい場合は the_content を利用して表示前に整形するのが良いと思います。
置換程度なら問題ないと思いますが、外から取ってきたデータを本文に自動挿入するとかやろうとした場合は明らかに遅くなると思うので使い分けが必要だと思います。
投稿データのキーワードにstrong要素を付けるサンプルコード
特定キーワードに strong 要素 を付与するコードは以下のような感じになります。
function replace_keyword_str( $data ) { $keyword = 'wordpress,twentytwelve'; $word_array = explode( ',', $keyword ); foreach ( $word_array as $pattern ) { $pattern = "/((?!.*(<.+>|,|\'|\"))($pattern)/i"; $replace = '<strong>\2</strong>'; $data['post_content'] = preg_replace( $pattern, $replace, $data['post_content'] ); } return $data; } add_filter( 'wp_insert_post_data', 'replace_keyword_str', 99, 1 );
キーワードは wordpress および twentytwelve で、大文字と小文字は区別しません。
今回はテストなのでキーワードをベタ書きですが、カテゴリ名を使ったり、プラグイン化して wp_options テーブルにキーワードを登録して使ったりが良さそうです。
コード中の正規表現、 ((?!.*(<.+>|,|\’|\”)) については、既に HTML タグが付いている場合や ‘KeyWord’ のような文字列の場合にはマッチさせないというものです。
簡単ですが、以下はマッチするものとマッチしないものの一例です。
マッチパターン
1. キーワード wordpress および WordPress はマッチする。
2. キーワード <span>wordpress</span> はマッチしない。
3. キーワード <span>wordpress はマッチする。
4. キーワード ‘wordpress’ はマッチしない。
5. キーワード “wordpress はマッチする。
この状態で、投稿画面より “公開ボタン” または “更新ボタン”を押すとこの処理が実行され整形されたデータが DB に保存されます。
ボタンを押したあとは DB のデータが返り、テキストエリア内には整形された本文が表示されます。
細かい置換なので結果は地味ですけど手数が減ったので良しとします。
簡単ですが WordPress の投稿データを自動整形して DB に保存する方法は以上となります。