IT

【解決】WordPress 改行コードの違いでブログカード表示ができない

ブログカードとは

ブログカードとはリンク先のサムネイルやタイトル、概要などをカード形式で表示したものです。例えば当サイトのリンクでは次のような表示ができます。

ブログカード表示

ブログカード表示機能はWordPress 4.5.3 以降では標準機能だそうです。ただ、当サイトはWordPressテーマ「JIN」を使っていますので内部リンクはこのような独自のスタイルで表示されています。

ブログカードの作り方

難しいことはありません。次のようにURLを本文にぺたっと直接貼り付けるだけではい出来上がりです。

URLを貼り付ける
自動でブログカード表示になる
ブログカードが出なくなった?

WordPressのDBを直接編集したらブログカードが消えた?

ここから本題です。とある動作検証のため WordPress のDBを直接触ってデータを修正することがありました。データ操作はAdminerを使用。投稿記事の本文は一切触らず他の項目の値をちょこっと修正し保存。

ページを再表示してみると、

あらっ?シンプルにURLだけ表示されてる。ブログカード表示はどこにいった😵?

もう一度DBのデータを確認しましたがやはり本文の内容は見た目に変化なし。変更されてないなら消えるはずがありません。

更新前後で見比べてもデータに違いがないようなのでHEX表示で見比べてみると、、、

改行コードが 0A (LF) から 0D 0A (CRLF) になってるじゃないですか!見た目で分かるはずありません😓。WindowsでDBデータ修正してましたが、OSの改行コードの違いがこんなところにも出てくるようです。

改行コードを すべて LF に統一する

DBデータ操作を行ったAdminerが改行コードを置き換えているのだろうからAdminerで何とかならないか調べてみました。しかし都合よく改行コードをLFにしてくれるオプションは見つかりませんでした。

そうなると、Wordpress側でブログカード表示を行っているコードを修正する必要がありそうです。該当箇所で改行コードに左右されないように修正する方法も考えましたが、この改行コード問題が他のプラグインでも問題になることが分かりましたので今回は投稿記事本文の改行コードを すべて LF に統一することにしました。

the_content をフックして改行コードが CR または CRLF のものは LF に置き換えることにしたら問題は解消します。ただこれは優先順序を高くして他のフィルターより先に処理しなければ意味がありません。

/*-------------------------------------------*/
/*  改行コードを LF に統一
/*  DB直接編集などで post_content (本文) にCRLFが
/*  混入した場合、JINテーマやpz-linkcardプラグイン
/*  でブログカード表示にならない不具合を回避します。
/*-------------------------------------------*/
function replace_crlf($the_content) {
  return preg_replace("/\r\n|\r/","\n",$the_content);
}
add_filter('the_content','replace_crlf', 1);

add_filter の優先順位は他の競合処理との兼ね合いで調整したほうがよいのでしょうがここでは安易に 1 としました。

もう一度DBを直接触ってデータを修正、再表示してみて、成功です😃!!

この改行コード問題は「pz-linkcard」プラグインでもブログカード表示の不具合につながりましたが、今回の対応を行うことで個別対応は必要なくなりました。

  • ABOUT ME
    tubogo
    自己紹介:SE歴17年、儲からない事ならいろいろかじってます。