【WordPress】pixiv形式のルビを出力する方法

遊びでChatGPTに聞いてみました。
ルビをショートコード出力する記事を以前に見かけて、ほんの出来心でやりました。

preg_replace()関数

一つ目はPHPでHTMLを出力する際に [[rb:るび > ルビ]]<ruby>るび<rt>ルビ</rt></ruby> に変換する方法です。

function replace_ruby_shortcode( $content ) {
  return preg_replace( '/\[\[rb:(.+?)\s*>\s*(.+?)\]\]/', '<ruby>$1<rt>$2</rt></ruby>', $content );
}
add_filter( 'the_content', 'replace_ruby_shortcode' );

preg_replace()関数を使用して正規表現でマッチさせ、一致した文字列を置換します。
フィルターフックを使用して、コンテンツが表示される前に置換されます。

preg_replace_callback()関数 + wp_kses_data()関数

二つ目も似たような感じなのですが、こちらはpreg_replace_callback()関数によって正規表現に一致した文字列を検出し、一致した部分文字列に対してコールバック関数を実行する方法です。
コールバック関数のなかでwp_kses_data()関数を使用し、それぞれの変数をHTMLエスケープさせます。

function parse_ruby_shortcode( $content ) {
  $pattern = '/\[\[rb:(.+?)\s>\s(.+?)\]\]/';
  $content = preg_replace_callback( $pattern, function( $matches ) {
    $ruby = wp_kses_data( trim( $matches[1] ) );
    $rt = wp_kses_data( trim( $matches[2] ) );
    $html = '<ruby>' . $ruby . '<rt>' . $rt . '</rt></ruby>';
    return $html;
  }, $content );
  return $content;
}
add_filter( 'the_content', 'parse_ruby_shortcode', 99 );

また、こちらのコードではフィルターの優先度も設定しています。
他のプラグインやフィルターとの競合を避けるために99と高めに設定したらしいです。(ChatGPT曰く)


どちらかというと二つ目のコードのほうが安全で信頼性が高く、競合リスクが低いと、ChatGPTは曰っておりました。

一応、動作確認済みですが、出来心でやったので色々と保証はできかねます。

この記事が気に入ったらサポートをしてみませんか?