5丁目通信(仮称)

とある5丁目で活動する還暦を過ぎたWebプログラマーの覚え書きです。それとかかってくる迷惑電話や、家業のアパート経営について。

WordPressのPz-LinkCardプラグインでエラーが出たので修正した話し

このサイトではWordPressのPz-LinkCardプラグインを使って、リンク先をブログカードで表示させています。最近になって次のような「URLの記述に誤りがあります。」というエラーになってブログカードが表示されなくなりました。

今まで表示されていたので、Pz-LinkCardプラグインを疑わずに、まずは自分のサイトを疑います。最初に考えたのは、このサイトのPHPのバージョンが古くなっているので、Pz-LinkCardプラグインが対応していないのだろうということでした。

古かったPHPを8.3にアップデートします。その前にさくらインターネットのステージング機能を使ってPHP8.3でもWordpressのサイトが動作するかを確認しておきます。BackWPupプラグインのバックアップファイルが大きくて最初にバックアップができないくて、バックアップファイル整理しました。こちらにはバックアップを含めて1日かかりました。作業を放っておいたのでもっと短い時間で終わったかもしれません。後々考えてみれば、さくらインターネットのコンソールからはPHPのバージョン変更が簡単にできるので、もし動かなかったらすぐに戻せばよかったかもしれません。

PHPのバージョンアップでも直りませんでした。テーマが対応していないかと思って、最新のTwenty Twenty-Fiveにしましたが、こちらもエラーのままでした。

次にPz-LinkCardプラグインを諦めて、新しいブログカードプラグインにしてみます。次のプラグインは、Simple Blog Cardプラグインです。こちらのプラグインだとショートコードを挿入すると正常にブログカードを表示できました。

ここで一つ気が付きました。今までのPz-LinkCardプラグインでは段落ブロックにショートコードを設定していました。ショートコードブロックに設定すると、正常にPz-LinkCardプラグインでもブログカードを表示できます。

このままだと数百のPz-LinkCardプラグインのショートコードが記述されている段落ブロックをショートコードブロックに変換しなければいけません。手作業で変換するのも大変です。

Geminiに段落ブロックからショートコードブロックへの変換方法を聞くと、Search Regexのような検索置換プラグインを使うと、以下のような指示でできるような回答をありました。

検索文字列:"<p>[blogcard"
置換文字列:"[blogcard"
検索文字列:"[/blogcard]</p>"
置換文字列:"[/blogcard]"

pタグを外せということです。データベースのバックアップをあるので早速やってみました。結果は撃沈です。データベースを元に戻します。

段落ブロックに設定されているPz-LinkCardプラグインのショートコードの記述をよく見てみると、URLに自動的にリンクが貼られていました。リンクを無効にしてみると正常にブログカードを表示できるようになりました。今回の障害はWordPressのURLの自動リンクが原因でした。

さて、Pz-LinkCardプラグインのショートコードのURLパラメータに設定されたリンクを手作業で無効にするのは大変なので何とかします。

またまたGeminiさんにWordpressの自動リンクを無効にする方法を聞いてみると以下のような回答がありました。以下のコードをテーマのfunction.phpに追加すればよいとのことです。

remove_filter('the_content', 'wpautop');
remove_filter('the_content', 'make_clickable');

しかしこれまた効果なしでした。

だったら、自動リンクで付けられたaタグのhref属性を削除してしまえと言うことで、またまたGeminiさんに聞きました。こちらのコードをfunction.phpに追加すればよいことでした。

function disable_shortcode_url_auto_link($content) {
  $content = preg_replace_callback('/\[blogcard url="([^"]+)"\]/', function($matches) {
    return '[blogcard url="' . esc_attr($matches[1]) . '"]';
  }, $content);
  return $content;
}
add_filter('the_content', 'disable_shortcode_url_auto_link');

こちらもコードを追加しても解決しません。コードを見てみると何だか正規表現が間違っています。このコードではhrefを削除することができません。そこでもう一度、変換したい文字列を洗い出してGeminiさんに正規表現を作成してもらいます。最後に追加したコードは以下の通りです。

function disable_shortcode_url_auto_link($content) {
  $content = preg_replace_callback('/\[blogcard url="<a href="(.*?)">(.*?)<\/a>"\]/', function($matches) {
    return '[blogcard url="' . esc_attr($matches[1]) . '"]';
  }, $content);
  return $content;
}
add_filter('the_content', 'disable_shortcode_url_auto_link', 1);

このコードで無事にPz-LinkCardプラグインのショートコードが段落ブロックにあってもブログカードを表示できるようになりました。もちろん、最初からショートコードブロックに記述すればいいことではあります。

Pz-LinkCardプラグインのショートコードは、urlパラメータにaタグのリンクが含まれていても正常にブログカードを表示できるような記述ありましたが、仕様が変更されたのでしょうか? それとも最近になってWordpressが勝手にURLにリンクを付けるようになったのでしょうか? 今までブログカードを表示できていたので、今回の障害はなんだったのでしょうか?

今回はChatAIのGeminiさんにいろいろと助けてもらいました。聞けばすぐに解決とはなりませんが、細かく回答に対して指示をしていけば、回答に辿り着くのでしょう。ChatAIは使い方次第です。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.