今までは失敗続きでしたが今回で恐らく成功したようなので、記事に残します。
実現したいこと
実現したい事は以下の通り。
- 特定の範囲や部位を対象に、pタグを消す
本来は「WordPressの自動整形で挿入されたpタグ」だけに限定したかったのですが、その仕組みが作れず、範囲内の全てのpタグを消すという方法に切り替えた次第です。
コード
以下コードです。
//ショートコードで囲んだ範囲のpタグを消す
add_shortcode('nop','nop_func');
function nop_func($atts, $content = null) {
$content = str_replace( '<p>' , '' , $content );
$content = str_replace( '</p>' , '' , $content );
return $content;
}
使う場合は、該当箇所を以下のようにショートコードで囲みます。
[nop]
pタグが入って欲しくないHTML構造など
[/nop]
流れとしては以下の通り。
- 囲み型ショートコードを利用して場所とコンテンツを特定
- 特定したコンテンツに対し、preg_replaceでpタグの除去を実行する
厳密には「タグの除去」ではなく単なる「指定文字列の削除」ですが、この方が開始タグしか挿入されなかった場合でも安定して動作するのではと思います。
以前から悩んでいた仕組みだったわりに、随分と短く単純な仕組みでできたなという印象です。
参考サイト
上記の「アクションフックとフィルターフック概論」のページで以下の記述を見つけたのが切っ掛けです。
add_filter( ‘the_content’, ‘shortcode_unautop’ ); // ショートコードにはPタグを付加しない関数
当初はこのshortcode_unautopでどうにかできるのではと試したものの上手くいかず。
しかしショートコードを利用するというのは使えそうだと思えました。
これがなければ、the_contensにフックさせて置換を行う方法を延々と試し続けていたかもしれません。
結び
色々な状況化でのテストは行えていませんので、現状では試作版です。
もしも当記事のコードを利用される場合は自己責任でお願いします。
補足
毎度面倒な自動整形ですが、多くの場合以下の何れかの方法で対応してきたかと思います。
- remove_filter( 'the_content', 'wpautop' );をfunctions.phpに記述して対応する
- プラグインを使って対応する
上記のいずれも投稿全体に効果を及ぼす解除方法のため(プラグインの中には部分に効くものが既にあるかもしれませんが)、以前から範囲を限定してpタグを除去できる仕組みを作りたいと思っていました。
投稿欄にプレーンなテキストを入れてpタグで整形してくれる機能は便利なのですが、自動挿入されると困るHTMLタグはありますし、開始タグだけ出力される状況が発生する可能性もあり、自動だから面倒なことが起こりやすかったと思います。
今回のコードで部分を限定してpタグだけを除去できるため、いくつかの問題は解決できるかもしれません。
もちろん、コードに追加すればbrタグなどの他のタグも消せます。
19人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。