Version 1.03
プレビュー時にタグが表示されない不具合を修正
「未分類」カテゴリーアーカイブ
サーバの設定について
WordPressを実行しているサーバで、phpの設定により外部へのリクエストが禁止されている場合、本の情報の取得処理ができずにエラーが出ることがわかりました。
WordPressはサーバのPHPの実行環境で実行されています。そのサーバ上で、PHPを実行する場合に適用される設定はphp.iniというファイルに書かれています。php.ini内のallow_url_fopenというフラグで外部へのリクエストの可否を設定するようになっており、これがallow_url_fopen=0の場合WordPressやそのプラグインから外部のサーバに対してのリクエストが制限されます。
自分でWebサーバを管理している場合はphp.iniを変更すればPHPの実行時の各種制限などを設定・解除ができます。この設定ファイルはサーバ内で実行されるすべてのPHPの実行に適用されるので、共用のレンタルサーバの場合その変更ができないようになっています。
レンタルサーバによってはユーザごとにカスタムしたphp.iniを使用できるようにしているところがあるようです。その場合これを自分で書き換えて配置すればPHPの実行時の制限などを変更できます。
記事のプレビューに対応
記事を書いて、公開せずにプレビューした場合に本の情報取得が行われずbooksertのタグが表示されない事がわかりました。記事投稿時に本の情報を取得するためのアクションフックを、push_post/push_pageからsave_post/save_pageに変更することでプレビューの場合にも本の情報取得処理が行われるようにしました。
この修正を適用したバージョンは他の問題が解決してから公開する予定です。
修正版
version 1.02です。
booksert_170519.zip
以前のバージョンがある場合はプラグインを一旦アンインストールしてから再インストールしてください。
固定ページで機能しない不具合を修正しました。
タグにスタイルが当たらない問題を改善しました。
デバッグ
js/cssが読み込まれない問題について
ページ内にbooksertタグがあるかどうかを判定して、タグがあるときのみbooksertのjs/cssを読み込みたかったのですが、ページ内にタグがあるかどうかの判定が難しかったため、この課題は一旦保留にすることにしました。記事内のbooksertタグの有無によらず、常にbooksertの表示のためのjs/cssをhtmlに含めることで、タグが適切に表示されない問題を回避します。
固定ページでbooksertが使えない問題について
wp-config.phpのWP_DEBUGとWP_DEBUG_LOGを有効にしてerror_log()でprinftデバッグをしてみたところ、通常の記事では投稿時のフックが走るけれど、固定ページではフックが起動していない様子でした。使っているフックはpublish_postアクションフックなのですが、これについてよく調べてみると、固定ページの投稿時の処理を行うにはpublish_postフックとは別にpublish_pageフックを仕掛ける必要がありました。これを実装して固定ページでもbooksertが機能するようになりました。
調査
記事を追加していく操作だけでは問題の原因や発生条件がわかりません。
プラグインのソースコードやwordpressのプラグインAPIの仕様を調査していきます。
booksertでは、wp_headアクションフックを使ってhtmlのヘッダが書き出されるときに、ヘッダにjs/cssファイルの挿入コードを追加しています。
この時に、
get_the_ID()で記事IDを取得
get_post_meta()で記事IDからbooksertカスタムフィールドの有無を判定
カスタムフィールドがあればjs/css挿入コードを出力
という処理をしていますが、ここでget_the_ID()の使用することにおそらく問題があり、これはwordpressでグローバル変数として定義されている現在の記事のIDを返すもので、記事を書き出すループの中での処理に対するフックでは有効ですが、その外のフックでこれを使うとwordpressの状態によりどの記事のIDが返るかわかりません。
このhtmlヘッダを書き出すときの処理を、ページに含まれる記事のIDのリストを何か適切な方法で得て、それらに対してbooksertカスタムフィールドの有無を調べ、booksertが使われていればjs/css挿入コードを出力するように変更できればよさそうです。
考察
条件をさらに調べました。
[発生条件]
ブログトップページで複数の記事があり、booksertタグがhtmlページ内に複数存在し、
一番上の記事でbooksertを使っていない
一番上の記事にbooksertタグがある場合、booksertのcss/jsが読み込まれていました。
一番上の記事でbooksertを使っていない場合、booksertのcss/jsが読み込まれません。
…と思いましたが、
その後一番上の記事でbooksertを使っていないときに、css/jsが読み込まれる場合と
読み込まれない場合があることがわかりました。上記は誤りです。
おそらくブログトップページの一番上の記事でbooksertを使っているかどうかは問題発生の条件に関係がありません。
考察
本来の課題は固定ページでbooksertを使えるようにすることですが、現状
通常の投稿ページでもbooksertの表示がおかしいため、まずはこれを解決したいと思います。
この問題について現状を整理すると
[問題点]
記事中のbooksertの表示にスタイルがあたっていない
[原因]
htmlのヘッダにjs/cssのパスが挿入されておらず、js/cssが読み込まれていない
[発生条件]
ブログトップページで複数の記事があり、booksertタグがhtmlページ内に複数存在
記事個別のページ表示で、booksertタグが1つしかない場合は問題が発生しません。
記事個別のページ表示で、記事内にbooksertタグが複数ある場合も問題ありません。
js/cssのパスを修正
記事を書き出すときのフックで、プラグインが使用するjavascriptとcssのファイルパスを書き出しているのですが、これが
[wordpressのURL]/wp-content/plugins/booksert//booksert_styles.css
[wordpressのURL]/wp-content/plugins/booksert//booksert_script.js
のように、パスにスラッシュが2個含まれてしまっていました。//を/に変更してプラグインを更新すると、booksertのタグがきちんと表示されるようになりました。
…問題解決と思いましたが、試しに記事を追加したところ、記事の個別のページを見ているときはjavascriptとcssのパスがhtmlに挿入されていてタグが表示されるけれど、トップの記事のリストを見ている時は、htmlのヘッダにjs/cssの挿入が見当たらず、タグがスタイルなしで表示されてしまいます。
おそらくパスの//は今回の問題には関係なかったようです。
試しにパスに//が含まれるURLにブラウザでアクセスしてみましたが、問題なくアクセスできました。
http://mixque.m49.coreserver.jp/blog.quebox.me/wp-content/plugins/booksert//booksert_styles.css
URL解釈の仕様がどうなっているかは把握していませんが、どちらにせよパスに//が含まれるのは気持ち悪いので、/一個の表記に直しておきました。
固定ページ上での動作について
通常の投稿ではbooksertが問題なく機能するけれど、固定ページにbooksertタグを挿入した場合に、「カスタムフィールドがみつかりません。」というエラーが出て、本の情報が表示されない問題があることがわかりました。
また、その後固定ページでなく通常の投稿ページにアクセスした際にも、booksertタグのjavascriptとcssが読み込まれなくなり、タグにスタイルが適用されない状態になってしまいました。
booksertのプラグインを無効化して再度有効化したりしてみましたが改善しません。
プラグインをアンインストール/再インストールしてみましたがこれもだめでした。
現在、原因を調べています。