WordPressのBlog Optionをまとめて取得する
February 2 2012, 4:23am
WordPressをマルチサイトで動かしていると、wp_optionsテーブルがブログ単位で作成されるので、まとめて設定内容を確認したいときに、めっさ面倒くさい。なので、まとめて設定値を取得できるストアドプロシージャを書いてみました。
call sp_get_blog_options('dbname', 'option_name', 0);
引数は 1)データベース名 2)取得したいoption_name値 3)group byするかどうかフラグ(0=しない,1=する) の3つです。
ブログで使われているブログテンプレートを集計したい場合は
call sp_get_blog_options('wordpress', 'template', 1);
とすれば、各テンプレートの利用数を取得できます。最後の引数を0にするとblog_idとoptions_valueをそのままダンプします。
PHPで呼び出す場合は$wpdb->get_results()やmysql_query()ではエラーになるので注意してください。呼び出す場合はmysqli_query()で。あと、information_schemaにアクセスできるDBアカウントで実行するのもお忘れ無く。
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_get_blog_options $$
CREATE PROCEDURE sp_get_blog_options(
IN db_name varchar(100),
IN option_value varchar(100),
IN summary_flag int
)
BEGIN
DECLARE not_found int DEFAULT 0;
DECLARE _blog_id bigint(20);
DECLARE _table_name varchar(100);
DECLARE _get_table_name varchar(100);
DECLARE cur CURSOR FOR SELECT blog_id FROM wp_blogs WHERE spam 1;
DECLARE cur2 CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name = _table_name AND table_schema = db_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;
DROP TABLE IF EXISTS tmp_options;
CREATE TEMPORARY TABLE tmp_options (blog_id bigint(20), option_value varchar(50));
OPEN cur; loop1: LOOP FETCH cur INTO _blog_id; IF not_found THEN CLOSE cur; LEAVE loop1; END IF;
OPEN cur2;
SET _table_name = CONCAT('wp_', _blog_id, '_options');
FETCH cur2 INTO _get_table_name;
IF not_found THEN
SET not_found = 0;
ELSE
SET @s = CONCAT('SELECT option_value INTO @option_value FROM `wp_', _blog_id, '_options` WHERE option_name=?');
PREPARE stmt FROM @s;
SET @val = option_value;
EXECUTE stmt USING @val;
DEALLOCATE PREPARE stmt;
INSERT INTO tmp_options VALUES (_blog_id, @option_value);
END IF;
CLOSE cur2;
END LOOP; IF summary_flag THEN SELECT tmp_options.option_value, count(tmp_options.option_value) AS counter FROM tmp_options GROUP BY tmp_options.option_value ORDER BY count(tmp_options.option_value); ELSE SELECT * FROM tmp_options; END IF; END $$
DELIMITER ;
- Tags:
- Programming

