ようやく制作中のWebサイト『AmaPro』の終わりが見えてきました。
最初は結構頑張ってたのですが、ここ最近はコード書くのに飽きてきてダラダラだったのですが、主要の部分はホボ書き終わったかな?って感じです。
で、また何かで今回のような組み方をする事もあると思うから大切なトコロのメモ。
自作テーブルを記事と連動させる
今回みたいに、データの統計とかやるとWordpressのデータベース構造だと恐らく『postmeta』テーブルに入れてく事になるんだと思う。
でも、それだとドンドン レコード数が増えて行くわけですよね。
膨大なデータを扱ってるSE達のLOGを読むと結構入れても頑張るらしいのですが、少しずつ遅くなるのは間違いないだろうし、気持ち悪いなー と思って結局専用のテーブルを作る事にしたワケです。
というか、最初からそーしろ!! と言われそうな事ですが・・・。
で、専用のテーブルを作っちゃうと、色々連動しなくなるから自分で諸々コード書かないといけないのでそのメモ。
記事への読み込み
こんなのはメモるまでも無いんだけど、一応。
global $wpdb; $table_name = $wpdb->prefix . '*テーブル名*'; $where = $wpdb->prepare("id = %d",$id); $get = $wpdb->get_results("SELECT * FROM $table_name WHERE $where"); return $getamameta;
関数にして、idと引っ掛けて出力するようにしたけど、もしかすると何処かにフックさせられるのかも知れないと今思いました。
良い感じで引っ掛ければ自動的にObject Cacheも使えるんだろうか??
Object Cacheは後で調べようと思ってるけど、後で・・・。
where句を分けて書いてるのはメモだからです。
並び替えや、絞込みの連動
メモしておきたかったのはコレ。
postmetaテーブルにあれば、pre_get_postsで並び替えとか絞込みが簡単だけど、専用テーブルだとそうもいかない。
でも、やっぱりWordpress。
とても便利なhookがあるんですね。
join
function my_join( $join, $wp_query ) { if( !empty($wp_query->query['hoge']) ) { global $wpdb; $table_name = $wpdb->prefix . '*テーブル名*'; $join .= " INNER JOIN {$table_name} ON {$wpdb->posts}.ID = {$table_name}.*カラム名* "; } return $join; } add_filter('posts_join', 'my_join', 10, 2);
$wp_queryに配列を渡してあげて分岐。
あとはテーブルをJOIN。
orderby
function my_orderby( $orderby ) { if( **** ) { global $wpdb; $table_name = $wpdb->prefix . '*テーブル名*'; return $table_name.".*カラム名*+0 ASC"; } return $orderby; } add_filter('posts_orderby', 'my_orderby' );
必要があればposts_orderbyに。
where
function my_where( $where, $wp_query ){ global $wpdb; $table_name = $wpdb->prefix . '*テーブル名*'; if( !empty($wp_query->query['hoge']) ){ $where .= $wpdb->prepare(" AND (CAST({$table_name}.*カラム名* AS SIGNED) >= %d)", $wp_query->query['hoge'] ); } return $where; } add_filter('posts_where', 'my_where', 10, 2);
posts_whereに引っ掛ける時も$wp_queryに配列渡せばOK。
もっと面倒になると思ったけど、そんなでも無かった。
記事の削除も連動
function my_admin_init() { add_action( 'delete_post', 'my_dbdell_sync', 10 ); } add_action( 'admin_init', 'my_admin_init' ); function my_dbdell_sync( $pid ) { global $wpdb; $table_name = $wpdb->prefix . '*テーブル名*'; if ( $wpdb->get_var( $wpdb->prepare( 'SELECT id FROM '.$table_name.' WHERE id = %d', $pid ) ) ) { $wpdb->query( $wpdb->prepare( 'DELETE FROM '.$table_name.' WHERE id = %d', $pid ) ); } }
上では『id』で消してる。
ダッシュボードから記事を削除で同じidを持ったデータを削除。
wp-cronで動いているときは、ちゃんと記事が消えてからデータも消えるように設定しておいた。
更新系も良い
コードは書かないけど、$wpdb->updateも大変使い易い。
やってみて気が付いたけど、ほんの少し面倒になるだけで酷く苦しむワケじゃなかったので、最初からこーしておけば良かった。
教訓です。
ではでは