本プラグインを利用している方へお知らせです。
WordPress4.5にアップデートすると動作しない不具合がver.1.0.2に見つかりました。
アップデートの際は必ずプラグインを1.0.3へアップデートしてからWordPressをアップデートしてください。
とある案件で、投稿数が10万を軽く超え、カスタムフィールドテーブルの合計が1000万レコードに届くシステムを作ることになりました。
WordPressが適切かという意見はありそうですが、サイトなので、WordPressの強力な管理画面とプラグインを利用したかったわけです。
しかし、meta_queryが遅い!、1つのメタキーに条件をセットするだけで返ってくるのに1分かかります。これではサイトとして問題があるわけです。なぜ、遅いかというと、WordPressはカスタムフィールドの情報を1つのテーブルに縦に持っています(この表現で伝わってほしい!)
そこで、カスタムフィールドの情報を1post=1レコードのテーブルに展開してmeta_queryを高速化するプラグインを作ってみました。
使い方は簡単「meta accelerator」をいうプラグインを公式ディレクトリからインストール
https://wordpress.org/plugins/meta-accelerator/
有効化すると、メニューに「meta speedup」という項目が増えます。これを開くと、
こんな感じに、投稿タイプが縦に並んだ画面が表示されます。そこで、高速化したい投稿タイプの横の「create accelerator」をクリック(レコード数が多い場合はかなり待たされます。)、処理が終わると、下のようにボタンが変わります。
この状態で、高速化完了、上のボタンは「delete accelerator」が高速化対象から削除、「recreate accelerator」が高速化のためのテーブルを再作成してくれます。
やっていることは単純で
- 対象の投稿タイプの投稿を全検索して、カスタムフィールドを全て抽出、1投稿、1レコードの専用のテーブルを別に作成します。
- 上で作成したテーブルに対象の投稿タイプの投稿からカスタムフィールドを取り出して、insertします。
- 以後、カスタムフィールドを追加編集削除したり、投稿を追加した際に、上のテーブルを追加更新してゆきます。
- meta_query実行時にデフォルトのwp_postmetaテーブルではなく上のテーブルを利用するようにSQLを書き換えます。
これで、1分かかっていた処理が1秒に短縮されました!
注意点がいくつか有ります。
- 「create accelerator」中に投稿を追加したりカスタムフィールドが編集されると、その変更は反映されない場合があります。処理中は投稿や更新を行わないで下さい。
- 複数のpost_typeを対象にしたWP_Queryには対応していません。複数のpost_typeを選択した時点で、通常のmeta_queryになります。
- カスタムフィールドの値が配列(同じキーに複数の値がある)は、改行
カンマ区切りでフィールドに格納して処理されます。(完全な対応とはいえない感じです) - 生成したテーブルにインデックスは貼っていません。(将来は貼れるようにすることも考えていますが、横に展開すればレコード数はかなり減るはずなので必要なケースは少ないと思います)
WordPress3.9.1でしか検証していません。- ↑対象バージョンは公式プラグインページに更新していきます。
※後、あくまで自己責任でよろしくお願いします!
現在、確認しておりますが、
既に8時間ほど動きっぱなしですね・・・・。
ちょっと見守ってみます。
ちなみに、
新しくcsvimporter等でカスタムフィールドに格納する値を入れなおしても、
このacceleratorは毎回いちいち動かさないでも大丈夫なものでしょうか?
create処理は、レコード数次第なので、stepの表示が進んで行っているのであれば継続中だと思います。
「csvimporter」で試していないのですが、WordPressの関数を利用してカスタムフィールドを更新していれば、recreateしなくても自動でフィールドやデータを追加するようになっています。
stepの表示というのは、
読み込み中のマークでしょうか?
読み込み中のマークの左に
step:?/?の表記は出てないでしょうか?
このプラグインはクリエイト処理の際に
設定->表示の「1ページに表示する最大投稿数」づつ処理をするようになっており
長期間読み込み中だけの表示にはならないようになっています。
もし「step:?/?」の表示がされずに、読込マークが出たままの状態だとするとサーバー上の処理で何かトラブルが発生している可能性があります。
考えられるのは
・他のプラグインやテーマも含めて何かのロジック上でエラーが発生し処理が途中で止まってしまっている。
・1ページの件数が多すぎて処理中にPHPの実行時間のサーバー上での上限を超えてしまって強制停止されてしまった。(プラグイン内では一応タイムアウト時間は0(無制限)とセットしていますが、無制限の設定が許可されていないサーバーもあります)
などの原因で処理が止まっている可能性もあると思われます。
取り急ぎ調べる方法としては
・サーバー上のエラー等出ているか確認することが可能であればエラーの確認を行う。
・設定->表示の「1ページに表示する最大投稿数」の件数が多いのであれば少なく変更してみる。
といったことは可能でしょうか。
>読み込み中のマークの左に
>step:?/?の表記は出てないでしょうか?
一切現れない状況です。
>このプラグインはクリエイト処理の際に
>設定->表示の「1ページに表示する最大投稿数」づつ処理をするようになっており
>長期間読み込み中だけの表示にはならないようになっています。
>もし「step:?/?」の表示がされずに、読込マークが出たままの状態だとするとサーバー上の処理で何かトラブルが発生している可能性があります。
>考えられるのは
>・他のプラグインやテーマも含めて何かのロジック上でエラーが発生し処理が途中で止まってしまっている。
>・1ページの件数が多すぎて処理中にPHPの実行時間のサーバー上での上限を超えてしまって強制停止されてしまった。(プラグイン内では一応タイムアウト時間は0(無制限)とセットしていますが、無制限の設定が許可されていないサーバーもあります)
>などの原因で処理が止まっている可能性もあると思われます。
>取り急ぎ調べる方法としては
>・サーバー上のエラー等出ているか確認することが可能であればエラーの確認を行う。
>・設定->表示の「1ページに表示する最大投稿数」の件数が多いのであれば少なく変更してみる。
といったことは可能でしょうか。
サービス運用上、一ページに30件表示しており、各投稿にカスタムフィールドが600ほどあります。おそらくカスタムフィールドが多いあまり、止まっているのではないかと推察しますが、いかがでしょうか。
ひとまずブラウザを切って、再度クリエイトしてみます(中断でバグ等起こらないことを祈ります・・・)。
このプラグインはWordPress本体のpostやpostmetaは編輯しないので問題無いと思います。
念のため、現在のWordPressのバージョンを教えていただけますでしょうか。
> サービス運用上、一ページに30件表示しており、各投稿にカスタムフィールドが600ほどあります。おそらくカスタムフィールドが多いあまり、止まっているのではないかと推察しますが、いかがでしょうか。
それが直接の理由である可能性は低いと思います。
当方でもカスタムフィールド600近いサイトで利用していますが(投稿数はだいたい30万投稿くらい)
問題なく利用されております。サーバーのエラーを確認するすべはお持ちでしょうか?
WordPress 4.0.1
となります。
プラグイン、使用させて頂いております。
カスタムフィールドでの条件分岐で、sqlの読み込みに時間が非常にかかっていて困っていたので、すごく助かりました。
1つ気づいたのですが、「meta speedup」の管理画面を表示している時にphpの警告が出ています。
[PHP] Warning
[Error] Invalid argument supplied for foreach()
[Count] 3
[Location] wp-content/plugins/meta-accelerator/meta_accelerator_admin.php:42
[Call Stack]
meta_accelerator\meta_accelerator_admin()
meta_accelerator\meta_accelerator->meta_accelerator_admin()
do_action(‘toplevel_page_meta_accelerator_admin’)
[Component] Plugin: meta-accelerator
[PHP] Notice
[Error] Undefined index: attachment
[Count] 2
[Location] wp-content/plugins/meta-accelerator/class/posttype.php:478
[Call Stack]
meta_accelerator\Posttype->get_cols()
meta_accelerator\meta_accelerator_admin()
meta_accelerator\meta_accelerator->meta_accelerator_admin()
do_action(‘toplevel_page_meta_accelerator_admin’)
[Component] Plugin: meta-accelerator
動作上問題なさそうなのですが、心配なので、宜しければご確認して頂けたら嬉しいです。
宜しくお願い致します。
情報有難うございます。
ver. 0.6.6としてアップしました。
ありがとうございます!!!
プラグインにお世話になっております。
先日の1.0へのアップデート後にエラーで関連する投稿が表示されなくなってしまいました。
プラグインを古いものに戻したら表示されています。
エラーの内容は、
Unknown column ‘wp_meta_accelerator_post.post_id’ in ‘group statement’
というエラーをQuery Monitorで確認しました。
取り急ぎ、アップデートしなけば表示できているのですが、ご報告をと思いまして投稿いたします。
アップデート後に何かテンプレートの修正が必要だったりしますでしょうか?
表示されない箇所は、「WP_Query」で条件指定している部分でした。(他にもあるのかもしれないのですが、確認する前に戻してしまいまいした。)
お手数ですが、一度、ご確認していただけたらと思います。
よろしくお願いします。
WP_Queryの引数によって発生する事象かもしれないですね
もし差し支えなければ、WP_Queryを呼び出す際の引数を教えていただくことは可能でしょうか?
ネットへ記載はまずいようでしたら、お問い合わせフォームからでもかまいません。
また、カスタムフィールド名やポストタイプ名は適当な文字に変えていただいてかまいません。
お返事ありがとうございます。
問い合わせの方にメールさせていただきました!
よろしくお願いします!
情報ありがとうございます。旧バージョンとのアップデート再現を試みますので少しお時間ください。
お手数おかけいたします。
よろしくお願いします!
時間がかかって済みません。
1つのページ表示で複数のmeta_queryがあった場合に不具合が見つかったので修正いたしました。(1.0.1として公開)
発生されている事象がこれで改善するといいのですが、
もしまだ発生しているようでしたらお知らせください。
カスタムフィールド検索を高速化していただきありがとうございます。
大変有益なプラグインをご提供いただき助かっています。
さて、このプラグインは、Advanced Custom Fieldsとの相性はいかがでしょうか?
現在、併用しており、チェックボックスのフィールドを更新した際に、上手く高速化テーブルが更新されません。
Advanced Custom Fieldsのチェックボックスのデータの格納方法のためと思われるのですが、配列のところで配列の階層が想定と違うのが原因のようです。(1階層深い?)
もしご対応いただけると幸いです。
Advanced Custom Fieldsとの併用は非推奨とのことであれば申し訳ありません。
以上、ご確認のほどよろしくお願いいたします。
諸々コメントへの対応が遅れており恐縮です。
ACFについて(と申しますかフィールドが配列で複数保持されるケース)については、
記載いただいたとおり、現在のところ対応できておりません。
ACFで個別検証は行っていないのですが、深い階層でも展開して検索くらいは利用できるように
していきたいと考えておりますが、すこし時間がかかりそうです。
お世話になります。
ACFに関連してですが、Smart Custom Fieldsへのご対応も可能でしたらお願い致します。
お世話になっております。
Wordpress4.5 テーマTwenty Fifteenでインストールした所「投稿→カテゴリー」を押した際に下記のエラーが発生いたしました。
他のプラグインはすべて停止した状態です。
原因がわかりましたらご教示ください。
Fatal error: Call to a member function get_clauses() on null in /~~~/wp-content/plugins/meta-accelerator/meta-accelerator.php on line 313
追記ですが、カテゴリ以外にも「投稿」を押して一覧を表示する際にもエラーが発生いたしました。
ご連絡ありがとうございます。
すみません、まだ、WordPress4.5への対応が追いついていないため
もうしばらくお待ちください。4.4以下を現在ご利用の方は、
4.5へはアップデートをまだしないようにお願いします。
修正版の1.0.3をアップしました。
お忙しい中、素早いご対応ありがとうございます。
はじめまして。
投稿数が50万件、1つの記事にカスタムフィールドが20件、
各カスタムフィールドの組み合わせで絞込み検索を実装、このようなサイトを作ろうと思うのですが、
負荷がどの程度のものなのか分からず、おそらくそのまま実装したらタイムアウトするレベルだと思うのですが、このプラグインを使用すれば問題なく運用できるでしょうか?(アクセスやサーバーのスペックにもよると思うのですが、1秒以内に検索結果が返ってくるのが理想)
50万件、カスタムフィールドが50万×20件くらいであれば、サーバーのスペックによってはそのままでもさほど遅くはならないケースもあると思いますので、一度検証可能なら検証されるのが良いとは思います。
環境などにも依存しますが、このプラグインは通常postmetaテーブルに縦に持つカスタムフィールドを1行1投稿の横に長い表に置き換えて検索速度を上げます。(レコード数が少ないと逆に遅くなることもある)
以前利用したケースでは1分かかる処理が1秒に短縮されたことがありました、ただ、サーバーの環境やDBのチューニング(必要であれば手動でインデックスを作成するなど)にもよるため早くなるかや問題無いかどうかは検証された方が良いと思います。
また、このプラグインはGPLで公開しており、利用によるあるいはそれに関係して発生したいかなる
損害についても制作者は責任を負いません。
このため、ご自身で検証の上のご利用をお願いいたします。
返信ありがとうございます。
分かりました。サイトを構築してから実装してみます。
いつも「Meta Accelerator」にお世話になっております。
現在、WP4.8を使用しているのですが、プラグイン最新版の「バージョン 1.0.4」にしたところ、
meta_queryでソートしたループの後、wp_reset_postdata()を行った後の他のループがすべて表示されなくなってしまいました。
Query Monitorで確認したところ、データベースエラーが出ていました。
WPのバージョンが問題なのでしょうか?
お知恵をお借りできましたら幸いです。
よろしくお願いします。